Sau*_*thi 3 ssl android ssl-certificate retrofit2 certificate-pinning
我想在 android 应用程序中进行证书固定。我对理解这一点感到非常沮丧。请帮我
我拥有的:-
我没有将实施此证书的域名。我只有IP地址。我在我的项目中使用 okHttp 和改造。我在堆栈溢出中看到了许多示例来实现这一点。
但我没有得到一些东西:- 1. 如果我没有域名,是否可以将 ssl 实现为 IP 地址?2. pin字段包含什么,我没有任何私钥。我在哪里可以找到私钥(sha256/XXXXXXXXXX)?
Retrofit provideRetrofit(OkHttpClient okHttpClient, Gson gson) {
CertificatePinner certPinner = new CertificatePinner.Builder()
.add("patternField","pins")
.build();
OkHttpClient okHttpClientForPinning = new OkHttpClient.Builder()
.certificatePinner(certPinner)
.build();
OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder();
try {
clientBuilder.sslSocketFactory(getSSLConfig(context).getSocketFactory());
}
catch (Exception e) {
e.printStackTrace();
}
clientBuilder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
boolean value = true;
//TODO:Some logic to verify your host and set value
return value;
}
});
return new Retrofit.Builder()
.baseUrl(backendUrl)
.client(okHttpClient)
.client(okHttpClientForPinning)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
}
Run Code Online (Sandbox Code Playgroud)
我没有将实施此证书的域名。我只有IP地址。
要通过 IP 地址获取服务器证书的 pin,您可以尝试以下 bash 脚本:
#!/bin/bash
# Heavily inspired on:
# * https://medium.com/@appmattus/android-security-ssl-pinning-1db8acb6621e#ecea
set -eu
Main()
{
local domain="${1? Missing domain name to extract and hash the certificate public key !!!}"
local domain="${domain##*://}"
local certs=$( openssl s_client -servername "${domain}" -host "${domain}" -port 443 -showcerts </dev/null 2>/dev/null | sed -n '/Certificate chain/,/Server certificate/p' )
local rest=$certs
while [[ "$rest" =~ '-----BEGIN CERTIFICATE-----' ]]; do
cert="${rest%%-----END CERTIFICATE-----*}-----END CERTIFICATE-----"
rest=${rest#*-----END CERTIFICATE-----}
local certificate_name="$( echo "$cert" | grep 's:' | sed 's/.*s:\(.*\)/\1/' )"
if [ -n "${certificate_name}" ]; then
printf "\nCERTIFICATE NAME:\n\n${certificate_name} \n\n"
fi
printf "\nCERTIFICATE PUBLIC KEY HASH:\n\n"
echo "$cert" |
openssl x509 -pubkey -noout |
openssl rsa -pubin -outform der 2>/dev/null |
openssl dgst -sha256 -binary |
openssl enc -base64
echo
exit 0
done
}
Main ${@}
Run Code Online (Sandbox Code Playgroud)
将 bash 脚本保存到一个文件中并像这样调用它:
bash hash-certificate-public-key-from-domain.bash ip-address-here
Run Code Online (Sandbox Code Playgroud)
在我的个人网站上使用它的真实例子:
??exadra37@exadra37-Vostro-470 ~/Developer/Approov/currency-converter-demo ‹volley-pinning-with-approov_cleanup-proguard*›
??? ./bin/hash-certificate-public-key-from-domain.bash 68.183.252.187 130 ?
CERTIFICATE NAME:
CN = exadra37.com
CERTIFICATE PUBLIC KEY HASH:
1O0wDRM/roe6UTctDVQ5aN/ASNYsGQFVzXYhO34t5GE=
??exadra37@exadra37-Vostro-470 ~/Developer/Approov/currency-converter-demo ‹volley-pinning-with-approov_cleanup-proguard*›
??? ./bin/hash-certificate-public-key-from-domain.bash exadra37.com
CERTIFICATE NAME:
CN = exadra37.com
CERTIFICATE PUBLIC KEY HASH:
1O0wDRM/roe6UTctDVQ5aN/ASNYsGQFVzXYhO34t5GE=
??exadra37@exadra37-Vostro-470 ~/Developer/Approov/currency-converter-demo ‹volley-pinning-with-approov_cleanup-proguard*›
??? ./bin/hash-certificate-public-key-from-domain.bash https://exadra37.com
CERTIFICATE NAME:
CN = exadra37.com
CERTIFICATE PUBLIC KEY HASH:
1O0wDRM/roe6UTctDVQ5aN/ASNYsGQFVzXYhO34t5GE=
Run Code Online (Sandbox Code Playgroud)
如您所见,引脚的哈希值1O0wDRM/roe6UTctDVQ5aN/ASNYsGQFVzXYhO34t5GE=始终相同。
- pin 字段包含什么,我没有任何私钥。我在哪里可以找到私钥(sha256/XXXXXXXXXX)?
私钥是私有的,因此如果您能找到它,那么所有的安全性都会丢失,除非您还控制要连接的服务器。无论如何,您不需要它来执行证书固定,只需根据证书的公钥固定,通过生成它的散列,也就是一个 pin,就像上面的 bash 脚本一样。
所以sha256你正在寻找的是上面脚本中引脚的输出,也就是在我的例子中1O0wDRM/roe6UTctDVQ5aN/ASNYsGQFVzXYhO34t5GE=。
虽然我不知道如何帮助您进行改造,但我可以向您展示一种更简单的固定方式。
现在对于 Android 来说,存在一种更简单的方法,我在我的博客文章Securing HTTPS With Certificate Pinning 中进行了描述,您可以在其中了解到只需将证书 pin 添加到网络安全配置文件即可完成,或者如果您需要支持API 级别 24 以下,那么您可能希望将TrustKit包与该文件结合使用。
实施例network_security_config.xml与TrustKit:
bash hash-certificate-public-key-from-domain.bash ip-address-here
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5473 次 |
| 最近记录: |