为啥我在 iOS 上从 Swift 调用服务时收到 SSL 错误?

Posted

技术标签:

【中文标题】为啥我在 iOS 上从 Swift 调用服务时收到 SSL 错误?【英文标题】:Why am I getting an SSL error calling service from Swift on iOS?为什么我在 iOS 上从 Swift 调用服务时收到 SSL 错误? 【发布时间】:2018-10-31 10:47:22 【问题描述】:

我在使用 Swift 从 XCode 调用 HTTPS 服务时遇到错误,我不明白为什么。我使用的 URL 是 HTTPS URL,服务调用工作正常,但我必须将“允许任意加载”设置设置为 YES,服务调用才能正常工作。如果我没有启用该设置,则服务调用将失败并显示以下内容:

2018-10-31 09:56:57.362568+0200 APPNAME[1691:69141] [BoringSSL]boringssl_context_alert_callback_handler(3747) [C1.1:2][0x7fcb6171e660] 警报级别:致命,描述:协议版本 2018-10-31 09:56:57.362750+0200 APPNAME[1691:69141] [BoringSSL]boringssl_context_error_print(3699)boringssl ctx 0x600000a87ea0: 140511489945352:error:100000f0:SSL 例程:OPENSSL_internal:UNSUPPORTED_PROTOCOL:/BuildRoot/Library/Caches/com.apple.xbs/Sources/boringssl_Sim/boringssl-109.202.1/ssl/handshake_client.cc:569: 2018-10-31 09:56:57.363026+0200 APPNAME[1691:69141] [BoringSSL]boringssl_context_get_error_code(3540) [C1.1:2][0x7fcb6171e660] SSL_AD_PROTOCOL_VERSION 2018-10-31 09:56:57.369545+0200 APPNAME[1691:69141] TIC TCP 连接失败 [1:0x600003d95c80]: 3:-9836 Err(-9836) 2018-10-31 09:56:57.375719+0200 APPNAME[1691:69141] NSURLSession/NSURLConnection HTTP 加载失败 (kCFStreamErrorDomainSSL, -9836) 2018-10-31 09:56:57.375903+0200 APPNAME[1691:69141] 任务。 HTTP 加载失败(错误代码:-1200 [3:-9836]) 2018-10-31 09:56:57.376267+0200 APPNAME[1691:69140] 任务 . 以错误结束 - 代码:-1200 在 /todos/1 上调用 GET 时出错 错误域=NSURLErrorDomain 代码=-1200 “发生 SSL 错误,无法与服务器建立安全连接。” UserInfo=_kCFStreamErrorCodeKey=-9836, NSLocalizedRecoverySuggestion=您还是要连接到服务器吗?, NSUnderlyingError=0x6000006c8030 错误域=kCFErrorDomainCFNetwork 代码=-1200 "(null)" UserInfo=_kCFStreamPropertySSLClientCertificateState=0, _kCFNetworkCFStreamSSLErrorOriginalValue=-9836, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9836, NSLocalizedDescription=发生 SSL 错误,无法与服务器建立安全连接。, NSErrorFailingURLKey=https://MYURL, NSErrorFailingURLStringKey=https:/MYURL, _kCFStreamErrorDomainKey=3

我不明白为什么会出现此错误,因为 URL 可以在未启用设置的情况下安全连接,那么为什么在设置关闭且我仍在使用 HTTPS 时会出现此错误?

任何帮助将不胜感激。

【问题讨论】:

您能提供您尝试加载的网址吗?? 它使用受信任的证书在我们的域本地托管:https:/domain:port/token - 第一个调用是获取令牌。正如我所说,它在设置打开时可以正常工作,但如果设置不存在,我会收到上述错误。 试试nscurl --atsdiagnostics --verbose YOUR_URL看看ATS认为你需要设置哪些参数。 在连接到https://www.yahoo.com 时,我有相同的_kCFStreamErrorCodeKey=-9836。它与 Apple 的 ATS 无关。我在一个不允许通过我的 ios 模拟器访问https://www.yahoo.com 的公司网络上(因为模拟器继承了我锁定机器的所有限制)。希望对某人有所帮助。 【参考方案1】:

IOS 将阻止不符合 ATS 要求的不安全连接。它可以是以下之一:

TLS 协议版本不是 1.2:

ATS 采用传输层 安全 (TLS) 协议版本 1.2 (RFC 5246)。

强连接密码

连接必须使用 AES-128 或 AES-256 对称密码。协商的 TLS 连接密码套件必须通过椭圆曲线 Diffie-Hellman Ephemeral (ECDHE) 密钥交换支持完美前向保密 (PFS),并且必须是以下之一: TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

证书的强加密算法:

叶服务器证书必须使用以下类型的密钥之一进行签名: 长度至少为 2048 位的 Rivest-Shamir-Adleman (RSA) 密钥 椭圆曲线加密 (ECC) 密钥,大小至少为 256 位 此外,叶服务器证书散列算法​​必须是安全散列算法 2 (SHA-2),其摘要长​​度(有时称为“指纹”)至少为 256(即 SHA-256 或更大)。 本节中列出的要求是本文档发布之日的最新要求,未来可能会有更严格的要求。对这些要求的更改不会破坏应用二进制兼容性。

当然:HTTPS:

启用 ATS 后,HTTP 连接必须使用 HTTPS (RFC 2818)。尝试 使用不安全的 HTTP 连接失败。

https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html

【讨论】:

呃,这东西怎么可能解释?例如,我正在运行自托管的东西,例如,指纹是 sha-1。所以ios无法连接到那个?完全疯了。 @Ted 为此,您可以为您的特定主机禁用 ATS ***.com/questions/30731785/…

以上是关于为啥我在 iOS 上从 Swift 调用服务时收到 SSL 错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在 Swift 中的初始化程序不断收到“调用中的额外参数”

当我在按钮操作上从 TableView 中删除单元格时,应用程序崩溃了 - iOS Swift

身份服务器4:为啥我在调用授权控制器时收到“找不到签名密钥”

为啥我在 swift 中调用 getIndex(cell: TableViewCell1) 函数时出错?

为啥在使用“.count”返回 Swift 下标计数时收到不正确的数组计数?

为啥我在执行 POST 请求时收到 405 Method Not Allowed