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

Swift 如何让Alamofire使用由未知CA自签名的证书执行HTTPS请求?,swift,ssl-certificate,alamofire,Swift,Ssl Certificate,Alamofire,我有一个使用自签名证书的Web服务器,并根据其证书创建了一个“信任库” 我遇到以下错误: 此服务器的证书无效。您可能正在连接到 一个假装为“192.168…”的服务器,可能会将您的 面临风险的机密信息 以下是我的一些实现: let pathToCert = Bundle.main.path(forResource: "truststore-root", ofType: "cer") let localCertificate : NSData = NSDat

我有一个使用自签名证书的Web服务器,并根据其证书创建了一个“信任库”

我遇到以下错误:

此服务器的证书无效。您可能正在连接到 一个假装为“192.168…”的服务器,可能会将您的 面临风险的机密信息

以下是我的一些实现:

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可以读取的格式。您可能需要将
信任库root.cer
文件转换为其他格式。在某些情况下,这是一个反复试验的过程

然后,您可以调整代码,以使用方便的
证书(在:)
功能
ServerTrustPolicy
,如下所示:

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)
)
此函数将扫描主捆绑包并返回包含的所有文件,其中包含以下后缀之一“.cer”、“.cer”、“.crt”、“.crt”、“.der”、“.der”


更新:您可以按照答案从终端下载ssl证书。然后双击它将其导入到您的钥匙链。最后,您可以将证书从密钥链导出为.cer文件。这是iOS可以读取的正确格式。通过手动调用
ServerTrustPolicy
certificates(in:)
函数来验证这种情况。它现在应该会返回您的证书。

谢谢您的回答。我尝试将证书转换为der、p12等,但没有成功。还有其他建议吗?谢谢。好吧,您可以始终完全禁用此IP的ssl证书评估,但一般不建议这样做。如果您感兴趣,我可以在我的答案中添加此解决方法。除此之外,您应该能够找到格式正确的证书文件,
certificates(in:)
函数可以返回该文件。谢谢,我在这里阅读了文档:似乎DNS可能是罪魁祸首<代码>TLS服务器证书必须在证书的使用者备选名称扩展名中显示服务器的DNS名称。证书的CommonName中的DNS名称不再受信任。@Brandex07固定ssl证书理论上应绕过iOS默认信任策略。我已经更新了我的答案,包括下载ssl证书的步骤以及将其转换为正确格式的方法。试试看。