在我的应用程序中,我需要调用一些REST API服务调用。部署REST API服务的目标开发服务器上的证书是自签名的。因此,当我运行应用程序时,我得到的错误如下:
无法加载资源:此服务器的证书无效。您可能正在连接一个假装为“192.168.10.20:8080”的服务器,invalid.....which可能会将您的机密信息置于危险之中。
由于此服务器仅用于开发/测试目的,因此我只想忽略ssl检查...我怎样才能做到这一点?我尝试了以下方法: AppDelegate.m文件,但没有成功,因为以下代码在iOS 11中不起作用...
@implementation NSURLRequest(DataController)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
{
return YES;
}
@end我在我的应用程序中使用ionic 3& Cordova 7。
发布于 2017-10-17 17:11:57
有趣的是,我也在研究同样的问题。看起来在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框架加载)时,这才有效。
因此,您还需要从为 URI加载应用程序。我假设您有本地网络(自签名证书),所以这应该不是问题。如果你将在本地加载应用程序(即从index.html),那么这将不起作用!
此外,您还需要在应用程序*.plist设置文件中禁用iOS ATS,如下所示:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>这就是对我有效的方法。
其他资源:
针对不同场景(包括自签名)的SSL非常好的测试站点:关于此主题的https://badssl.com/
应该避免禁用证书检查,只有在你有很好的理由或其他限制的情况下才使用它。您仍然有通信安全,但您没有信任。因此,男人在中间攻击是可能的!如果您决定使用此选项,则还应使用证书锁定以使其更加安全。
发布于 2017-10-17 17:35:14
谢谢@peter,我找到了另一个方法来检查ios11中的应用程序,以测试API是否被正确命中。您可以通过在config.xml中添加以下标记,将tag视图从WKWebView强制更改为UIWebview
<preference name="CordovaWebViewEngine" value="CDVUIWebViewEngine" />现在在Appdelegate.m文件中添加以下代码
@implementation NSURLRequest(DataController)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
{
return YES;
}
@end它对我有效..!
注意:仅适用于开发/测试purpose.not建议用于生产部署
发布于 2020-07-29 01:21:29
我最近遇到了一个与服务器上的无效SSL证书相关的问题。
在我的应用程序中,我使用了WKWebView插件,它已经成为将应用程序发送到应用程序商店的必备条件。正是在这个插件中,需要进行调整以忽略无效的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证书可能会危及应用程序的安全性。
https://stackoverflow.com/questions/46777758
复制相似问题