前言

本方案不會導致證書更換時候APP停服。

因為:

  1. APP不做證書完整校驗。只做公鑰校驗;
  2. 伺服器續費證書時候,不更換私鑰,所以公鑰不變動;客戶端可以繼續認可新版證書。

本方案的收益:

  1. 證書可以續費,可以和WEB端業務走同一個域名。
  2. APP一旦走了抓包(HTTPS的抓包),將會產生一個臨時證書,與內置的公鑰摘要不匹配,將會直接報錯。很大程度上保證了APP的API請求不被截獲篡改。再結合一些混淆服務,讓dex文件不可讀,API業務對接不做任何驗簽加密即可用於生產,減少研發投入。

在前面 為什麼不推薦APP使用SSL-PINNING? 這篇文章,筆者提到了APP的證書校驗的幾種方式:

  1. 不校驗
  2. 系統信任證書校驗
  3. 公鑰校驗 ssl public key pinning
  4. 證書全內容校驗 ssl certificate pinning

筆者推薦2和3兩種。在我最近做的項目採取了第3種方案。

本篇和接下來的2篇文章將詳解在真實生產項目中,我和同事對接詳細流程和一些可復用的經驗。

準備工作

1. SSL伺服器證書。如果還沒有採購證書,申請即可。我推薦lets encrypt證書(90天一續期)。申請方式見 imququ.com/post/letsenc

流程

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. gist.github.com/StevenM

3. CertificatePinner (OkHttp 3.10.0 API)


推薦閱讀:
相關文章