首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用离子科尔多瓦框架和自签名证书在iOS 11中绕过SSL检查

如何使用离子科尔多瓦框架和自签名证书在iOS 11中绕过SSL检查
EN

Stack Overflow用户
提问于 2017-10-17 03:30:48
回答 3查看 9.7K关注 0票数 1

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

无法加载资源:此服务器的证书无效。您可能正在连接一个假装为“192.168.10.20:8080”的服务器,invalid.....which可能会将您的机密信息置于危险之中。

由于此服务器仅用于开发/测试目的,因此我只想忽略ssl检查...我怎样才能做到这一点?我尝试了以下方法: AppDelegate.m文件,但没有成功,因为以下代码在iOS 11中不起作用...

代码语言:javascript
复制
@implementation NSURLRequest(DataController)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
{
    return YES;
}
@end

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-10-17 17:11:57

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

本质上,你需要做的是:

  • 将自定义身份验证码直接放入WKWebView插件代码
  • 加载资源中(然后WKWebView events会正确地从ATS Cordova获得

详细说明

您应该详细执行以下操作(如果使用的是WKWebView):

需要修改CDVWKWebViewEngine.m (插件代码)。您需要在那里添加:

代码语言:javascript
复制
- (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框架加载)时,这才有效。

因此,您还需要从 URI加载应用程序。我假设您有本地网络(自签名证书),所以这应该不是问题。如果你将在本地加载应用程序(即从index.html),那么这将不起作用!

此外,您还需要在应用程序*.plist设置文件中禁用iOS ATS,如下所示:

代码语言:javascript
复制
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

这就是对我有效的方法。

其他资源:

针对不同场景(包括自签名)的SSL非常好的测试站点:关于此主题的https://badssl.com/

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

票数 2
EN

Stack Overflow用户

发布于 2017-10-17 17:35:14

谢谢@peter,我找到了另一个方法来检查ios11中的应用程序,以测试API是否被正确命中。您可以通过在config.xml中添加以下标记,将tag视图从WKWebView强制更改为UIWebview

代码语言:javascript
复制
<preference name="CordovaWebViewEngine" value="CDVUIWebViewEngine" />

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

代码语言:javascript
复制
@implementation NSURLRequest(DataController)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
{
    return YES;
}
@end

它对我有效..!

注意:仅适用于开发/测试purpose.not建议用于生产部署

票数 3
EN

Stack Overflow用户

发布于 2020-07-29 01:21:29

我最近遇到了一个与服务器上的无效SSL证书相关的问题。

在我的应用程序中,我使用了WKWebView插件,它已经成为将应用程序发送到应用程序商店的必备条件。正是在这个插件中,需要进行调整以忽略无效的SSL证书,在文件"plugins/cordova-plugin-ionic-webview/src/ios/CDVWKWebViewEngine.m",中包括:

代码语言:javascript
复制
- (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证书可能会危及应用程序的安全性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46777758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档