xCode 9 - iOS 11: NSURLConnection - sendAsynchronousRequest失败

17

我刚刚下载了最新版本的xCode(9.0 beta (9M136h))。

但是,在iOS 11模拟器中尝试向我的服务器发出请求(使用NSURLConnection sendAsynchronousRequest),会收到一个错误:

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9807) NSURLConnection finished with error - code -1202

NSError对象包含消息 - @"NSLocalizedDescription" : @"此服务器的证书无效。您可能正在连接到一个假冒“***”的服务器,这可能会将您的机密信息置于风险之中。"

plist文件包含:

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

所以在这种情况下不是问题(我猜)

毋庸置疑,在iOS 10/9/8上它是正常工作的

有什么建议吗?

提前致谢!


解决了这个问题吗? - cvb
1
@ChrisVanBuskirk 不完全是这样。我和我们的服务器专家交谈后,他说这可能与过期的证书有关。看起来在iOS 11中,他们强调了整个安全问题。目前,我正在使用URLSession代理的didReceive challenge中的completionHandler(.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust))来使其正常工作。 - dor506
@dor506,你能展示一下你的修复方法吗?我今天已经花了9个小时在这上面了,现在我需要任何帮助。这是我第一次使用Objective-C编程。 - ODelibalta
@ODelibalta请查看答案。 - dor506
3个回答

6
您需要允许您的应用程序运行HTTP(非S)连接。默认情况下,苹果仅允许HTTPS:
1. 进入您的info.plist文件 2. 在任何项目上按加号图标 3. 搜索“App Transport Security Settings” 4. 点击左侧的小箭头,找到“Allow arbitrary loads”,默认设置为“NO”,将其更改为“YES”

2
根据Security.SE和Crypto.SE的人们所说,如果你的安全实践不佳,你会受到责备。 - DannyNiu
可能是,但这是他问题的一个解决方案。 - Carter4502
4
这并不是解决方案,例如我有一个HTTP请求,我已经将"允许任意加载"设置为"是",但无论如何仍然会出现相同的错误:Task <6CBEEC35-4B88-43A1-9269-1B919EA0FD81>.<72>以错误码-999完成。 - Genevios
按照您描述的方式进行了操作,但是当我重新构建我的应用程序时,仍然出现了之前的错误... - nicowi

1
对于在中遇到此错误的所有人,请确保您正在使用有效(安全)的证书来操作服务器。

在我们的情况下,证书不够严格。

一旦我们的服务器管理员集成了新的有效证书,问题就解决了。

检查证书是否安全的一种方法是将有问题的链接粘贴到浏览器中。

结果可能会显示连接未被保护:

enter image description here


我感谢您的更新,但这并不适用于我。Chrome可以正常访问URL,我的iOS 11测试手机上的Safari也可以。 - ODelibalta
@dor506,你是如何创建证书来解决这个问题的?我在iOS 13上遇到了同样的问题。 - paiego

0

由于您遇到了无效证书错误,根据我的个人安全实践,我将提出以下建议。

如果您仍在与您的CA服务期限内,请向他们申请发行新的有效证书。

检查您的钥匙串设置,并确保没有缺失任何CA证书。

或者,您可以为测试目的自己发行自签名证书,并将其添加到本地钥匙串作为信任锚点。搜索“如何创建自签名x509证书”将返回一些您可能会发现有用的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接