2013-05-17 17 views
8

在我的iPhone應用程序中,我使用https連接和自簽名SSL證書從服務器下載敏感數據(用戶名和密碼)。如何比較使用AFNetworking的SSL證書

此應用程序僅供私人使用,不適用於生產。

我使用AFNetworking管理https連接,但是,因爲我的證書不是由CA簽名,以使其工作,我不得不添加以下到AFURLConnectionOperation類的頭:

#define _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ 1 

但與此我的應用程序將允許任何證書。

有沒有辦法讓我的服務器只有證書可能捆綁在應用程序中,並將其與服務器在https連接中提供的證書進行比較? 如果可能的話,在安全性方面會有什麼顯着的優勢嗎?

我對安全非常陌生,而且我有點困惑。

回答

21

您要查找的術語是SSL固定,應用程序驗證已知證書或公鑰是否與遠程服務器提供的證書或公鑰匹配。

AFNetworking支持使用證書或公鑰的固定。您需要將證書或公鑰添加到應用的Bundle中,並通過設置AFHttpClient上的defaultSSLPinningMode屬性或AFURLConnectionOperation上的SSLPinningMode屬性來啓用該功能。

您可以使用AFSSLPinningModePublicKeyAFSSLPinningModeCertificate進行固定。 AFSSLPinningModeCertificate表示服務器的證書必須與包中的證書完全匹配。

AFSSLPinningModePublicKey更爲寬鬆,意味着服務器的證書必須與捆綁中的任何公鑰或捆綁在證書中的任何公鑰相匹配。在AppDotNet示例中有example of setting the pinning mode

+0

謝謝你指點我在正確的方向。這樣做有沒有任何重要的安全優勢? – BigLex

+1

SSL固定爲MITM攻擊和受影響的CA提供了額外的保護。這裏有一些見解(http://blog.lumberlabs.com/2012/04/why-app-developers-should-care-about.html)。 –

+0

正是我期待的!最後一個問題,我需要以某種方式設置證書文件,AFNetworking Library應該將證書文件與服務器提供的證書進行比較,否則圖書館會自行找到證書文件? – BigLex

7

擴大一點大衛的回答關於AFSSLPinningModePublicKeyAFSSLPinningModeCertificate。理想情況下,您將固定公鑰而不是證書。這是因爲一些網站和服務(例如Google)每30天左右輪換一次證書。但他們重新認證相同的公鑰。

證書經常輪換以保持移動客戶端的CRL的大小。但是他們重新認證相同的公鑰(而不是創建一個新公鑰),以便進行關鍵的連續性測試。

公鑰固定是爲什麼像Certificate Patrol這樣的工具錯過標記。該證書預計會改變;公鑰不是。

如果您熟悉SSH,公鑰密碼與SSH的StrictHostKeyChecking很相似。

OWASP在Certificate and Public Key Pinning也有關於它的報導。