如何使用Ionic Cordova框架和自签名证书绕过iOS 11中的SSL检查

问题描述:

在我的应用程序中,我需要调用一些REST API服务调用。部署REST API服务的目标开发服务器上的证书是自签名的。因此,当我运行应用程序时,出现如下错误:如何使用Ionic Cordova框架和自签名证书绕过iOS 11中的SSL检查

加载资源失败:此服务器的证书无效。您可能会连接到假装为“192.168.10.20:8080”无效的服务器......这可能会使您的机密信息处于危险之中。

由于此服务器仅用于开发/测试目的,所以我只是想忽略SSL检查...我如何实现它?我尝试以下方法: [AppDelegate.m文件],但没有成功,如下的代码是不是在iOS的11个工作...

@implementation NSURLRequest(DataController) 
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host 
{ 
    return YES; 
} 
@end 

我在我的应用程序使用离子3 &科尔多瓦7。

+0

不幸“allowsAnyHTTPSCertificateForHost”的设备11再没有作品科尔多瓦(WKWebView)。 –

有趣的是,我只是研究同样的问题。看起来像在iOS 11中,事情受到更多限制。我在这里回答WKWebView。

在本质上,你需要做的:

  • 地方自定义的授权码到WKWebView插件代码
  • 负载资源直接从科尔多瓦(然后WKWebView事件被正确触发)
  • 禁用ATS(NSAppTransportSecurity)

详细描述

你应该做的细节如下(如果你使用的是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被初始化(即通过科尔多瓦框架加载)这仅适用。

因此您还需要从API的那个URI加载您的应用程序。我认为你有本地网络(自签名证书),所以这不应该是一个问题。如果你将在本地加载应用程序(即从index.html),那么这将无法正常工作!

另外,你需要禁用ATS的iOS应用*的.plist设置文件,如:

<key>NSAppTransportSecurity</key> 
<dict> 
    <key>NSAllowsArbitraryLoads</key> 
    <true/> 
</dict> 

这是我的作品。

其他资源:

Disclamer:禁用证书应该避免检查,只有在你有很好的理由或其他限制的情况下才使用。你仍然有通信安全,但你没有信任。因此中间人的攻击是可能的!如果您决定使用此选项,则还应使用证书锁定来使事情更安全。

+0

@ Peter ..你可以与我分享完整的CDVWKWebViewEngine.m文件..我已经将这个代码集成到我的程序中,但没有成功.. –

+0

@KamleshKumar:当然我可以分享,在这里是:https:// gist .github.com/PeterStegnar/63cb8c9a39a13265c3a855e24a33ca37 –

感谢@peter我发现多了一个解决方法在ios11检查应用程序的测试目的是否API的越来越正确击中或not.You可以通过在config.xml中

添加下面的标签强行改变从WKWebView到UIWebView的web视图
<preference name="CordovaWebViewEngine" value="CDVUIWebViewEngine" /> 

现在添加下面的Appdelegate.m代码文件

@implementation NSURLRequest(DataController) 
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host 
{ 
    return YES; 
} 
@end 

它为我工作..!

注:只针对开发/测试purpose.not推荐用于生产部署

+0

此变通办法的问题在于您使用的是某种不赞成使用的iOS网页视图。 Apple建议使用WKWebView:https://developer.apple.com/documentation/webkit/wkwebview。这有很多原因(例如,你有一个触摸延迟,这是非常糟糕的用户体验)。问题是如果你可以为你的用户买得起? –