在我正在开发的应用程序中,我需要处理来 self 们的支付服务提供商的 3-D 安全重定向。这些重定向指向发卡机构的网页,该网页在 WKWebView
中显示给应用中的用户。
除了 WKWebView
没有为 https://3dsecure.csas.cz/ 加载的情况外,这一直有效。并因以下错误而失败:
Error Domain=NSURLErrorDomain
Code=-1200
"An SSL error has occurred and a secure connection to the server cannot be made."
有趣的是,相同的 URL 在 Safari 或 SFSafariViewController
中加载时没有问题。甚至服务器的证书也可以:
我尝试在应用程序的 Info.plist
文件中尝试使用 NSAppTransportSecurity
设置,特别是启用 NSAllowsArbitraryLoadsInWebContent
和 NSAllowsArbitraryLoads
但它确实没有效果。
最佳答案
前向保密
事实证明,3dsecure.csas.cz
的服务器不支持前向保密:https://www.ssllabs.com/ssltest/analyze.html?d=3dsecure.csas.cz&s=194.50.240.77
iOS9 及更高版本中的 App Transport Security
要求对所有应用程序连接进行完全前向保密,including webviews (但是不包括 Safari)
ATS调试
在终端中运行以下命令会运行 ATS 诊断并详细说明问题及其解决方法:
/usr/bin/nscurl --ats-diagnostics --verbose https://3dsecure.csas.cz
应用中的 ATS 异常
允许应用程序中的 webview 连接到不支持前向保密的特定服务器可以通过在 Info.plist
文件中添加以下内容来完成:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>3dsecure.csas.cz</key>
<dict>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
</dict>
</dict>
不是面向 future 的
需要为不支持前向保密的每个域添加此异常(exception)。不幸的是,不可能提前知道所有 3-d 安全服务器,因为它们来自支付提供商的重定向。
我不知道是否可以在不影响整个应用程序的情况下,为任何域、全局和特定 webview 设置不需要前向保密。
关于iOS:SSL 错误 - 页面未在 WKWebView 中加载但在 Safari 中加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42645946/