我已将SSL证书的 public 密钥作为.crt保存到我的xcode项目中,并尝试使用Alamofire通过https连接到我的网站。一直失败的部分是使用SecCertificateCreateWithData,它返回nil,如下所示:

 func configureAlamoFireSSLPinningWithCertificateData() {

    let cert = "nameOfCert"
    let pathToCert = NSBundle.mainBundle().pathForResource(cert, ofType: "crt")
    let certificateData:NSData = NSData(contentsOfFile: pathToCert!)!
    let localCertificate = SecCertificateCreateWithData(nil, certificateData)!  //RETURNS NIL

    self.serverTrustPolicy = ServerTrustPolicy.PinCertificates(
        certificates: [localCertificate],
        // Choose to validate the complete certificate chain, not only the certificate itself
        validateCertificateChain: true,
        // Check that the certificate mathches the host who provided it
        validateHost: true
    )

    self.serverTrustPolicies = [
        "nameOfTrustedServer": self.serverTrustPolicy!
    ]
    self.afManager = Manager(
        configuration: NSURLSessionConfiguration.defaultSessionConfiguration(),
        serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
    )
}

我查看了项目中的证书,一切似乎都很好,而且我还可以打印certificateData并获得正确格式的结果。

是我只保存了 public 密钥而不是整个证书的问题?由于明显的安全原因,我想避免这样做,但是我似乎无法弄清楚为什么在尝试创建安全证书时它返回nil。

提前致谢!

最佳答案

最终弄清楚了,即使它看起来是正确的,问题仍在我的证书中。我通过通过openssl将其重新保存为.cer来修复它,并对其进行了修复。奇怪的是,当我尝试将其重新存储为.cer时,即使Xcode显示它们相同,它也无法正常工作,直到我从每个文件中打印出NSData并显示它们是不同的为止。

关于ios - ios:公钥SSL固定返回Nil,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36482311/

10-14 10:42