我在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