Android上的证书固定

时间:2017-05-05 06:25:10

标签: android security ssl pinning

我在Android上使用证书固定(使用Retrofit),就像在1. Right click diagram area 2. At menu bar select "Database Diagram" >> "Copy diagram to Clipboard" 3. Open MS Word and past it. docs中所说的那样(放错了值 - >得到异常 - >放置预期值)。

但是,如果我决定旋转服务器证书,如何获取这些固定值。

例如:我有证书'X',这个证书将在证书'Y'的两个月内轮换。显然,我必须在Google Play上更新我的应用并添加新的哈希以固定新证书。那么如果目前我只能从异常中获取这些哈希值,我怎么能这样做呢。

1 个答案:

答案 0 :(得分:0)

当固定你有几个选项时,首先你不必固定叶子证书,而是可以固定到中间证书或根证书,这样你应该继续使用相同的可信证书颁发机构你的应用程序将继续无变化地工作。

当然,没有什么能阻止你在你的应用程序中定义多个引脚来进行无缝证书轮换,我认为这是你想要的。

您可以使用以下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