我有一个.pem文件,可以通过curl的--cert参数成功连接到我的网站。然后我将其转换为文件:
openssl x509 -inform PEM -outform DER -in client.pem -out cert.der
然后我将该cert.der加载到我的项目中,我现在尝试将其与Alamofire一起使用,按照他们主页上的示例:
let serverTrustPolicy = ServerTrustPolicy.PinCertificates(
certificates: ServerTrustPolicy.certificatesInBundle(),
validateCertificateChain: true,
validateHost: true
)
let policyManager = ServerTrustPolicyManager(policies: ["my.domain.com" : serverTrustPolicy])
manager = Alamofire.Manager(configuration: configuration, serverTrustPolicyManager: policyManager)
manager.request(.GET, url, parameters: params, encoding: .URLEncodedInURL, headers: nil)
.authenticate(usingCredential: credential)
.validate()
.responseJSON {
当它运行虽然它失败了但我得到了一个'取消'作为错误的localizedDescription,这是Alamofire在身份验证失败时所做的事情。
我做错了什么?
答案 0 :(得分:1)
Alamofire证书固定逻辑目前不支持此用例。它仅用于处理证书和公钥锁定,而不是用于对服务器进行身份验证的客户端证书。如果这是一个常见的用例,这是我们将来可以支持的。
话虽如此,我假设在这种情况下,您正在收到一个NSURLAuthenticationChallenge
,其保护空间的身份验证方法类型为.NSURLAuthenticationMethodClientCertificate
。在这些情况下,您需要评估质询的主机,然后使用NSURLCredential
API创建credentialWithIdentity:certificates:persistence:
。通过将此凭据传递给完成处理程序,应将客户端证书发送到服务器以验证连接。可以找到更多信息here。
客户端证书身份验证(NSURLAuthenticationMethodClientCertificate)需要系统身份以及与服务器进行身份验证所需的所有证书。使用credentialWithIdentity创建NSURLCredential对象:certificates:persistence:。
我以前从未真正需要使用此类身份验证。您需要使用任务覆盖闭包覆盖auth challenge SessionDelegate
闭包以使其正常工作。