我在Android上使用Retrofit(如使用Retrofit)上的证书锁定就像在OkHttp3
docs(把错误的值 - >得到异常 - >放置期望值)中说的那样。证书锁定在Android上
但是,如果我决定旋转服务器证书,如何获取这些值用于固定。
例如:我有证书'X',并且此证书将在两个月内轮换,证书为'Y'。很明显,我必须在Google Play上更新我的应用程序,并添加新的哈希以锁定新证书。那么,如果我目前只能从异常中获得这些散列,那我该如何做呢?
我在Android上使用Retrofit(如使用Retrofit)上的证书锁定就像在OkHttp3
docs(把错误的值 - >得到异常 - >放置期望值)中说的那样。证书锁定在Android上
但是,如果我决定旋转服务器证书,如何获取这些值用于固定。
例如:我有证书'X',并且此证书将在两个月内轮换,证书为'Y'。很明显,我必须在Google Play上更新我的应用程序,并添加新的哈希以锁定新证书。那么,如果我目前只能从异常中获得这些散列,那我该如何做呢?
当你有几个选择时,首先你不必钉住叶证书,而是可以固定到中间证书或根证书,这样你应该继续使用相同的可信认证机构你的应用程序将继续工作而不改变。
当然,没有什么能阻止你在你的应用程序中定义多个针脚,以实现我认为你想要的无缝证书旋转。
可以使用bash脚本,如下面的检索引脚:
#!/bin/bash
certs=`openssl s_client -servername $1 -host $1 -port 443 -showcerts </dev/null 2>/dev/null | sed -n '/Certificate chain/,/Server certificate/p'`
rest=$certs
while [[ "$rest" =~ '-----BEGIN CERTIFICATE-----' ]]
do
cert="${rest%%-----END CERTIFICATE-----*}-----END CERTIFICATE-----"
rest=${rest#*-----END CERTIFICATE-----}
echo `echo "$cert" | grep 's:' | sed 's/.*s:\(.*\)/\1/'`
echo "$cert" | openssl x509 -pubkey -noout |
openssl rsa -pubin -outform der 2>/dev/null |
openssl dgst -sha256 -binary | openssl enc -base64
done
然后用./certs.sh www.appmattus.com
运行,尽管该脚本将不打印出来的根证书。
或者看看https://github.com/scottyab/ssl-pin-generator,在调试中运行该工具,以便知道您的固定的证书!
有关Android上SSL固定的更多详细信息,我写了以下文章:Android Security: SSL Pinning