由于我使用 iOS 9 升级了现有项目,因此我不断收到错误消息:
发生 SSL 错误,无法与服务器建立安全连接。
由于我使用 iOS 9 升级了现有项目,因此我不断收到错误消息:
发生 SSL 错误,无法与服务器建立安全连接。
对于 iOS9,Apple 在 iOS 9 中做出了一个激进的决定,作为App Transport Security (ATS)的一部分,禁用来自 iOS 应用程序的所有不安全的 HTTP 流量。
要简单地禁用 ATS,您可以按照此步骤打开Info.plist并添加以下行:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
尽管允许任意加载 ( 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>
如果您只是针对特定域,您可以尝试将其添加到应用程序的 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>
iOS 9 强制使用 HTTPS 的连接为 TLS 1.2 以避免最近的漏洞。在 iOS 8 中,甚至支持未加密的 HTTP 连接,因此旧版本的 TLS 也不会造成任何问题。作为一种解决方法,您可以将此代码段添加到您的 Info.plist:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
*参考应用传输安全 (ATS)
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 也是如此。:\
问题是服务器端的 ssl 证书。有东西干扰或证书与服务不匹配。例如,当一个站点拥有 www.mydomain.com 的 ssl 证书,而您使用的服务在 myservice.mydomain.com 上运行。那是一台不同的机器。
当我将我的 HTTPS URL 指定为:https://www.mywebsite.com时,我得到了同样的错误。但是,当我将其指定为没有三个 W 时,它可以正常工作:https://mywebsite.com。
就我而言,我在模拟器中遇到了这个问题,因为我的计算机日期落后于当前日期。因此,当您遇到 SSL 错误时,也要检查这种情况。
我在播放时遇到错误
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 并解决了问题。
Xcode 项目 -> 转到 info.plist 并单击 + 按钮然后添加(应用程序传输安全设置)展开,允许任意加载设置为 YES。谢谢
我的问题是NSURLConnection
并且在 iOS9 中已被弃用,所以我将所有 API 更改为NSURLSession
并解决了我的问题。
我在某些网络呼叫而不是其他网络呼叫中收到此错误。我连接到公共无线网络。那个免费的 wifi 似乎在篡改某些 URL,因此出现了错误。
当我连接到 LTE 时,错误消失了!
使用这个站点,我输入了我向其发出请求的服务器的地址,并将生成的 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>