Cordova iOS访问自签名SSL证书遇错误,求有效解决方法
嘿,这个kCFStreamErrorDomainSSL, -9813错误我之前踩过坑!本质就是SSL证书验证没通过——要么是证书本身有问题,要么是App的ATS(App Transport Security)配置卡了。给你几个实测有效的解决办法:
先排查证书本身的合法性
- 先用浏览器打开目标HTTPS链接,点击地址栏的锁图标查看证书详情:确认域名完全匹配、证书未过期、证书链完整。如果浏览器都提示不安全,那大概率是服务器端的证书问题,得先让运维修复证书。
- 如果是测试环境用的自签名证书,得把它加入App的信任列表:
- 将
.cer格式的证书添加到Xcode项目中,确保在Target -> Build Phases -> Copy Bundle Resources里能看到它。 - 在
Info.plist中配置ATS例外:<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>你的测试域名.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> <key>NSTemporaryExceptionMinimumTLSVersion</key> <string>TLSv1.2</string> <key>NSTemporaryExceptionRequiresForwardSecrecy</key> <false/> </dict> </dict> </dict> - 实现
NSURLSessionDelegate的代理方法手动信任证书:
⚠️ 注意:这个方法只适合测试环境,上线前必须移除,否则会有严重的安全风险!func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { // 只处理服务器信任验证 if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust { if let serverTrust = challenge.protectionSpace.serverTrust { let credential = URLCredential(trust: serverTrust) completionHandler(.useCredential, credential) return } } // 其他情况走默认处理 completionHandler(.performDefaultHandling, nil) }
- 将
检查ATS配置是否合规
iOS 9之后默认强制ATS,要求所有HTTPS请求符合安全标准:
- 尽量不要直接把
NSAllowsArbitraryLoads设为true(苹果上线审核大概率会拒),优先用上面的域名例外配置。 - 确认服务器支持TLS 1.2及以上版本,ATS默认要求TLS 1.2+。如果服务器用的是老版本TLS,可在例外配置里指定
NSTemporaryExceptionMinimumTLSVersion为对应版本(比如TLSv1.0),但上线前一定要升级服务器的TLS版本。
迁移到NSURLSession并检查请求内容
- 如果你还在使用
NSURLConnection,建议赶紧迁移到NSURLSession——旧的NSURLConnection证书忽略逻辑在新iOS系统上可能失效,NSURLSession的代理方法更可靠。 - 检查是否存在混合内容:比如HTTPS接口里加载HTTP资源,ATS会直接阻止这种请求。要么把所有资源改成HTTPS,要么在ATS例外里放行对应的HTTP域名。
内容的提问来源于stack exchange,提问作者Gurp321
相关产品推荐
相关产品推荐

