• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - certificateInBundle 不附加自签名证书

[复制链接]
菜鸟教程小白 发表于 2022-12-13 12:32:39 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

在我的情况下,使用便捷方法 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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap