Alamofire和PEM证书

时间:2016-07-14 05:17:06

标签: alamofire

我有一个.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在身份验证失败时所做的事情。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

Alamofire证书固定逻辑目前不支持此用例。它仅用于处理证书和公钥锁定,而不是用于对服务器进行身份验证的客户端证书。如果这是一个常见的用例,这是我们将来可以支持的。

话虽如此,我假设在这种情况下,您正在收到一个NSURLAuthenticationChallenge,其保护空间的身份验证方法类型为.NSURLAuthenticationMethodClientCertificate。在这些情况下,您需要评估质询的主机,然后使用NSURLCredential API创建credentialWithIdentity:certificates:persistence:。通过将此凭据传递给完成处理程序,应将客户端证书发送到服务器以验证连接。可以找到更多信息here

  

客户端证书身份验证(NSURLAuthenticationMethodClientCertificate)需要系统身份以及与服务器进行身份验证所需的所有证书。使用credentialWithIdentity创建NSURLCredential对象:certificates:persistence:。

我以前从未真正需要使用此类身份验证。您需要使用任务覆盖闭包覆盖auth challenge SessionDelegate闭包以使其正常工作。