使用AFNetworking进行SSL Pinning - validatesCertificateChain = true

3

我正在尝试使用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项目中,并将其添加到“复制包资源”构建阶段。我的SecurityPolicy如下:

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 Pinning可以工作,但我想不仅验证叶证书,所以我进行了更改

securityPolicy.validatesCertificateChain = true

但是使用该配置时,会抛出以下错误:

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

我读到如果securityPolicy.validatesCertificateChain = true,则必须输入整个SSL证书链,但我不知道如何生成它。

我尝试使用以下代码,但无法正常工作(我收到相同的错误):

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

我该如何获取完整的SSL证书链以添加到Xcode?

1个回答

1
你还需要将所有中间CA证书添加到securityPolicy.pinnedCertificates中以验证整个证书链。

我尝试添加中间CA证书,但是没有成功。请问如何正确地添加中间CA证书? - corocraft
固定针的目的是为了防止MIMT,并完全忽略信任CA(如Comodo)不会被攻击的风险。因此,在这种情况下,由于您正在固定公钥,您不应验证证书链。您应该设置securityPolicy.validatesCertificateChain = false。另一件事是确保您的域名与您连接到的服务器上的证书相同。您可以通过设置securityPolicy.validatesDomainName = false来进行测试。 - mskw
我不明白为什么validatesCertificateChain应该是false,如果要避免MIMT攻击就必须验证证书链?而validatesDomainName应该是true来验证服务器和客户端是否相同吗? - corocraft
因为您已经将服务器证书固定到我们的应用程序中,所以您只需要验证服务器发送给您的服务器证书是否相同即可,无需检查签名。 - mskw
我是指无需检查信任链。 - mskw
你真的需要了解中间人攻击的工作原理,才能知道为什么证书锁定可以防止它。 - mskw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接