Swift5使用Alamofire请求不受信证书API时TLS校验失败如何解决
Alamofire TLS证书校验失败(错误-9807)解决方案
你遇到的-9807错误是iOS系统默认TLS信任评估失败,触发原因是目标API使用了自签名证书、过期证书或者不在系统信任根证书列表内的证书,Alamofire默认遵循系统安全策略拒绝了该请求。
以下涉及绕过系统证书校验的方案仅可用于开发测试环境,生产环境使用会存在严重的中间人攻击风险,可能导致用户传输数据泄露,请勿在正式发布的版本中使用无限制的证书校验跳过逻辑。
以下代码适配Alamofire 5.x版本,若使用Alamofire 4.x版本需对应调整信任策略API。
方案1:临时跳过指定域名的证书校验(适合开发测试)
不要用默认的AF单例发起请求,需要自定义配置了信任策略的Session实例:
// 全局定义自定义Session,不要每次请求重复创建 let customSession: Session = { // 替换为你实际请求的API域名,不要携带协议头、路径、端口 let trustManager = ServerTrustManager(evaluators: [ "your-api-domain.com": DisabledTrustEvaluator() ]) return Session(serverTrustManager: trustManager) }() // 测试阶段需要全域名跳过校验可以用以下配置,生产环境严禁使用 // let customSession: Session = { // let trustManager = ServerTrustManager(allHostsMustBeEvaluated: false, // evaluators: [:]) // return Session(serverTrustManager: trustManager) // }()
原有请求代码中将AF.request替换为customSession.request即可:
customSession.request(APICaller.POSTv2_URL, method: .post, parameters: parameters, encoding: JSONEncoding.default).response { response in // 原有逻辑保持不变 }
方案2:证书钉选(适合生产环境使用自签名证书场景)
该方案不会完全跳过校验,只会信任APP内置的指定证书,兼顾自签名证书的使用需求和传输安全:
- 将API的CER格式证书拖入Xcode项目,记得勾选对应Target的Membership选项
- 配置信任策略:
let customSession: Session = { // 读取项目内打包的证书 let certificates = Bundle.main.af.certificates let evaluator = PinnedCertificatesTrustEvaluator( certificates: certificates, acceptSelfSignedCertificates: true, performDefaultValidation: false, validateHost: true ) let trustManager = ServerTrustManager(evaluators: [ "your-api-domain.com": evaluator ]) return Session(serverTrustManager: trustManager) }()
补充配置:ATS安全策略调整
如果修改后依然报错,需要在项目Info.plist中调整App Transport Security配置,测试阶段可以临时开启全局非安全请求允许:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
生产环境建议精准配置域名白名单,不要开启全局允许。
注意事项
- 跳过证书校验时填写的域名需要和请求的域名完全匹配,不要携带协议头、路径、端口等额外内容
- 生产环境如果使用公网可访问的API,建议替换为受CA机构信任的正规证书,无需额外修改校验逻辑
- 自定义的
Session实例建议全局单例使用,不要每次发起请求都重复创建
内容的提问来源于stack exchange,提问作者nick
相关产品推荐
相关产品推荐

