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

时间:2017-10-16 19:30:48

标签: ios cordova ionic-framework ssl-certificate self-signed

在我的应用中,我需要调用一些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在我的应用程序中。

3 个答案:

答案 0 :(得分:1)

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

实质上你需要这样做:

  • 将自定义身份验证代码放入WKWebView插件代码
  • 直接从Cordova加载资源(然后正确触发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初始化(即通过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证书会损害应用程序的安全性。