Cordova下自签名证书无法访问https问题(IOS和Android)
2018-01-27 21:36
1556 查看
最近准备将项目上架到AppStore,但从17年开始,AppStore审核条件要求所有网络请求都为https,所以就在内网(192.……)布好了自测环境,并将环境映射到了公网(58.……)。接着问题就来了:
1,使用chrome(51.0.2704.103版本)调试时,内网和外网都可以正常访问;
2,使用Safari调试时,内网正常访问,外网无法访问;
3,安装到iPhone7上,内网正常访问,外网无法访问;
4,安装到三星C7(Android 6.0.1)上,内网正常访问,外网无法访问;
5,安装到Cube平板(Android 4.4.4)上,内网和外网都可以正常访问;
总结分析了一下,觉得可能是以下原因造成的:
1,端口映射问题;
2,后台bug;
3,浏览器内核原因;
4,证书问题;
接着就一个个的排除。首先重新检查了一下nginx配置,没什么问题,而且既然内外网浏览器都可以正常访问,就说明端口映射是ok的;给后台打了个补丁切换到http,测试一切ok,再切换回https问题如期重现,因为我们是单向认证,而且电脑上chrome浏览器是可以正常访问的,所以后台bug也可以排除掉了;至于android手机浏览器内核,众所周知,Android4.4之前的浏览器内核是WebKit,4.4切换到了Chromium(内核是Webkit的分支Blink),也就是说三星C7和Cube系统浏览器内核是一样的,只是内核版本不同。为了进一步确认,我在三星C7上装了个火狐浏览器,在火狐浏览器中输入外网IP端口提交,提示证书无效或不可信任,点击继续前往顺利进入;接着返回我们的app,果然app在外网也可以正常使用了!至此Android上问题确认:是不同Chromium版本对自签名证书信任上出了问题!再来定位IOS问题,通过nginx日志,发现iphone7上访问外网时nginx根本没有接收到访问请求,再通过Xcode调试日志,发现外网访问时报错:NSURLSession/NSURLConnection
HTTP load failed kCFStreamErrorDomainSSL, -9813,还是对自签名证书的信任问题!
定位到了问题就好办了:使用第三方正规证书或移动端信任所有证书。由于第三方证书都是颁发给域名而不是ip,而我们的应用场景是通过ip访问,所以即使有了第三方的正规证书也是没用的。只有在移动端解决了(让应用信任所有证书)。解决办法如下:
IOS上:
在appDelegate.m文件中添加以下代码:
Android上:
修改
org.apache.cordova.engine.SystemWebViewClient.java文件中onReceivedSslError()方法为如下:
以上,问题顺利解决!又经过一翻折腾终于成功提交到AppStore,坐等审核通过。
1,使用chrome(51.0.2704.103版本)调试时,内网和外网都可以正常访问;
2,使用Safari调试时,内网正常访问,外网无法访问;
3,安装到iPhone7上,内网正常访问,外网无法访问;
4,安装到三星C7(Android 6.0.1)上,内网正常访问,外网无法访问;
5,安装到Cube平板(Android 4.4.4)上,内网和外网都可以正常访问;
总结分析了一下,觉得可能是以下原因造成的:
1,端口映射问题;
2,后台bug;
3,浏览器内核原因;
4,证书问题;
接着就一个个的排除。首先重新检查了一下nginx配置,没什么问题,而且既然内外网浏览器都可以正常访问,就说明端口映射是ok的;给后台打了个补丁切换到http,测试一切ok,再切换回https问题如期重现,因为我们是单向认证,而且电脑上chrome浏览器是可以正常访问的,所以后台bug也可以排除掉了;至于android手机浏览器内核,众所周知,Android4.4之前的浏览器内核是WebKit,4.4切换到了Chromium(内核是Webkit的分支Blink),也就是说三星C7和Cube系统浏览器内核是一样的,只是内核版本不同。为了进一步确认,我在三星C7上装了个火狐浏览器,在火狐浏览器中输入外网IP端口提交,提示证书无效或不可信任,点击继续前往顺利进入;接着返回我们的app,果然app在外网也可以正常使用了!至此Android上问题确认:是不同Chromium版本对自签名证书信任上出了问题!再来定位IOS问题,通过nginx日志,发现iphone7上访问外网时nginx根本没有接收到访问请求,再通过Xcode调试日志,发现外网访问时报错:NSURLSession/NSURLConnection
HTTP load failed kCFStreamErrorDomainSSL, -9813,还是对自签名证书的信任问题!
定位到了问题就好办了:使用第三方正规证书或移动端信任所有证书。由于第三方证书都是颁发给域名而不是ip,而我们的应用场景是通过ip访问,所以即使有了第三方的正规证书也是没用的。只有在移动端解决了(让应用信任所有证书)。解决办法如下:
IOS上:
在appDelegate.m文件中添加以下代码:
@implementation NSURLRequest(DataController) + (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host { return YES; } @end
Android上:
修改
org.apache.cordova.engine.SystemWebViewClient.java文件中onReceivedSslError()方法为如下:
/** * Notify the host application that an SSL error occurred while loading a resource. * The host application must call either handler.cancel() or handler.proceed(). * Note that the decision may be retained for use in response to future SSL errors. * The default behavior is to cancel the load. * * @param view The WebView that is initiating the callback. * @param handler An SslErrorHandler object that will handle the user's response. * @param error The SSL error object. */ @TargetApi(8) @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { handler.proceed(); }
以上,问题顺利解决!又经过一翻折腾终于成功提交到AppStore,坐等审核通过。
相关文章推荐
- android_https踩坑(3)android webview无法访问自签名证书的服务器
- android_https踩坑(1)自签名证书OkHttp无法访问
- 关于android使用okhttpUtils使用请求https请求证书签名问题
- android 访问https 证书问题 报错javax.net.ssl.SSLHandshakeException
- Android解决okhttpUtils框架无法在4.4.4以下系统访问https协议的问题
- OpenSSL使用1(用OpenSSL生成自签名证书在IIS上搭建Https站点)(用于iOS的https访问)
- ios下https代理访问证书问题
- nginx配置https及Android客户端访问自签名证书
- ios https访问自建证书时遇到的问题
- 编译android,无法访问 java.lang.Object问题
- android常见问题二:真机测试无法访问本机服务器端
- 关于服务器ssl配置以后,https无法访问的问题
- 如何通过手机客户端Android、Iphone 等访问要求使用客户端证书SSL加密的https网站
- 无法对jar进行签名,Android jar signer问题
- 解决Android手机端Google服务无法访问的问题
- 无法安装ADT(无法访问https://dl-ssl.google.com/android/eclipse/) 的解决方法
- windowxp无法通过RPC Over HTTP访问证书错误问题
- HTTPS访问站点,出现证书问题解决
- HttpClient访问https站点证书加载问题
- 调整系统时间,导致https站点无法访问,skype无法登陆等问题