You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

未使用证书向安全服务器发起POST请求时出现TIC TCP连接失败错误求助

解决HTTPS请求时的TCP连接重置错误(Err(54)/-1005)

嘿,我来帮你拆解并解决这个问题!

首先,先明确你看到的错误含义:

  • TIC TCP Conn Failed [...] Err(54):这个错误对应的是TCP连接被服务器主动重置(Connection Reset by Peer),说白了就是服务器在和你建立连接的过程中直接断了链接。
  • HTTP load failed (error code: -1005):这是iOS的NSURLErrorDomain错误码,本质和上面的Err(54)是一回事,都是连接被服务器强制断开的表现。

为什么会出现这个问题?

你提到是“不使用证书向安全服务器发起POST请求”——这里的安全服务器应该是指HTTPS服务器吧?HTTPS的核心就是通过SSL/TLS证书完成身份验证和加密:

  1. 如果服务器开启了双向认证(要求客户端提供证书),你不提供客户端证书的话,服务器在握手阶段就会直接断开连接。
  2. 如果服务器是普通的HTTPS(仅验证服务器证书),但你完全跳过了服务器证书的有效性检查(比如用了自签名证书却没做信任配置),很多服务器也会直接拒绝连接,避免不安全的请求。

针对性解决方案

情况1:服务器要求客户端证书(双向SSL认证)

这种情况下你必须提供对应的客户端证书才能建立连接,步骤大概是:

  • 将客户端证书文件(通常是.p12.pem格式)添加到你的应用Bundle中
  • URLSession的配置里加载这个证书,并设置对应的信任策略,让应用能使用证书完成认证。

情况2:测试环境下临时跳过服务器证书验证(生产绝对禁用!)

如果是测试环境,你只是想绕过自签名证书的验证(比如内部测试服务器),可以通过自定义URLSession的代理来实现,但一定要记住:生产环境绝对不能这么做,这会让你的应用完全暴露在中间人攻击的风险下!

举个Swift的示例代码:

// 创建自定义URLSession配置
let sessionConfig = URLSessionConfiguration.default
sessionConfig.urlCredentialStorage = nil

// 初始化带代理的URLSession
let session = URLSession(configuration: sessionConfig, delegate: self, delegateQueue: nil)

// 实现URLSessionDelegate的证书信任处理方法
extension YourViewController: URLSessionDelegate {
    func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
        // 仅处理服务器证书信任挑战
        if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust {
            // 直接信任服务器证书(仅测试用!)
            guard let serverTrust = challenge.protectionSpace.serverTrust else {
                completionHandler(.cancelAuthenticationChallenge, nil)
                return
            }
            let credential = URLCredential(trust: serverTrust)
            completionHandler(.useCredential, credential)
        } else {
            // 其他认证类型走默认处理
            completionHandler(.performDefaultHandling, nil)
        }
    }
}

额外排查点

  • 确认服务器的地址、端口是否正确,有没有被本地防火墙或代理工具拦截了连接
  • 检查服务器支持的TLS版本:有些老旧服务器只支持TLS 1.0/1.1,而iOS 13+默认禁用了这些不安全的版本,需要在应用的Info.plist中添加NSAppTransportSecurity配置来启用(同样仅测试用)

内容的提问来源于stack exchange,提问作者OffensivelyBad

火山引擎 最新活动