8

在我的 iPhone 应用程序中,我使用https带有自签名SSL证书的连接从服务器下载敏感数据(用户名和密码)。

此应用程序仅供私人使用,不适用于生产。

AFNetworking用来管理https连接,但是,由于我的证书不是从 CA 签名的,为了使它工作,我必须将以下内容添加到AFURLConnectionOperation类的标题中:

#define _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ 1

但是有了这个我的应用程序将允许任何证书。

有没有办法只允许来自我的服务器的证书可能将其捆绑在应用程序中并将其与服务器在 https 连接中提供的证书进行比较?如果可能的话,在安全性方面会有什么显着优势吗?

我对安全性很陌生,我有点困惑。

4

2 回答 2

21

您要查找的术语是SSL Pinning,应用程序会在其中验证已知证书或公钥是否与远程服务器提供的证书或公钥匹配。

AFNetworking 支持使用证书或公钥进行固定。您需要将证书或公钥添加到应用程序的 Bundle 中,并通过设置defaultSSLPinningModeAFHttpClient 上的SSLPinningMode属性或AFURLConnectionOperation.

您可以使用AFSSLPinningModePublicKey或固定AFSSLPinningModeCertificateAFSSLPinningModeCertificate意味着服务器的证书必须与捆绑包中的证书之一完全匹配。

AFSSLPinningModePublicKey更自由,意味着服务器的证书必须匹配捆绑包中的任何公钥,或捆绑包中证书附加的任何公钥。

AppDotNet 示例中有一个设置固定模式的示例

于 2013-05-17T09:59:10.627 回答
8

稍微扩展一下 David 关于AFSSLPinningModePublicKeyvs的答案AFSSLPinningModeCertificate。理想情况下,您将固定公钥而不是证书。这是因为某些网站和服务(例如 Google)每 30 天左右轮换一次证书。但是他们重新认证了相同的公钥。

证书会经常轮换,以保持 CRL 的大小对于移动客户端来说很小。但是他们重新认证相同的公钥(而不是创建一个新的)以允许密钥连续性测试。

公钥固定是Certificate Patrol等工具未达标的原因。证书预计会发生变化;公钥不是。

StrictHostKeyChecking如果您熟悉的话,公钥固定很像 SSH 。

OWASP 在Certificate and Public Key Pinning也有一篇文章。

于 2014-06-27T22:56:56.700 回答