无法使用 HTTPS 连接到服务器
Can Not Connect to Server Using HTTPS
首先,我知道有吨类似的问题,但是none我见过似乎解决了我的设置问题(我发现的任何解决方案都没有用)。所以请耐心等待...
- 我的服务器主机名是IP地址,不是域名
(即 URL 看起来像:
https://XXX.YYY.ZZZ.WWW:9443/etc...
)。
- 我的服务器有一个真正的证书(即不是自签名)。
- 我的应用程序的 plist 条目
NSAppTransportSecurity
字典是空的(没有任何例外 - 出厂设置 ATS)。
- 这是生产代码,我可以不能禁用ATS(我想我也不能,因为例外只适用于显式域名,不能 IP 地址)。
(在 iOS 9 上测试,部署目标是 iOS 8.x)
我在尝试连接时遇到此错误:
CFNetwork SSLHandshake failed (-9806) NSURLSession/NSURLConnection
HTTP load failed (kCFStreamErrorDomainSSL, -9806)
Error: An SSL error has occurred and a secure connection to the server cannot be made.
(设备和模拟器)
我尝试使用 nscurl
描述的命令行工具 here。我得到:
- 默认 ATS 安全连接: CFNetwork SSLHandshake 失败(-9806)
- 允许任意加载: NSURLSession/NSURLConnection HTTP 加载失败(kCFStreamErrorDomainSSL,-9813)("The certificate for this server is invalid. You might be connecting to a server that is pretending to be “XXX.YYY.ZZZ.WWW” which could put your confidential information at risk.")
为 XXX.YYY.ZZZ.WWW 配置 TLS 例外:(TLS 1.2、1.1 和 1.0)CFNetwork SSLHandshake 失败(-9806)
禁用完美转发保密: CFNetwork SSLHandshake 失败(-9801)
禁用完全转发保密并允许不安全的 HTTP: CFNetwork SSLHandshake 失败(-9801)
禁用 PFS 的 TLSv1.2: CFNetwork SSLHandshake 失败(-9801)
禁用 PFS 的 TLSv1.1: CFNetwork SSLHandshake 失败(-9801)
禁用 PFS 的 TLSv1.0: NSURLSession/NSURLConnection HTTP 加载失败(kCFStreamErrorDomainSSL,-9802 )
禁用 PFS 且允许不安全 HTTP 的 TLSv1.2: CFNetwork SSLHandshake 失败(-9801)
...你学会了。
我正在检查服务器支持哪个 TLS 版本(据我研究,这是最大的嫌疑),但也许我还需要做其他事情fix/check 在客户端?
我认为您需要检查服务器上的证书。您应该能够使用 openssl 客户端来调查您的证书并获取服务器的 ssl 配置:
openssl s_client -connect XXX.YYY.ZZZ.WWW:9443
您应该获得有关证书的一些详细信息
SSL 会话:
协议:TLSv1
密码:AES256-SHA
会话ID://
会话 ID-ctx:
主密钥: //
关键参数:None
开始时间:1449693038
超时:300(秒)
验证 return 代码:0 (ok)
或者,您可以使用symantec这样的网站查询证书,看看您是否满足TLS1.2、足够强的密钥和前向保密性的要求。
此外,您可以尝试打开 CFNetwork 诊断日志记录。编辑 Xcode 方案并添加 CFNETWORK_DIAGNOSTICS 环境变量。将日志记录级别设置为最详细的 3:
Xcode 控制台显示日志文件的位置:
CFNetwork diagnostics log file created at: /private/var/mobile/Containers/
Data/Application/A3421F00-451A-CD70-1B82-B163D1A3BB0F/Library/Logs/
CrashReporter/CFNetwork_com.sample.app_118.nwlrb.log
您可以查看这些日志,看看是否有关于网络调用失败原因的更多信息。
首先,我知道有吨类似的问题,但是none我见过似乎解决了我的设置问题(我发现的任何解决方案都没有用)。所以请耐心等待...
- 我的服务器主机名是IP地址,不是域名
(即 URL 看起来像:
https://XXX.YYY.ZZZ.WWW:9443/etc...
)。 - 我的服务器有一个真正的证书(即不是自签名)。
- 我的应用程序的 plist 条目
NSAppTransportSecurity
字典是空的(没有任何例外 - 出厂设置 ATS)。 - 这是生产代码,我可以不能禁用ATS(我想我也不能,因为例外只适用于显式域名,不能 IP 地址)。
(在 iOS 9 上测试,部署目标是 iOS 8.x)
我在尝试连接时遇到此错误:
CFNetwork SSLHandshake failed (-9806) NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9806) Error: An SSL error has occurred and a secure connection to the server cannot be made.
(设备和模拟器)
我尝试使用 nscurl
描述的命令行工具 here。我得到:
- 默认 ATS 安全连接: CFNetwork SSLHandshake 失败(-9806)
- 允许任意加载: NSURLSession/NSURLConnection HTTP 加载失败(kCFStreamErrorDomainSSL,-9813)("The certificate for this server is invalid. You might be connecting to a server that is pretending to be “XXX.YYY.ZZZ.WWW” which could put your confidential information at risk.")
为 XXX.YYY.ZZZ.WWW 配置 TLS 例外:(TLS 1.2、1.1 和 1.0)CFNetwork SSLHandshake 失败(-9806)
禁用完美转发保密: CFNetwork SSLHandshake 失败(-9801)
禁用完全转发保密并允许不安全的 HTTP: CFNetwork SSLHandshake 失败(-9801)
禁用 PFS 的 TLSv1.2: CFNetwork SSLHandshake 失败(-9801)
禁用 PFS 的 TLSv1.1: CFNetwork SSLHandshake 失败(-9801)
禁用 PFS 的 TLSv1.0: NSURLSession/NSURLConnection HTTP 加载失败(kCFStreamErrorDomainSSL,-9802 )
禁用 PFS 且允许不安全 HTTP 的 TLSv1.2: CFNetwork SSLHandshake 失败(-9801)
...你学会了。
我正在检查服务器支持哪个 TLS 版本(据我研究,这是最大的嫌疑),但也许我还需要做其他事情fix/check 在客户端?
我认为您需要检查服务器上的证书。您应该能够使用 openssl 客户端来调查您的证书并获取服务器的 ssl 配置:
openssl s_client -connect XXX.YYY.ZZZ.WWW:9443
您应该获得有关证书的一些详细信息
SSL 会话: 协议:TLSv1 密码:AES256-SHA 会话ID:// 会话 ID-ctx: 主密钥: // 关键参数:None 开始时间:1449693038 超时:300(秒) 验证 return 代码:0 (ok)
或者,您可以使用symantec这样的网站查询证书,看看您是否满足TLS1.2、足够强的密钥和前向保密性的要求。
此外,您可以尝试打开 CFNetwork 诊断日志记录。编辑 Xcode 方案并添加 CFNETWORK_DIAGNOSTICS 环境变量。将日志记录级别设置为最详细的 3:
Xcode 控制台显示日志文件的位置:
CFNetwork diagnostics log file created at: /private/var/mobile/Containers/
Data/Application/A3421F00-451A-CD70-1B82-B163D1A3BB0F/Library/Logs/
CrashReporter/CFNetwork_com.sample.app_118.nwlrb.log
您可以查看这些日志,看看是否有关于网络调用失败原因的更多信息。