iOS 11 : SSL error occurred and connection to server cannot be made

标签 ios objective-c xcode ssl app-transport-security

当我尝试连接服务器(即 IIS) 时,控制台窗口出现以下错误:

API 错误:发生 SSL 错误,无法与服务器建立安全连接。 因此无法登录。

我使用的是 Xcode 9.2、iOS 11。

以下是我尝试过但没有奏效的解决方案:

  1. 应用程序传输安全设置 -> 允许任意加载 -> YES

  2. 添加异常域

  3. 与服务器团队一起对 IIS 进行故障排除,发现它不安全,即没有 HTTPS 或 SSL

这是我的 plist ATS 配置

Screenshot

附言这个项目是在 2014 年由第三方供应商用 Objective-C 编写的。这个问题是由于 Objective-C 语言引起的吗? (嗯,我不这么认为)

任何修复?

最佳答案

从屏幕截图来看,您可能正在使用 .dev 域。如果是这样,您将无法禁用 ATS,因为 Google 拥有 .dev 域,并且他们已选择要求所有 .dev 域都需要 HTTPS。在 iOS 11 中,Apple 支持 HSTS 预加载,这允许将某些域限制为仅安全连接。 .dev 顶级域 (TLD) 现在是需要 HTTPS 的 TLD 之一。在此处查看更多相关信息:https://stackoverflow.com/a/47698675/3708242

您的屏幕截图包含以 .dev 结尾的 ATS 异常,但您的评论指定了不同的域。我假设您的 Info.plist 中可能有多个异常,并且您使用 .dev 对本地服务器进行内部测试。如果是这种情况,只需将内部测试的域更改为 *.dev 以外的域。此外,并不是说您的屏幕截图中的异常不正确,因为它在异常域中包含 http://。而不是像“http://mylocalserver.local”这样的 InfoPlist 条目,您应该只有“mylocalserver.local”(没有 http://)。

如果您的 abc.pqr.lmn 条目相同(它还包括异常域中的协议(protocol)),请删除“http://”,它应该可以工作。

此外,您的异常(exception)列表有点乱。如果您根本不使用 https,您应该能够删除除 NSExceptionAllowsInsecureLoads 之外的所有条目。如果要允许不支持 ATS 最低要求的 HTTPS 连接,则指定所有其他设置。如果您只是想尝试不安全的 HTTP 流量,请摆脱其他流量。

总结一下:

  1. 不要使用 .dev 域进行本地测试,因为 Google 现在拥有顶级域并且要求所有新浏览器/操作系统在连接到以 .dev 结尾的任何内容时使用 HTTPS。
  2. 不要在 Info.plist 的 ATS 异常(exception)域中包含“http://”
  3. 这与它在 Objective-C 中没有任何关系 - 它与 iOS 11 实现 HSTS 预加载有关。

关于iOS 11 : SSL error occurred and connection to server cannot be made,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49360954/

相关文章:

ios - 如果在线更改数据,则更新 tableview

ios - 检测 tableView reloadData 完成的新解决方案?

ios - Apple 在 ARC 文档警告中针对通过引用传递的警告是什么?

xcode - 在代码片段库 (Xcode 10) 中添加代码片段

objective-c - Open Sans 字体在 iOS 模拟器中不起作用

objective-c - 比较 Objective C 中的字符串

ios - 为什么我的 Cordova 应用程序创建了这么多 iframe?

ios - 如何根据语言以外的标准本地化文本

c++ - 如何制作反比例循环?

ios - 显示和关闭 View Controller 后,iOS 7.1 上的标签栏背景丢失