Ssl certificate 无法使用Alamofire 5.0.2应用证书固定

Ssl certificate 无法使用Alamofire 5.0.2应用证书固定,ssl-certificate,alamofire,pinning,Ssl Certificate,Alamofire,Pinning,我正在迁移我的应用程序以使用Alamofire 5.0.2,在过去的版本中,它使用Alamofire 4.x,并且证书固定工作正常 然后,我迁移了Alamofire及其证书固定配置,并进行了以下更改: //函数'defaultSessionManager'的使用示例` 类ViewController:UIViewController{ 让sessionManager=defaultSessionManager(defaultRequestInterceptor()) //... } priva

我正在迁移我的应用程序以使用Alamofire 5.0.2,在过去的版本中,它使用Alamofire 4.x,并且证书固定工作正常

然后,我迁移了Alamofire及其证书固定配置,并进行了以下更改:


//函数'defaultSessionManager'的使用示例`
类ViewController:UIViewController{
让sessionManager=defaultSessionManager(defaultRequestInterceptor())
//...
}
private func defaultSessionManager(uRequestInterceptor:requestInterceptor?->Alamofire.Session{
let求值器:[字符串:ServerTrustEvaluating]=[
"https://myapp.com“:PinnedCertificatesTrustEvaluator(证书:pinnedCertificates()),
]
let配置:URLSessionConfiguration=URLSessionConfiguration.af.default
configuration.timeoutitervalforrequest=10//s
configuration.timeoutitervalforresource=10//s
返回Alamofire.Session(
配置:配置,
拦截器:请求拦截器,
serverTrustManager:serverTrustManager(评估者:评估者))
}
func pinnedCertificates()->[SecCertificate]{
var证书:[SecCertificate]=[]
让directoryContents:[URL]=/。。。
让certificateName:String=“app.cer”//替换为演示
让pinnedCertificateURL:URL?=directoryContents.first{(URL:URL)在URL.lastPathComponent==certificateName}
如果让pinnedCertificateURL:URL=pinnedCertificateURL{
做{
让pinnedCertificateData:CFData=try Data(contentsOf:pinnedCertificateURL)作为CFData
如果让pinnedCertificate:SecCertificate=SecCertificateCreateWithData(无,pinnedCertificateData){
证书。附加(pinnedCertificate)
}
}抓住{
//...
}
}
返回证书
}
使用上面的解决方案,我得到了错误:

MyApp[374:21470] Task <DDC8F9FD-81A3-EBA4-8AA2-D7C99DD3E63B>.<1> HTTP load failed, 0/0 bytes (error code: -999 [1:89])
MyApp[374:21470]任务。HTTP加载失败,0/0字节(错误代码:-999[1:89])
如果我删除行
serverTrustManager:serverTrustManager(evaluators:evaluators))
,Alamofire可以工作,但没有证书固定

你知道如何解决这个问题吗?我做错了什么


谢谢。

您的evaluator映射中的
字符串应仅为主机,而不是完整的url:

let求值器:[字符串:ServerTrustEvaluating]=[
“myapp.com”:PinnedCertificatesTrustEvaluator(证书:pinnedCertificates()),
]
此外,您需要确保主机与您请求的域完全匹配


此外,Alamofire将自动在您的捆绑包中查找证书,因此您可能不需要自己查找。

不幸的是,这不起作用:(另外,我们没有捆绑提供证书。这是使用Alamofire 4.x:Jon的实现,我发现Alamofire 5.0的新文档非常混乱。由于这个问题,我无法发布我的应用程序的更新,我看不到任何解决方案。您以前的使用似乎也使用公钥,而不是证书,在这种情况下,您可能希望使用
PublicKeysTrustEvaluator
。固定密钥更灵活,因为您可以使用相同的密钥更新证书,而不必部署新的应用程序,但证书有更多的检查。因此,这实际上取决于您的证书部署策略。