我已将SSL证书的公钥保存到我的xcode项目中.crt,我正在尝试使用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并获得格式正确的结果。
问题是我只保存了公钥而不是整个证书吗?我想避免出于明显的安全原因这样做,但我似乎无法弄清楚为什么它在尝试创建Sec证书时返回nil。
提前致谢!
答案 0 :(得分:2)
最后想通了,问题出在我的证书中,即使它看起来是正确的。我通过openssl将其重新保存为.cer并修复它来修复它。奇怪的是,当我试图在崇高或记事本中将其重新保存为.cer时,即使Xcode以相同的方式显示它们,它也不起作用,直到我从每个打印出NSData并且它们显示它们是不同的。