126

由于我使用 iOS 9 升级了现有项目,因此我不断收到错误消息:

发生 SSL 错误,无法与服务器建立安全连接。

4

13 回答 13

135

对于 iOS9,Apple 在 iOS 9 中做出了一个激进的决定,作为App Transport Security (ATS)的一部分,禁用来自 iOS 应用程序的所有不安全的 HTTP 流量。

要简单地禁用 ATS,您可以按照此步骤打开Info.plist并添加以下行:

<key>NSAppTransportSecurity</key>
  <dict>
      <key>NSAllowsArbitraryLoads</key>
      <true/>
  </dict>
于 2015-09-24T08:06:36.390 回答
72

尽管允许任意加载 ( 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>
于 2015-09-29T22:15:44.170 回答
16

如果您只是针对特定域,您可以尝试将其添加到应用程序的 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>
于 2015-11-10T21:40:05.560 回答
15

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

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

*参考应用传输安全 (ATS)

在此处输入图像描述

于 2015-10-01T08:00:35.283 回答
6

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

要重现,请使用 safari 检查您的 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)

现在尝试去谷歌(因为他们当然有 SHA-256 证书):

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

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

[编辑] 我发现只需在NSExceptionDomains字典中枚举我要连接的域即可解决此问题,即使NSExceptionAllowsInsecureHTTPLoads设置为 true 也是如此。:\

于 2015-10-05T18:53:31.647 回答
2

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

于 2015-10-01T11:37:28.837 回答
2

当我将我的 HTTPS URL 指定为:https://www.mywebsite.com时,我得到了同样的错误。但是,当我将其指定为没有三个 W 时,它可以正常工作:https://mywebsite.com

于 2016-03-10T20:13:40.923 回答
1

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

于 2019-04-26T05:47:53.213 回答
1

我在播放时遇到错误

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 并解决了问题。

于 2020-06-25T21:19:35.833 回答
0

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

于 2016-10-24T09:42:01.730 回答
0

我的问题是NSURLConnection并且在 iOS9 中已被弃用,所以我将所有 API 更改为NSURLSession并解决了我的问题。

iOS9 中不推荐使用 NSURLConnection

于 2018-05-09T06:37:34.727 回答
0

我在某些网络呼叫而不是其他网络呼叫中收到此错误。我连接到公共无线网络。那个免费的 wifi 似乎在篡改某些 URL,因此出现了错误。

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

于 2020-07-02T12:33:52.210 回答
0

使用这个站点,我输入了我向其发出请求的服务器的地址,并将生成的 SHA 密钥添加到 info.plist。

https://www.ssllabs.com/ssltest/index.html

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSPinnedDomains</key>
        <dict>
            <key>Your domain here (www.api.com)</key>
            <dict>
                <key>NSPinnedLeafIdentities</key>
                <array>
                    <dict>
                        <key>SPKI-SHA256-BASE64</key>
                        <string>******pfbtB5iNouq********rC8Nrb+AmLFKxV7qgM=</string>
                    </dict>
                </array>
            </dict>
        </dict>
    </dict>
于 2022-01-11T09:17:59.007 回答