NSURLSessionNSURLConnection https 连接中的 HTTP 加载失败(kCFStreamErrorDomainSSL,-9802)错

作者:编程家 分类: ios 时间:2025-11-18

在使用 NSURLSession/NSURLConnection 进行 HTTPS 连接时,有时候会遇到 HTTP 加载失败的错误,错误代码为 kCFStreamErrorDomainSSL,-9802。这个错误通常表示 SSL 证书验证失败,即服务器返回的证书无法通过本地验证。在这篇文章中,我们将讨论这个错误的原因以及解决方法,并提供一些案例代码帮助读者解决类似的问题。

什么是 SSL 证书验证失败错误

在进行 HTTPS 连接时,服务器会返回一个 SSL 证书,用于验证服务器的身份。客户端会使用本地的证书根据信任链来验证服务器的证书是否合法。如果服务器的证书无法通过本地验证,就会出现 SSL 证书验证失败的错误。

这个错误通常是由以下几个原因引起的:

1. 证书过期:证书有一个有效期限,如果服务器的证书已经过期,客户端就无法通过验证。

2. 证书不匹配:服务器的证书中包含了域名信息,如果请求的域名与证书中的域名不匹配,就会导致验证失败。

3. 证书链不完整:服务器的证书需要包含完整的证书链,包括根证书和中间证书。如果服务器的证书链不完整,客户端就无法验证证书的合法性。

4. 证书不受信任:如果服务器的证书没有被本地信任,客户端就无法通过验证。

解决 SSL 证书验证失败错误的方法

要解决 SSL 证书验证失败的错误,我们可以采取以下几种方法:

1. 检查证书的有效期:首先,我们需要检查服务器的证书是否已经过期。我们可以通过查看证书的有效期限来确认。

2. 检查证书的域名匹配:我们还需要检查服务器的证书中的域名是否与请求的域名匹配。如果不匹配,我们可以尝试使用 IP 地址进行连接,或者联系服务器管理员更新证书。

3. 检查证书链的完整性:我们需要确保服务器的证书链是完整的,包括根证书和中间证书。如果证书链不完整,我们可以联系服务器管理员获取完整的证书链。

4. 导入信任的根证书:如果服务器的证书没有被本地信任,我们可以手动导入信任的根证书。在 iOS 中,可以通过将根证书添加到系统的信任存储中来实现。

下面是一个使用 NSURLSession 进行 HTTPS 连接的案例代码:

swift

let url = URL(string: "https://www.example.com")

let session = URLSession.shared

let task = session.dataTask(with: url) { (data, response, error) in

if let error = error {

if let urlError = error as? URLError {

if urlError.code == .secureConnectionFailed {

// SSL 证书验证失败错误处理

if let serverTrust = urlError.failureURLPeerTrust,

let certificate = SecTrustGetCertificateAtIndex(serverTrust, 0) {

let certificateData = SecCertificateCopyData(certificate) as Data

// 处理证书数据

}

}

}

}

// 处理响应数据

}

task.resume()

在上面的代码中,我们使用 URLSession 发起了一个 HTTPS 请求。如果出现了 SSL 证书验证失败的错误,我们可以通过 `URLError` 的 `failureURLPeerTrust` 属性获取服务器的证书信息,并进行进一步处理。

在使用 NSURLSession/NSURLConnection 进行 HTTPS 连接时,遇到 SSL 证书验证失败错误是比较常见的问题。本文介绍了这个错误的原因和解决方法,并提供了一个使用 NSURLSession 的案例代码。当遇到类似的问题时,读者可以根据本文提供的方法进行排查和解决。