iOS 11和12安装的证书不受信任(自签名)

在我们的内部网络上,我们使用自签名CA证书。 这在Safari和我们的iOS产品中一直运行良好,一直到iOS 10.我们只需在任何新设备或模拟器上安装CA证书,即使使用ATS,一切正常。 这允许访问我们所有的内部测试服务器,而无需单独信任每个服务器。

从iOS 11开始,已安装的CA证书不再允许Safari或我们的应用程序信任任何服务器的证书。 我们通过为我们的应用启用CFNETWORK_DIAGNOSTICS获得以下相关详细信息:

错误域= kCFErrorDomainCFNetwork代码= -1200
_kCFNetworkCFStreamSSLErrorOriginalValue = -9802
_kCFStreamErrorDomainKey = 3
_kCFStreamErrorCodeKey = -9802
NSLocalizedDescription =发生SSL错误,无法与服务器建立安全连接。
NSLocalizedRecoverySuggestion =你想要连接到服务器吗?

我花了相当多的时间来解决这个问题,搜索StackOverflow和网络的其余部分。 虽然我们在我们的应用程序中使用AFNetworking,但这似乎无关紧要,因为Safari不再通过CA信任这些服务器。 通过NSAllowsArbitraryLoads禁用ATS允许访问服务器,但显然不是解决方案。

我们的-URLSession:didReceiveChallenge:completionHandler代码没有任何变化,我们通过challenge.protectionSpace.serverTrust实现了挑战响应的正确(多年工作)。

我已经按照我能想到的方式重新评估和测试了CA和服务器证书,除了iOS 11之外,它们可以在任何地方工作。在iOS 11的ATS中可能会发生什么变化可能会导致这个问题?

在写这个问题时,我发现了答案。 从Safari安装CA不再自动信任它。 我必须从“证书信任设置”面板( 此问题中也提到)手动信任它。

在此处输入图像描述

我辩论取消了这个问题,但我认为有一些人可能正在寻找的相关代码和日志详情可能会有所帮助。 此外,我在iOS 11之前从未遇到过这个问题。我甚至回过头来重新确认它会自动通过iOS 10运行。

我以前从未需要触摸该设置面板,因为任何已安装的证书都是自动受信任的。 也许它会在iOS 11发布时发生变化,但我对此表示怀疑。 希望这有助于节省我浪费的时间。

如果有人知道为什么这对于不同版本的iOS上的某些人有不同的表现,我很乐意在评论中知道。

更新 :检查第一个iOS 12测试版,看起来事情保持不变。 这个问题/答案/评论仍然适用于iOS 12。

建议的解决方案是安装并信任自签名证书(root)。 假设您创建了自己的CA并且证书的层次结构是正确的,则无需更改服务器信任评估。 建议这样做,因为它不需要对代码进行任何更改。

  1. 生成CA和证书(您可以使用openssl: 生成CA和自签名证书 。
  2. 在设备上安装根证书(* .cer文件) – 您可以通过Safari将其打开,它应该将您重定向到“设置”
  3. 安装认证后,转到证书信任设置(设置>常规>关于>证书信任设置),如MattP答案。

如果不可能,则需要更改服务器信任评估。

本文档中的更多信息: 技术问答QA1948 HTTPS和测试服务器

在我的iPhone上给IOS11不感兴趣之后,这也发生在我身上。 当我尝试连接到公司网络时,它会提出公司证书,并说它不受信任。 我按下“信任”按钮,连接失败,证书不会出现在受信任的证书列表中。

Apple手上三类证书: TrustedAlways Ask and Blocked 。 如果您的证书在“ Blocked和“ Always Ask列表中的类型,您将遇到此问题。 在Safari上,它显示如下: 在此处输入图像描述

您可以在设置>常规>关于>证书信任设置中找到Always Ask证书的类型

iOS 11中有可用的受信任根证书列表

阻止WoSign CA免费SSL证书G2的信任