【问题标题】:iOS 11, 12, and 13 installed certificates not trusted automatically (self signed)iOS 11、12 和 13 安装的证书不自动信任(自签名)
【发布时间】:2020-05-24 16:38:39
【问题描述】:

在我们的内部网络中,我们使用自签名 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 中可能发生的哪些更改可能会导致此问题?

【问题讨论】:

  • 我们的 QA 团队报告说,任何更新到 iOS 11 的 Apple 设备都无法再使用 Safari 或 Chrome 访问任何内部 https 站点。接受自签名证书的正常方式已经工作了多年并且继续与未升级的设备一起工作不再有效。看起来很多人都有同样的问题twitter.com/jfsiman/status/910269395959795712
  • 这也开始在 macOS Mojave 上发生,我找不到解决方法。

标签: ios


【解决方案1】:

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

我曾讨论过取消这个问题,但我认为拥有一些相关代码和日志详细信息可能会有所帮助。有人可能正在寻找它。此外,我在 iOS 11 之前从未遇到过这个问题。我什至返回并再次确认它会自动通过 iOS 10 运行。

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

如果有人知道为什么在不同版本的 iOS 上某些人的行为会有所不同,我很想知道 cmets。

更新 1:查看第一个 iOS 12 测试版,看起来一切都保持不变。这个问题/答案/cmets 仍然适用于 iOS 12。

更新 2:iOS 13 beta 版本似乎也需要相同的解决方案。

【讨论】:

  • 您好 - 很遗憾我的证书没有显示在证书信任设置中 - 您对此有什么建议吗?
  • 如果您的证书是阻止类型,您的证书可能不会显示在证书信任设置中。
  • 不错的发现 - 请注意,自 iOS 10.3 以来就是这种情况。这是来自苹果的相关支持条目:support.apple.com/en-au/HT204477
  • @user3601148 您的证书必须是 CA,即根证书。某些设置使用子证书,因此在您的环境中导出该 CA 证书并安装到 iOS,然后发现它出现在证书信任设置中。
  • 刚刚在 12.4 上成功地做到了这一点。提示:安装证书后,在设置应用程序中搜索“mitmproxy”以提示直接跳转到证书信任设置页面
【解决方案2】:

在尝试连接到运行 Laravel 代客的本地 API 时,我已经为此苦苦挣扎了 3 天。我终于弄明白了。就我而言,我必须从~/.config/valet/CA/LaravelValetCASelfSigned.pem 拖放 LaravelValetCASelfSigned.pem 文件

在模拟器中验证安装后,我必须转到设置>关于>证书信任设置>并启用 Laravel Valet VA 自签名 CN

终于成功了!!!

【讨论】:

  • 正是我想要的!在我偶然发现您的回复之前,我在 Google 上一无所获。我已经发布了一个带有(希望是)一个经过优化的标题的博客,以帮助其他人寻找相同的东西:) medium.com/@joevallender/…
  • 谢谢!最后它奏效了。从上面发布她的博客来到这里。
【解决方案3】:

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

  1. 生成 CA 和证书(您可以使用 openssl:Generating CA and self-signed certificates
  2. 在设备上安装根证书(*.cer 文件) - 您可以通过 Safari 打开它,它应该会将您重定向到设置
  3. 安装证书后,转到证书信任设置(设置 > 常规 > 关于 > 证书信任设置),如 MattP 答案中所示。

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

本文档中的更多信息:Technical Q&A QA1948 HTTPS and Test Servers

【讨论】:

  • 我不知道#3。太感谢了!我寻找这个的时间比我想要的要长得多。
  • 谢谢!我花了几个小时试图弄清楚为什么我自己的 CA 签名服务器证书仅在 iOS 上不受信任。证书没有问题。上面是#3。我想知道为什么信任设置不在 iOS 设置的 CA 配置文件区域。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    苹果手上三类证书:TrustedAlways AskBlocked。如果您的证书类型在 BlockedAlways Ask 列表中,您将遇到此问题。在 Safari 上显示如下:

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

    List of available trusted root certificates in iOS 11

    Blocking Trust for WoSign CA Free SSL Certificate G2

    【讨论】:

    • 设置中没有让我始终信任证书的选项?
    • 自从将我的 iphone6 更新到 iOS 11 后,我一直遇到这个问题。证书由 godaddy 提供(我无法控制)。上wifi网络的唯一方法是先忘记网络,然后输入凭据,然后信任证书。证书未显示在证书信任设置中,我看不出添加一个。下次登录网络时,如果不先忘记网络,会先提示我信任证书,然后请求凭据,然后再次请求信任证书,然后错误变成登录密码无效。
    【解决方案6】:

    如果您在 General->About->Certificate Trust Settings 下没有看到证书,那么您可能没有安装 ROOT CA。非常重要——需要是根 CA,而不是中间 CA。

    我刚刚在这里回答了一个问题,解释了如何获取 ROOT CA 并显示内容:How to install self-signed certificates in iOS 11

    【讨论】:

      【解决方案7】:

      我遵循所有建议和所有要求。我在我的 iPhone 上安装了我的自签名根 CA。我让它信任。我将使用此根 CA 签名的证书放在本地开发服务器上,但在 safari iOS 上仍然出现证书错误。在所有其他平台上工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-02
        • 2016-11-29
        • 1970-01-01
        • 2020-12-15
        • 2018-03-20
        • 2018-03-10
        • 2019-09-03
        • 1970-01-01
        相关资源
        最近更新 更多