在我们的内部网络上,我们使用自签名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中可能会发生什么变化可能会导致这个问题?
答案 0 :(得分:32)
在写这个问题时,我发现了答案。从Safari安装CA不再自动信任它。我不得不从“证书信任设置”面板(this question中也提到)手动信任它。
我辩论取消了这个问题,但我认为有一些人可能正在寻找的相关代码和日志详情可能会有所帮助。此外,我在iOS 11之前从未遇到过这个问题。我甚至回过头来再次确认它会自动通过iOS 10运行。
之前我从未需要触摸过该设置面板,因为任何已安装的证书都会自动受信任。也许它会在iOS 11发布时发生变化,但我对此表示怀疑。希望这有助于节省我浪费的时间。
如果有人知道为什么这对不同版本的iOS上的某些人有不同的表现,我很乐意在评论中知道。
更新:查看第一个iOS 12测试版,看起来情况保持不变。这个问题/答案/评论仍然适用于iOS 12。
答案 1 :(得分:6)
建议的解决方案是安装并信任自签名证书(root)。假设您创建了自己的CA并且证书的层次结构是正确的,则无需更改服务器信任评估。建议这样做,因为它不需要对代码进行任何更改。
如果无法实现,则需要更改服务器信任评估。
答案 2 :(得分:3)
在我的iPhone上给IOS11做过不满之后,这也发生在我身上。当我尝试连接到公司网络时,它会提出公司证书并说它不受信任。我按下了'#trust;'按钮和连接失败,证书不会出现在受信任的证书列表中。
答案 3 :(得分:1)
Apple提供三类证书:Trusted
,Always Ask
和Blocked
。如果您的证书在Blocked
和Always Ask
列表中输入,则会遇到此问题。在Safari上它显示如下:
您可以在设置>上找到Always Ask
证书的类型一般>关于>证书信任设置
答案 4 :(得分:0)
如果在“常规”->“关于”->“证书信任设置”下看不到证书,则可能未安装ROOTCA。非常重要-必须是根CA,而不是中间CA。
我在这里回答了一个问题,解释了如何获取根CA并显示内容:How to install self-signed certificates in iOS 11
答案 5 :(得分:0)
在尝试连接到运行Laravel代客的本地API时,我已经为此苦苦挣扎了3天。我终于弄明白了。以我为例,我必须从~/.config/valet/CA/LaravelValetCASelfSigned.pem
在模拟器中验证安装后,我必须转到“设置”>“关于”>“证书信任设置”>并启用“ Laravel Valet VA自签名CN”
最后工作!!
答案 6 :(得分:0)
我遵循所有建议和所有要求。我在iPhone上安装了自签名的根CA。我让它值得信赖。我将使用此根CA签名的证书放在本地开发服务器上,但在safari iOS上仍然出现证书错误。在所有其他平台上工作。