APP優雅進行SSL證書校驗——(一)伺服器篇
前言
本方案不會導致證書更換時候APP停服。
因為:
- APP不做證書完整校驗。只做公鑰校驗;
- 伺服器續費證書時候,不更換私鑰,所以公鑰不變動;客戶端可以繼續認可新版證書。
本方案的收益:
- 證書可以續費,可以和WEB端業務走同一個域名。
- APP一旦走了抓包(HTTPS的抓包),將會產生一個臨時證書,與內置的公鑰摘要不匹配,將會直接報錯。很大程度上保證了APP的API請求不被截獲篡改。再結合一些混淆服務,讓dex文件不可讀,API業務對接不做任何驗簽加密即可用於生產,減少研發投入。
在前面 為什麼不推薦APP使用SSL-PINNING? 這篇文章,筆者提到了APP的證書校驗的幾種方式:
- 不校驗
- 系統信任證書校驗
- 公鑰校驗 ssl public key pinning
- 證書全內容校驗 ssl certificate pinning
筆者推薦2和3兩種。在我最近做的項目採取了第3種方案。
本篇和接下來的2篇文章將詳解在真實生產項目中,我和同事對接詳細流程和一些可復用的經驗。
準備工作
1. SSL伺服器證書。如果還沒有採購證書,申請即可。我推薦lets encrypt證書(90天一續期)。申請方式見 https://imququ.com/post/letsencrypt-certificate.html
流程
1. 提取證書的公鑰
openssl rsa -in certificate.crt -pubout > public_key.pub
2. 將 public_key.pub
內的 ---begin public key---
和 ---end public key---
去除,併合並成一行
cat public_key.pub | grep -v PUBLIC | awk {printf("%s",$0)}
得到的輸出類似
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMI...
3. 利用2命令輸出的結果,然後 計算sha256摘要 (下載pubkey-sha256.py)
python pubkey-sha256.py MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMI...
得到的輸出類似
SHA256:S8Ff3JCaO4V...
將開頭的 SHA256:
改成 sha256/
,得到
sha256/S8Ff3JCaO4V...
將此字元串給到安卓和iOS端,並按照後續文章進行編碼:
後續
1. APP優雅進行SSL證書校驗——(二)安卓篇
2. APP優雅進行SSL證書校驗——(三)iOS篇 [文章未完成]
參考及引用
1. 如何正確設定 AFNetworking 的安全連線 ? Nelson 寫些 iOS 開發的東東
2. https://gist.github.com/StevenMaude/f054064ede8c9e781ed8
3. CertificatePinner (OkHttp 3.10.0 API)
推薦閱讀: