worklight.server.url 设置为 HTTPS 时无法登录 iOS
Can't login on iOS when worklight.server.url set to HTTPS
在构建 iOS Anywhere 应用程序时,如果我将 worklight.server.url 设置为 https 地址(哪个无关紧要,只是它是 https 地址),应用程序将无法连接到安装在设备上时的服务器,或者即使在设置中更改的任何服务器。当尝试登录时,它会显示加载消息,然后就失败了,没有错误。
如果我构建指向 http 地址的应用程序,然后在设置中将其更改为 https,它就可以正常工作。所以它似乎是特定于构建的应用程序的东西。
Android 和模拟器都工作正常。
检查 Worklight 服务器上的 ssl 证书配置。 https://www.ibm.com/support/knowledgecenter/en/SSZH4A_6.0.0/com.ibm.worklight.help.doc/admin/c_ssl_config.html
问题是由 ATS 设置引起的。使用 Forward Secrecy 时服务器出现故障。我使用 nscurl 对此进行了测试:收到以下结果:
TLSv1.2
ATS Dictionary:
{
NSExceptionDomains = {
"*customer-details*.com" = {
NSExceptionMinimumTLSVersion = "TLSv1.2";
};
};
}
2018-03-12 12:40:12.277 nscurl[21636:8171556] CFNetwork SSLHandshake failed (-9824)
2018-03-12 12:40:12.278 nscurl[21636:8171556] NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9824)
Result : FAIL
Error : Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={_kCFStreamErrorCodeKey=-9824, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, NSUnderlyingError=0x7fe06b62a410 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, _kCFNetworkCFStreamSSLErrorOriginalValue=-9824, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9824}}, NSLocalizedDescription=An SSL error has occurred and a secure connection to the server cannot be made., NSErrorFailingURLKey=https://*customer-details*.com/, NSErrorFailingURLStringKey=https://*customer-details*.com/, _kCFStreamErrorDomainKey=3}
我更新了 iphone 本机文件夹中的 info.plist 文件以匹配以下设置:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<false/>
<key>NSExceptionDomains</key>
<dict>
<key>*customer-details*.com</key>
<dict>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TSLv1.2</string>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
</dict>
在我的案例中,重要的设置是将 NSExceptionRequiresForwardSecrecy 设置为 false。
我最初忽略了这一点,因为 NSAllowsArbitraryLoads 设置为 true 但这似乎没有效果。
在构建 iOS Anywhere 应用程序时,如果我将 worklight.server.url 设置为 https 地址(哪个无关紧要,只是它是 https 地址),应用程序将无法连接到安装在设备上时的服务器,或者即使在设置中更改的任何服务器。当尝试登录时,它会显示加载消息,然后就失败了,没有错误。
如果我构建指向 http 地址的应用程序,然后在设置中将其更改为 https,它就可以正常工作。所以它似乎是特定于构建的应用程序的东西。
Android 和模拟器都工作正常。
检查 Worklight 服务器上的 ssl 证书配置。 https://www.ibm.com/support/knowledgecenter/en/SSZH4A_6.0.0/com.ibm.worklight.help.doc/admin/c_ssl_config.html
问题是由 ATS 设置引起的。使用 Forward Secrecy 时服务器出现故障。我使用 nscurl 对此进行了测试:收到以下结果:
TLSv1.2
ATS Dictionary:
{
NSExceptionDomains = {
"*customer-details*.com" = {
NSExceptionMinimumTLSVersion = "TLSv1.2";
};
};
}
2018-03-12 12:40:12.277 nscurl[21636:8171556] CFNetwork SSLHandshake failed (-9824)
2018-03-12 12:40:12.278 nscurl[21636:8171556] NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9824)
Result : FAIL
Error : Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={_kCFStreamErrorCodeKey=-9824, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, NSUnderlyingError=0x7fe06b62a410 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, _kCFNetworkCFStreamSSLErrorOriginalValue=-9824, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9824}}, NSLocalizedDescription=An SSL error has occurred and a secure connection to the server cannot be made., NSErrorFailingURLKey=https://*customer-details*.com/, NSErrorFailingURLStringKey=https://*customer-details*.com/, _kCFStreamErrorDomainKey=3}
我更新了 iphone 本机文件夹中的 info.plist 文件以匹配以下设置:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<false/>
<key>NSExceptionDomains</key>
<dict>
<key>*customer-details*.com</key>
<dict>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TSLv1.2</string>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
</dict>
在我的案例中,重要的设置是将 NSExceptionRequiresForwardSecrecy 设置为 false。
我最初忽略了这一点,因为 NSAllowsArbitraryLoads 设置为 true 但这似乎没有效果。