如何使用未知 CA 自签名证书让 Alamofire 执行 HTTPS 请求?

How can I make Alamofire perform HTTPS request, using a certificate self-signed by an Unknown CA?

我有一个使用自签名证书的网络服务器,我已经基于它的证书创建了一个“信任库”。

我 运行 遇到以下错误:

The certificate for this server is invalid. You might be connecting to a server that is pretending to be "192.168...." which could put your confidential information at risk

这是我的一些实现:

let pathToCert = Bundle.main.path(forResource: "truststore-root", ofType: "cer")
let localCertificate : NSData = NSData(contentsOfFile: pathToCert! )!

let serverTrustPolicy = ServerTrustPolicy.pinCertificates(
    certificates : [SecCertificateCreateWithData(nil, localCertificate)!],
    validateCertificateChain : true,
    validateHost : false
)

let serverTrustPolicies = [
    "https://192.168.50.31" : serverTrustPolicy
]

return Alamofire.SessionManager(
    configuration: configuration,
    serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
)

首先您需要在您的应用程序目标中包含您的自签名 ssl 证书。

注意:证书必须采用 iOS 可以读取的格式。您可能需要将 truststore-root.cer 文件转换为其他格式。在某些情况下,这是一个试错过程。

然后您可以调整代码以使用 ServerTrustPolicy 的便捷 certificates(in:) 函数,如下所示:

let serverTrustPolicy = ServerTrustPolicy.pinCertificates(
    certificates: ServerTrustPolicy.certificates(),
    validateCertificateChain: true,
    validateHost: false
)

let serverTrustPolicies = [
    "192.168.50.31": serverTrustPolicy
]

return Alamofire.SessionManager(
    configuration: configuration,
    serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
)

此功能将扫描您的主包和 return 所有包含的具有以下后缀之一的文件“.cer”、“.CER”、“.crt”、“.CRT”、“. der", ".DER".

更新:您可以按照 this 的回答从终端下载您的 ssl 证书。然后双击它以将其导入您的钥匙串。最后,您可以将您的证书从钥匙串导出为 .cer 文件。这具有 iOS 可以读取的正确格式。通过手动调用 ServerTrustPolicycertificates(in:) 函数验证是否属于这种情况。它现在应该 return 您的证书。