【问题标题】:iOS9 getting error “an SSL error has occurred and a secure connection to the server cannot be made”iOS9 收到错误“发生 SSL 错误,无法与服务器建立安全连接”
【发布时间】:2015-12-21 17:19:05
【问题描述】:

自从我使用 iOS 9 升级了现有项目后,我不断收到错误消息:

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

【问题讨论】:

标签: ios ssl-certificate app-transport-security


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我在播放时遇到错误

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        NSURLConnection deprecated in iOS9

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

          • 我在 plist 中添加了以上行,但仍然出现以下错误:发生 SSL 错误,无法与服务器建立安全连接。 NSLocalizedRecoverySuggestion=你还是要连接到服务器吗?, _kCFNetworkCFStreamSSLErrorOriginalValue=-9819 我正在调用 HTTPS 请求。 HTTPS 还有其他选择吗?
          • AiOsN = 同样的问题,你找到解决办法了吗?
          • 这似乎是一种常见的误解,认为 NSAllowsArbitraryLoads 是启用或禁用 ATS 的开关。一旦您执行 https:// 请求,您必须确保满足 ATS 要求:服务器上安装的有效证书(不带通配符,与服务器的域名完全匹配),服务器支持 TLS 1.2 和转发保密。
          • @Christian 这些 ATS 要求的来源是什么?我找不到任何关于不支持通配符证书的信息。
          • @Bartosz 抱歉,我无法将您指向官方文档,这只是我们在更新服务器基础架构时观察到的。
          【解决方案6】:

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

          【讨论】:

          • @AbdulYasin 检查您的 plist 并检查天气变化是否更新?
          • 这个“悠闲”的答案完全省略了与此解决方法相关的解释和安全风险。
          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

            如果您只是针对特定域,可以尝试将其添加到应用程序的 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”输入了正确的域。
            • 这对我有用。当我只使用“允许任意负载”作品但在停止之后做了示例时。当我使用键“NSExceptionRequiresForwardSecrecy”-> false 和“NSIncludesSubdomains”-> true 时,它​​工作得很好。非常感谢!
            • 这对我也有用!即使我使用的是 https 连接,我仍然面临这个问题。目前不支持“NSExceptionRequiresForwardSecrecy”。从我读到的内容来看,这没有必要早先指定,但看起来他们现在也已经强制执行了。 PS:我正在尝试使用 iOS 10.2.1
            【解决方案9】:

            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 也是如此。 :\

            【讨论】:

              【解决方案10】:

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

              【讨论】:

              • 我遇到了一些 url 的问题,但在同一个 IP 地址(域和服务器)上没有其他问题
              【解决方案11】:

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

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

              *引用App Transport Security (ATS)

              【讨论】:

              • 对于 Swift 4+,应用传输安全设置 -> 允许任意加载 = YES
              【解决方案12】:

              尽管允许任意加载 (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>
              

              【讨论】:

              • 比忽略所有安全问题要好得多。 Amazon 的 S3 服务使用弱加密,直接加载到他们的服务器会导致问题,但这允许我们只打开 s3.amazonaws.com url,其余部分保持内联。太棒了!
              • 我尝试访问的服务器使用的是 TLSv1.0。我不得不为 tls1.0 添加 NSExceptionMinimumTLSVersion 以绕过 SLL 错误
              • 这个答案对我有用。我正在使用 WKWebView 并尝试向 API 服务器发出 SSL 请求。
              • 嗨@Stéphane,我遇到了奇怪的情况。我的手机安装的是 iOS 版本 12.1.2,但出现错误“发生 SSL 错误,无法与服务器建立安全连接”。我所做的是更新了我的 plist 文件。应用程序运行良好,我再次删除了我在 info.plist 中所做的更改。现在它运行良好。因此,我无法找到此错误的实际原因。有什么建议吗?
              • @Mansuu.... 您是否尝试按照上面 cmets 中的建议使用 TLSv1.0?
              猜你喜欢
              • 2019-06-26
              • 2016-02-28
              • 2020-11-02
              • 2012-07-25
              • 2018-06-06
              • 2013-10-11
              • 2017-09-03
              • 2017-01-22
              • 1970-01-01
              相关资源
              最近更新 更多