使用 AFNetworking 进行 SSL 固定 - validatesCertificateChain = true

Posted

技术标签:

【中文标题】使用 AFNetworking 进行 SSL 固定 - validatesCertificateChain = true【英文标题】:SSL Pinning with AFNetworking - validatesCertificateChain = true 【发布时间】:2015-07-07 02:46:48 【问题描述】:

我正在尝试使用 AFNetworking 2.5.4(带有 Comodo 证书)制作固定 SSL。 我从服务器获取我的证书 (CER)。

openssl s_client -connect example.com:443 -showcerts

获取第一个 -----BEGIN CERTIFICATE----- 和 -----END CERTIFICATE----- 之间的输出并将其保存到 example.pem

从 PEM 转换为 CER (DER):

openssl x509 -outform der -in example.pem -out example.cer

然后,我将 example.cer 添加到我的 Xcode 项目中,并将其添加到“复制捆绑资源”构建阶段。我的安全策略是:

let securityPolicy = AFSecurityPolicy(pinningMode: AFSSLPinningMode.PublicKey)
    let certificatePath = NSBundle.mainBundle().pathForResource("example", ofType: "cer")!
    let certificateData = NSData(contentsOfFile: certificatePath)!

    securityPolicy.pinnedCertificates = [certificateData];

    securityPolicy.validatesDomainName = true
    securityPolicy.allowInvalidCertificates = false
    securityPolicy.validatesCertificateChain = false

    manager.securityPolicy = securityPolicy

有了这个 SSL Pininning 工作,但我不仅要验证我更改的叶证书

securityPolicy.validatesCertificateChain = true

但是使用该配置会引发以下错误:

Domain=NSURLErrorDomain Code=-1012 "The operation couldn’t be completed. (NSURLErrorDomain error -1012.)

我已阅读 if securityPolicy.validatesCertificateChain = true 我必须输入整个 SSL 证书链但我不知道如何生成它。

我尝试使用以下代码但不起作用(我得到相同的错误):

openssl s_client -connect example.com:443 </dev/null 2>/dev/null | openssl x509 -outform DER > example.cer

如何获取整个 SSL 证书链以添加到 Xcode?​​p>

【问题讨论】:

【参考方案1】:

您还必须将所有中间 CA 证书添加到 securityPolicy.pinnedCertificates 以验证整个链。

【讨论】:

我尝试添加中间 CA 证书,但没有成功。如何正确添加中间 CA 证书? 固定的目的是为了防止 MIMT,并且完全忽略了与信任 Comodo 等 CA 相关的风险,以免受到损害。所以也许在这种情况下,由于您正在固定公钥,您不应该验证证书链。您应该设置 securityPolicy.validatesCertificateChain = false。另一件事是确保您的证书和您连接的服务器上的域名相同。您可以通过设置 securityPolicy.validatesDomainName = false 进行测试。 如果要避免 MIMT 验证证书链,为什么 validatesCertificateChain 应该为假?并且 validatesDomainName 应该为 true 以验证服务器和客户端是否相同? 因为您将服务器证书固定到我们的应用程序中,您只需验证服务器发送给您的服务器证书以确保相同。无需检查签名。 我的意思是不需要检查信任链。

以上是关于使用 AFNetworking 进行 SSL 固定 - validatesCertificateChain = true的主要内容,如果未能解决你的问题,请参考以下文章

使用 AFNetworking 进行 SSL 固定不起作用

使用 AFNetworking 进行证书/SSL 固定 - 如果孩子受信任,如何信任所有父母证书?

如何允许用户在 iOS 中使用 AFNetworking 信任和固定自签名 SSL 证书

快速 afnetworking ssl 固定

iOS SSL Pinning 没有使用 AFNetworking 的证书?

SSL pinning - 在 AFSecurityPolicy 中设置固定公钥而不是固定证书