You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cordova iOS访问自签名SSL证书遇错误,求有效解决方法

嘿,这个kCFStreamErrorDomainSSL, -9813错误我之前踩过坑!本质就是SSL证书验证没通过——要么是证书本身有问题,要么是App的ATS(App Transport Security)配置卡了。给你几个实测有效的解决办法:

先排查证书本身的合法性
  • 先用浏览器打开目标HTTPS链接,点击地址栏的锁图标查看证书详情:确认域名完全匹配、证书未过期、证书链完整。如果浏览器都提示不安全,那大概率是服务器端的证书问题,得先让运维修复证书。
  • 如果是测试环境用的自签名证书,得把它加入App的信任列表:
    1. 将.cer格式的证书添加到Xcode项目中,确保在Target -> Build Phases -> Copy Bundle Resources里能看到它。
    2. 在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>
      
    3. 实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:25:54