在我正在处理的应用中,我需要处理来自我们的支付服务提供商的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."
有趣的是,在Safari或SFSafariViewController
中加载相同的网址没有任何问题。甚至服务器的证书也没关系:
我尝试在应用的NSAppTransportSecurity
文件中使用Info.plist
设置,特别是启用NSAllowsArbitraryLoadsInWebContent
和NSAllowsArbitraryLoads
,但确实没有效果。
答案 0 :(得分:12)
事实证明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诊断,并详细说明问题及其解决方法:
/usr/bin/nscurl --ats-diagnostics --verbose https://3dsecure.csas.cz
允许应用中的webview连接到不支持前向保密的特定服务器,可以通过在Info.plist
文件中添加以下内容来完成:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>3dsecure.csas.cz</key>
<dict>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
</dict>
</dict>
需要为每个不支持前向保密的域添加此异常。不幸的是,由于它们来自支付提供商,因此无法事先了解所有3-d安全服务器。
我不知道的是,如果不需要向前保密,则可以在全局范围内,仅在特定网页视图中设置任何域名,而不会影响整个应用。