OGeek|极客世界-中国程序员成长平台

标题: ios - certificateInBundle 不附加自签名证书 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 12:32
标题: ios - certificateInBundle 不附加自签名证书

在我的情况下,使用便捷方法 ServerTrustPolicy.certificatesInBundle() 似乎无法正常工作

// MARK: - Bundle Location

/**
    Returns all certificates within the given bundle with a `.cer` file extension.

    - parameter bundle: The bundle to search for all `.cer` files.

    - returns: All certificates within the given bundle.
*/
public static func certificatesInBundle(bundle: NSBundle = NSBundle.mainBundle()) -> [SecCertificate] {
    var certificates: [SecCertificate] = []

    let paths = Set([".cer", ".CER", ".crt", ".CRT", ".der", ".DER"].map { fileExtension in
        bundle.pathsForResourcesOfType(fileExtension, inDirectory: nil)
    }.flatten())

    for path in paths {
        if let
            certificateData = NSData(contentsOfFile: path),   // <-- we get the data of the certificate in bundle 
            certificate = SecCertificateCreateWithData(nil, certificateData)  // <-- The problem is here, the certificate is not set neither errors.
        {
            certificates.append(certificate)  // <-- this doesn't run
        }
    }

    return certificates
}

可能与自签名证书的格式有关。我完全使用了这篇博文中的#tip 5。 Five Tips for Using Self Signed SSL Certificates with iOS

问题是 SecCertificateCreateWithData 方法的限制是什么,可以接受哪些证书格式?更好的是,我可以在哪里阅读有关此特定问题的更多信息。

我的代码似乎是正确的,没什么特别的,可能是最常用的片段之一

let defaultManager:Alamofire.Manager = {

    let serverTrustPolicies: [String: ServerTrustPolicy] = [
        "localhost": .PinCertificates(
            certificates: ServerTrustPolicy.certificatesInBundle(),
            validateCertificateChain: true,
            validateHost: true
        )
    ]

    let configuration = NSURLSessionConfiguration.ephemeralSessionConfiguration()
    configuration.HTTPAdditionalHeaders = Alamofire.Manager.defaultHTTPHeaders


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



Best Answer-推荐答案


SecCertificateCreateWithData 返回 nil 的最可能原因是该文件是 PEM 而不是 DER 格式。

根据 documentation , 数据应包含

A DER (Distinguished Encoding Rules) representation of an X.509 certificate

如果您的数据以“-----BEGIN...”开头,则格式错误。 PEM 可以使用 OpenSSL 转换为 DER(反之亦然) - 这是一个方便的引用 https://www.sslshopper.com/article-most-common-openssl-commands.html .

此外,如果是自签名证书(由“localhost”判断),validateCertificateChain 属性应为 false。否则请求将失败并返回“cancelled” NSError。

此外,从 iOS9 开始,应将 App Transport Security 设置设置为允许任意加载(在 Info.plist 中)。这是唯一允许您的应用评估自签名证书的设置。没有它,Alamofire 信任策略机制将无法发挥作用。

关于ios - certificateInBundle 不附加自签名证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34630539/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://sqlite.in/) Powered by Discuz! X3.4