如何使用AFNetworking比较SSL证书

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

这个应用程序仅供私人使用,并不意味着生产。

我正在使用AFNetworkingpipe理https连接,但是,由于我的证书没有从CA签名,为了使其工作,我不得不添加以下内容到AFURLConnectionOperation类的头部:

 #define _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ 1 

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

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

我对安全非常陌生,我有些困惑。

您正在寻找的术语是SSL固定 ,其中应用程序validation已知证书或公钥与远程服务器提供的证书或公钥相匹配。

AFNetworking支持使用证书或公钥的固定。 您需要将证书或公钥添加到应用程序的Bundle中,并通过设置AFHttpClient上的defaultSSLPinningMode属性或SSLPinningMode上的SSLPinningMode属性来启用该function。

您可以使用AFSSLPinningModePublicKeyAFSSLPinningModeCertificateAFSSLPinningModeCertificate意味着服务器的证书必须与包中的证书完全匹配。

AFSSLPinningModePublicKey更为宽松,意味着服务器的证书必须与该包中的任何公钥或绑定到证书中的任何公钥相匹配。

在AppDotNet示例中有一个设置钉扎模式的例子。

关于AFSSLPinningModePublicKeyAFSSLPinningModeCertificate关于David的回答扩大一点。 理想情况下,您将固定公钥而不是证书。 这是因为有些网站和服务(如Google)每隔30天左右轮换一次证书。 但他们重新authentication相同的公钥。

证书经常轮换,以保持移动客户端的CRL的大小。 但他们重新authentication相同的公钥(而不是创build一个新公钥),以便进行关键的连续性testing。

公钥固定是为什么证书巡视等工具会错过标记。 证书有望改变; 公钥不是。

公钥固定就像SSH的StrictHostKeyChecking ,如果你熟悉的话。

OWASP在证书和公共密钥固定上也有logging 。