天天看點

關于 APP 預埋檢查政策優化

背景

在 APP 海量時代,很多APP 都進行過證書預埋檢查功能設定。當預埋的APP 更新伺服器端證書時,發現部分客戶出現證書更新之後,APP 無法正常通信等情況出現。經過技術排查發現由于APP 中進行了證書預埋檢查,并預埋了伺服器證書(公鑰)檔案等資訊,導緻證書更新後新證書無法通過 APP 預埋檢查驗證,提示網絡中止連接配接。

如果你的 APP 做了以下的預埋,都會存在隐患:

1.在APP 中預埋了伺服器證書(公鑰)做證書檢查

2.在APP 中預埋了伺服器證書的指紋值做證書檢查

3.在APP 中預埋了中級證書檔案或者根證書檔案做證書檢查

4.在APP 中預埋了中級證書指紋值或者根證書指紋值做證書檢查

證書預埋檢查隐患

1.伺服器證書(公鑰)存在有效期限制,目前最高 3 年有效期,未來 CA/B 組織會逐漸縮短證書最長生命周期。如果将伺服器證書進行 APP 預埋證書檢查,當伺服器證書因為生命周期終止導緻證書更新時,經過預埋的 APP 會出現無法正常通信等情況。

2.根證書和中級證書也會存在失效、政策變更或者過期,如果将根證書或者中級證書進行

APP 預埋,一旦根證書和中級證書發生了更新,經過預埋的 APP 會出現無法正常通信等情況。雖然在大多數情況下,檢查機制能夠防禦中間人攻擊。因為當黑客竊聽通信時,他提供

的攔截證書多為自簽名證書,TrustManager 不能識别這個證書,于是拒絕 HTTPS 連接配接。但是,一旦預埋的這張證書由于證書生命周期的終止,觸發伺服器端進行證書更新替換機制時, APP 應用端将無法驗證請求證書的有效性,進而導緻業務中斷。

建議

為了 APP 業務靈活性和可續性,天威建議使用系統預設的系統信任庫來做證書認證, 并且開啟域名強驗證來增強 APP 安全性。

對伺服器證書域名進行強校驗(僅供開發人員參考):

關于 APP 預埋檢查政策優化

實作 HostnameVerifier 的 verify()方法:

關于 APP 預埋檢查政策優化

由于 SSL 證書本身存在生命周期基本屬性,加上中級 CA 和根證書存在可變更的因素, 一旦應用中添加了證書檢查功能之後,在後期業務發展過程中勢必會帶來不可預估的影響。

建議在安全政策允許的情況下取消證書檢查功能,改為使用系統自帶信任庫方式驗證,并配合使用其他比如域名強驗證,使用 Proguard 混淆代碼,使用編譯庫等手段來確定APP 安全。

TLS/SSL 證書鍊

保證通信安全至少要使用 HTTPS 協定,也就是說使用安全傳輸層協定(TLS)或是它的前身安全套接層協定(SSL)加密的通信。

SSL 證書鍊結構關系

公網可信 SSL 證書(至少)包括三個證書:

1、根證書:這是由證書認證機構(CA)頒發的,也就是一個可以確定整個通信時安全的值得信任的組織。

2、中級證書:一個根證書下有多個中級證書。它們建立伺服器證書和根證書的信任橋梁,是連接配接伺服器證書和根證書的證書鍊,由根證書簽名的證書。

3、伺服器證書:伺服器證書是綁定最終請求域名的證書,為最終的加解密證書檔案。

證書檢查

1、Certificate Pinning

其實 Certificate Pinning 是 OkHttp 實作的一個類似于 HPKP 的技術,目的是為了使用戶端可以有主動的信任CA 的權利,它的工作原理就是使用預先設定的證書指紋和伺服器傳過來的證書鍊中的證書指紋進行比對,隻要有任何一對指紋比對成功,則認為是一次合法的連接配接,否則禁止本次連結。

2、預埋證書

把數字證書以檔案或者字元串的形式寫在本地,在 SSL 握手的時候用本地預埋的證書和伺服器傳過來的證書進行比對,如果比對不成功則禁止本次通信。

Certificate Pinning 和預埋證書做法的比較(以 OkHttp 為例)

3、預埋證書的寫法

首先定義一個類實作類實作 X509TrustManager 接口,實作對用戶端證書鍊的校驗方法和服務端證書鍊的校驗方法,不寫的話表示不做任何校驗,預設信任所有證書鍊中的證書。

關于 APP 預埋檢查政策優化

由于證書存在生命周期和可變性,證書更新和證書鍊變更都會導緻這種預埋失效,進而帶來業務中斷風險。

Certificate Pinning 的寫法

範例代碼:

關于 APP 預埋檢查政策優化

pinner 就是證書指紋,sha256 表示的是哈希值得一種算法,pinner 也可以是 sha1/* , 具體 pinner 要根據購買證書所支援的配置,證書指紋可以在證書詳細資訊中點選檢視。在SSL 握手的時候,會檢查配置中的指紋和服務端傳過來的證書證的指紋是否相比對,隻要有一個指紋比對,則進行下一步,否則直接抛出異常,禁止本次連接配接。

證書在使用過程中會存在不可避免的證書續期和替換更新,每次操作都會導緻證書的指紋發現不可逆的變化,一旦使用了 Certificate Pinning 方式,都會在證書更新之後帶來業務中斷等情況。

繼續閱讀