在我的应用中,我需要调用一些REST API服务调用。部署REST API服务的目标开发服务器上的证书是自签名的。因此,当我运行应用程序时,我收到的错误如下:
无法加载资源:此服务器的证书无效。您可能连接到假装“192.168.10.20:8080”无效的服务器.....这可能会使您的机密信息面临风险。
由于此服务器仅用于开发/测试目的,所以我只想忽略ssl检查......我怎样才能实现它?我尝试了以下方式: [AppDelegate.m文件]但没有成功,因为下面的代码在iOS 11中无效...
@implementation NSURLRequest(DataController)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
{
return YES;
}
@end
我正在使用离子3& Cordova 7在我的应用程序中。
答案 0 :(得分:1)
有趣的是,我只是在研究同样的问题。在iOS 11中看起来有点受限制。我在这里回答WKWebView。
实质上你需要这样做:
详情说明
您应该详细说明以下内容(如果您使用的是WKWebView):
您需要修改CDVWKWebViewEngine.m(插件代码)。你需要在那里添加:
- (void)webView:(WKWebView *)webView
didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge
*)challenge completionHandler:(void (^)
(NSURLSessionAuthChallengeDisposition
disposition, NSURLCredential *credential))completionHandler {
SecTrustRef serverTrust = challenge.protectionSpace.serverTrust;
completionHandler(NSURLSessionAuthChallengeUseCredential,
[NSURLCredential credentialForTrust:serverTrust]);
}
但请注意 - 这只适用于WKWebView初始化(即通过cordova框架加载)。
所以您还需要从API 的URI加载您的应用程序。我认为你有本地网络(自签名证书),所以这应该不是问题。如果您将在本地加载应用程序(即从index.html),那么这将不起作用!
此外,您需要在应用程序* .plist设置文件中禁用iOS ATS,如:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
这对我有用。
其他资源:
Disclamer:应避免禁用证书检查,仅在您有充分理由或其他限制时才使用此功能。你仍然有通信安全,但你没有信任。因此中间人的攻击是可能的!如果您决定使用此选项,则还应使用证书固定来使事情更安全。
答案 1 :(得分:1)
谢谢@peter我找到了另一种解决方法,用于检查ios11中的应用程序以进行测试,无论API是否正常运行。您可以通过在config.xml
中添加以下标记,强制将Web视图从WKWebView更改为UIWebview<preference name="CordovaWebViewEngine" value="CDVUIWebViewEngine" />
现在在Appdelegate.m文件中添加以下代码
@implementation NSURLRequest(DataController)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
{
return YES;
}
@end
它对我有用..!
注意:仅用于开发/测试目的。不建议用于生产部署
答案 2 :(得分:0)
我最近遇到了与服务器上的无效SSL证书相关的问题。
在我的应用程序中,我正在使用WKWebView插件,这已成为将应用程序发送到App Store的要求。在此插件中,需要进行调整以忽略无效的SSL证书,该文件在“ plugins / cordova-plugin-ionic-webview / src / ios / CDVWKWebViewEngine.m”文件中包括:
- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler {
NSLog(@"Allow all");
SecTrustRef serverTrust = challenge.protectionSpace.serverTrust;
CFDataRef exceptions = SecTrustCopyExceptions (serverTrust);
SecTrustSetExceptions (serverTrust, exceptions);
CFRelease (exceptions);
completionHandler (NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:serverTrust]);
}
结果,该应用程序将不考虑无效的SSL证书。
引用https://developer.apple.com/forums/thread/15610
请记住,不建议在生产中的应用程序中执行此操作,因为无效的SSL证书会损害应用程序的安全性。