Alamofire 5 针对多CA的自定义SSL证书验证实现问题咨询
Alamofire 5 单主机证书校验降级方案
Alamofire 5 开放了ServerTrustEvaluating协议,你可以通过自定义评估器实现多步校验逻辑,无需受默认提供的校验策略限制,具体实现方式如下:
1. 自定义信任评估器
实现遵循ServerTrustEvaluating协议的自定义类,内部先执行证书钉扎校验,校验失败时自动降级到常规SSL校验:
import Alamofire class CustomPriorityTrustEvaluator: ServerTrustEvaluating { // 本地保存的钉扎证书 private let pinnedCertificates: [SecCertificate] // 常规校验评估器,支持自研CA配置 private let fallbackEvaluator: ServerTrustEvaluating init(pinnedCerts: [SecCertificate], additionalAnchors: [SecCertificate] = [], validateHost: Bool = true) { self.pinnedCertificates = pinnedCerts // 配置降级后的常规校验逻辑,自研CA根证书可传入additionalTrustAnchors参数 self.fallbackEvaluator = DefaultTrustEvaluator( validateHost: validateHost, additionalTrustAnchors: additionalAnchors, performDefaultValidation: true ) } func evaluate(_ trust: SecTrust, forHost host: String) throws { // 第一步:优先执行证书钉扎校验 let pinEvaluator = PinnedCertificatesTrustEvaluator( certificates: pinnedCertificates, validateHost: validateHost ) do { try pinEvaluator.evaluate(trust, forHost: host) } catch { // 钉扎校验失败,执行降级校验 try fallbackEvaluator.evaluate(trust, forHost: host) } } }
2. 绑定自定义评估器到指定主机
初始化ServerTrustManager时,为目标主机指定自定义的评估器即可:
// 加载本地钉扎证书和自研CA根证书 let pinnedCerts = Bundle.main.certificates(withSuffix: "cer") let rootCACerts = Bundle.main.certificates(withSuffix: "root.cer") // 配置评估器映射 let trustManager = ServerTrustManager(evaluators: [ "your-custom-host.com": CustomPriorityTrustEvaluator( pinnedCerts: pinnedCerts, additionalAnchors: rootCACerts ) ]) // 生成业务使用的Session实例 let afSession = Session(serverTrustManager: trustManager)
补充说明
- 如果你需要的是公钥钉扎而非证书钉扎,把代码中的
PinnedCertificatesTrustEvaluator替换为PublicKeysTrustEvaluator即可,逻辑无需调整 - 如果不需要自研CA支持,不传
additionalAnchors参数即可,降级后会走系统默认的SSL校验逻辑
内容的提问来源于stack exchange,提问作者Eric E.
相关产品推荐
相关产品推荐

