iOS9出现错误“发生了ssl错误,无法build立与服务器的安全连接”

由于我升级到Xcode7 ,当我用iOS 9运行我现有的项目,我不断收到错误:

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

对于iOS9,苹果公司作出了一个关于iOS 9的决定,作为App Transport Security(ATS)的一部分,禁止iOS应用程序中的所有不安全的HTTPstream量。

要简单地禁用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> 

iOS 9将使用HTTPS的连接强制为TLS 1.2,以避免最近的漏洞。 在iOS 8中,即使是未encryption的HTTP连接也是受支持的,所以老版本的TLS也没有任何问题。 作为解决方法,您可以将此代码片段添加到Info.plist中:

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

*引用到应用程序传输安全性(ATS)

在这里输入图像说明

如果您只是针对特定的域名,您可以尝试添加到您的应用程序的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.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 dict中连接到的域即使在NSExceptionAllowsInsecureHTTPLoads设置为true的情况下也可以修复此问题。 :\

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

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

Xcode项目 – > goto info.plist并点击+button,然后添加(应用程序传输安全设置)展开,允许任意负载设置是。 谢谢