在我的iPhone应用程序中,我使用https
连接和自签名SSL
证书从服务器下载合理数据(用户名和密码)。
此应用仅供私人使用,不适合制作。
我正在使用AFNetworking
来管理https
连接,但由于我的证书未从CA签名,为了使其正常工作,我必须将以下内容添加到标题中AFURLConnectionOperation
类:
#define _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ 1
但有了这个,我的应用程序将允许任何证书。
是否有办法只允许来自我服务器的证书将其捆绑在应用程序中,并将其与https连接中服务器提供的证书进行比较? 如果可能的话,在安全方面会有任何明显的优势吗?
我对安全性很新,我有点困惑。
答案 0 :(得分:21)
您正在寻找的术语是 SSL Pinning ,其中应用程序验证已知证书或公钥是否与远程服务器提供的证书或公钥匹配。
AFNetworking支持固定证书或公钥。您需要将证书或公钥添加到应用程序的Bundle中,并通过设置AFHttpClient上的defaultSSLPinningMode
属性或{{1}上的SSLPinningMode
属性来启用该功能。 }}
您可以使用AFURLConnectionOperation
或AFSSLPinningModePublicKey
进行固定。 AFSSLPinningModeCertificate
表示服务器的证书必须与捆绑中的证书完全匹配。
AFSSLPinningModeCertificate
更自由,意味着服务器的证书必须与捆绑中的任何公钥匹配,或者捆绑中的证书附加的任何公钥。
AppDotNet示例中有example of setting the pinning mode。
答案 1 :(得分:7)
关于大卫对AFSSLPinningModePublicKey
与AFSSLPinningModeCertificate
的回答,请稍微提一下。理想情况下,您需要固定公钥而不是证书。这是因为某些网站和服务(如Google)每30天左右轮换一次他们的证书。但他们重新认证了同一个公钥。
经常轮换证书,以便为移动客户端保持较小的CRL大小。但是他们重新认证相同的公钥(而不是创建一个新公钥)以允许进行密钥连续性测试。
公钥固定是Certificate Patrol等工具错过标记的原因。证书有望改变;公钥不是。
公钥密码与SSH StrictHostKeyChecking
非常相似,如果您熟悉它。
OWASP也在Certificate and Public Key Pinning上写了一篇文章。