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

时间:2018-10-31 10:47:22

标签: swift xcode ssl

使用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]任务。<1> HTTP加载失败(错误代码:-1200 [3:-9836])   2018-10-31 09:56:57.376267 + 0200 APPNAME [1691:69140]任务。<1>完成,错误-代码:-1200   在/ todos / 1上调用GET时出错   错误域= NSURLErrorDomain代码= -1200“发生SSL错误,无法建立与服务器的安全连接。”   UserInfo = {_ kCFStreamErrorCodeKey = -9836,NSLocalizedRecoverySuggestion =您是否仍要连接到服务器?,   NSUnderlyingError = 0x6000006c8030 {Error Domain = kCFErrorDomainCFNetwork Code = -1200“(null)”   UserInfo = {_ kCFStreamPropertySSLClientCertificateState = 0,_kCFNetworkCFStreamSSLErrorOriginalValue = -9836,_kCFStreamErrorDomainKey = 3,   _kCFStreamErrorCodeKey = -9836}},   NSLocalizedDescription =发生SSL错误,无法与服务器建立安全连接。   NSErrorFailingURLKey = https://MYURL,NSErrorFailingURLStringKey = https:/ MYURL,_kCFStreamErrorDomainKey = 3}

我不明白为什么会出现此错误,因为URL可以正常工作并且在不启用该设置的情况下可以安全地连接,为什么在禁用该设置并且仍在使用HTTPS的情况下得到此错误?

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

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

  • TLS协议版本不是1.2:
  

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

  • 强大的连接密码
  

连接必须使用AES-128或AES-256对称密码。协商的TLS连接密码套件必须通过椭圆曲线Diffie-Hellman临时(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

  • 证书的强大加密算法:
  

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

  • 当然:HTTPS:
  

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

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