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

How to Bypass SSL check in iOS 11 using Ionic Cordova framework and self signed certificate

在我的应用程序中,我需要调用一些 REST API 服务调用。部署 REST API 服务的目标开发服务器上的证书是自签名的。因此,当我使用 运行 应用程序时,出现如下错误:

无法加载资源:此服务器的证书无效。您可能正在连接到假装“192.168.10.20:8080”无效的服务器......这可能会使您的机密信息面临风险。

由于此服务器仅用于 dev/testing 目的,所以我只想忽略 ssl 检查...我该如何实现?我尝试了以下方式: [AppDelegate.m 文件] 但没有成功,因为下面的代码在 iOS 11 ...

中不起作用
@implementation NSURLRequest(DataController)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
{
    return YES;
}
@end

我在我的应用程序中使用 ionic 3 和 Cordova 7。

有趣的是,我正在研究同样的问题。看起来 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>

这对我有用。

其他资源:

免责声明:应避免禁用证书检查,仅当您有充分理由或其他限制时才使用此功能。你仍然有通信安全,但你没有信任。因此中间人攻击是可能的!如果您决定使用此选项,您还应该使用证书固定来提高安全性。

谢谢@peter 我发现了另一种解决方法,用于检查 ios11 中的应用程序以测试 API 是否被正确命中。您可以通过在 config.xml

中添加以下标签来强制将 webview 从 WKWebView 更改为 UIWebview
<preference name="CordovaWebViewEngine" value="CDVUIWebViewEngine" />

现在在 Appdelegate.m 文件中添加以下代码

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

它对我有用..!

注意:仅适用于 dev/testing purpose.not 建议用于生产部署

我最近遇到了与服务器上无效的 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 证书会危及应用程序的安全性。