iOS9收到错误“发生SSL错误,无法建立与服务器的安全连接”


Answers:


123

对于iOS9,Apple做出了一个重大决定,即iOS 9禁用了来自iOS应用程序的所有不安全HTTP流量,这是应用程序传输安全性(ATS)的一部分

要简单地禁用ATS,可以通过打开Info.plist并遵循以下步骤,并添加以下几行:

<key>NSAppTransportSecurity</key>
  <dict>
      <key>NSAllowsArbitraryLoads</key>
      <true/>
  </dict>

46
我在plist中添加了以上几行,但仍然出现以下错误:发生SSL错误,无法建立与服务器的安全连接。NSLocalizedRecoverySuggestion =您是否仍要连接到服务器?_kCFNetworkCFStreamSSLErrorOriginalValue = -9819我正在调用HTTPS请求。HTTPS还有其他选择吗?
AiOsN

1
AiOsN =同样的问题,您找到解决方案了吗?
弗朗克

5
NSAllowsArbitraryLoads是启用或禁用ATS的开关,这似乎是一种常见的误解。一旦执行https://请求,就必须确保满足ATS要求:服务器上安装了有效证书(无通配符,与服务器域名完全匹配),服务器支持TLS 1.2并具有转发功能保密。
基督教徒

@Christian这些ATS要求的来源是什么?我找不到关于不支持通配符证书的任何信息。
巴特

@Bartosz对不起,我无法为您提供正式文档,这只是我们在更新服务器基础结构时观察到的内容。
基督教徒

64

即使允许任意加载(NSAllowsArbitraryLoads = true)是一个不错的解决方法,您也不应完全禁用ATS,而应启用要允许的HTTP连接:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>yourserver.com</key>
    <dict>
      <!--Include to allow subdomains-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--Include to allow HTTP requests-->
      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <!--Include to specify minimum TLS version-->
      <key>NSTemporaryExceptionMinimumTLSVersion</key>
      <string>TLSv1.1</string>
    </dict>
  </dict>
</dict>

2
比忽略所有安全问题要好得多。亚马逊的S3服务使用弱加密,直接加载到它们的服务器上会引起问题,但这使我们只能打开s3.amazonaws.com网址,其余部分保持内联。太棒了!
mix3d

3
我尝试访问的服务器正在使用TLSv1.0。我必须为tls1.0添加NSExceptionMinimumTLSVersion才能绕过SLL错误
Ispas Claudiu

这个答案对我有用。我正在使用WKWebView并尝试向API服务器发出SSL请求。
范进

嗨@Stéphane,我遇到了奇怪的情况。我的手机的iOS版本为12.1.2,但出现错误“发生SSL错误,无法建立与服务器的安全连接”。我所做的是更新了我的plist文件。应用运行正常,再次删除了我在info.plist中所做的更改。现在,它运行良好。因此,我无法找到此错误的实际原因。有什么建议吗?
Mansuu ....

@Mansuu ....您是否尝试按照上述评论中的建议使用TLSv1.0?
斯特凡·布鲁克

15

iOS 9强制使用HTTPS的连接为TLS 1.2,以避免最近的漏洞。在iOS 8中,甚至还支持未加密的HTTP连接,因此TLS的较早版本也不会出现任何问题。解决方法是,可以将此代码段添加到Info.plist中:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

*参考App Transport Security(ATS)

在此处输入图片说明


1
对于Swift 4+,应用程序传输安全设置->允许任意加载=是
mehdigriche

14

如果您仅针对特定域,则可以尝试将其添加到应用程序的Info.plist中:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

这对我没有用。是的,我在“ example.com”中输入了正确的域。
Alyoshak

1
对我来说有用。当我仅使用“允许任意负载”工作时却停止了。当我使用键“ NSExceptionRequiresForwardSecrecy”-> false和“ NSIncludesSubdomains”-> true时,它可以完美地工作。非常感谢!
linhadiretalipe

1
这也为我工作!即使我正在使用https连接,我仍然面临该问题。当前不支持“ NSExceptionRequiresForwardSecrecy”。根据我的阅读,这不是必须早些指定的,但是看起来他们现在也已将此强制性。PS:我正在尝试使用iOS 10.2.1
Vaibhav Misra

6

似乎iOS 9.0.2中断了对有效HTTPS终结点的请求。我目前的怀疑是它需要SHA-256证书,否则会因此错误而失败。

要重现,请使用野生动物园检查UIWebView,然后尝试导航到任意HTTPS端点:

location.href = "https://d37gvrvc0wt4s1.cloudfront.net/js/v1.4/rollbar.min.js"
// [Error] Failed to load resource: An SSL error has occurred and a secure connection to the server cannot be made. (rollbar.min.js, line 0)

现在尝试前往Google(因为他们当然拥有SHA-256证书):

location.href = "https://google.com"
// no problemo

为传输安全性添加一个例外(如上面@stéphane-bruckert的回答所述)可以解决此问题。我还认为完全禁用NSAppTransportSecurity也可以,尽管我读过完全禁用可能会危害您的应用程序审查。

[编辑]我发现,简单地枚举NSExceptionDomainsdict中要连接的域即可解决此问题,即使将NSExceptionAllowsInsecureHTTPLoads设置保留为true也是如此。:\


2

问题是服务器端的ssl证书。干扰或证书与服务不匹配。例如,当网站使用www.mydomain.com的ssl证书而您使用的服务在myservice.mydomain.com上运行时。那是另一台机器。


我正在使用某些URL而不是使用相同IP地址(域和服务器)的其他URL获取问题
user6631314


0

Xcode项目-> goto info.plist,然后单击+按钮,然后单击添加(应用程序传输安全设置)扩展,允许任意负载设置为是。谢谢


@AbdulYasin检查您的清单并检查天气变化是否已更新?
Shanmugasundharam

1
这个“悠闲”的答案完全忽略了与该解决方法相关的解释和安全风险。
曼努埃尔


0

就我而言,我在模拟器中遇到了此问题,因为我的计算机日期晚于当前日期。因此,当您遇到SSL错误时,也请检查这种情况。


0

我在播放时遇到错误

finished with error [-1200] Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={NSErrorFailingURLStringKey=https://remote-abcabc-svc.an.abc.com:1935/abr/_definst_/smil:v2/video/492F2F82592F59EA74ABAA6B9D6E6F42/F6B1BD452132329FBACD32730862CAE0/091EAD80FE9BEDD52A2F33840CA3CBAC.v3.eng.smil/playlist.m3u8, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorDomainKey=3, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <692A1174-DA1C-4267-9560-9020A79F8458>.<1>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDataTask <692A1174-DA1C-4267-9560-9020A79F8458>

我确保在plist文件的异常域中添加了条目,并且NSAllowsArbitraryLoads设置为true,但仍然看到错误。

然后我意识到我正在使用https而不是http播放URL。

我将视频网址设置为http并解决了问题。


0

我在某些网络电话而不是其他网络电话中收到此错误。我已连接到公共wifi。那个免费的wifi似乎在篡改某些URL,从而导致错误。

当我连接到LTE时,该错误消失了!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.