我创建了一个需要与自签名SSL服务进行通信的phonegap应用程序。
我将我的网址列在res / xml / cordova.xml中,如下所示:
<access origin="https://www.mydomain.com" subdomains="true" />
当我从eclipse运行和构建时,这工作正常,但如果我然后导出并签署我的应用程序并手动安装APK,则应用程序无法与我的Web服务进行通信。
与服务器的通信使用Sencha Touch库进行,如下所示:
Ext.Ajax.request({
url: 'https://www.mydomain.com',
method: 'get',
success: function(result) {
},
failure: function(result) {
}
});
任何帮助非常感谢
答案 0 :(得分:10)
问题是您使用的是自签名证书。默认情况下,Android WebView不允许使用自签名SSL证书。 PhoneGap/Cordova overrides this in the CordovaWebViewClient class {但不要偏离它的行为;如果应用程序是经过调试签名的,它将proceed
并忽略错误,否则将失败。
您可以更改应用程序中上面链接的代码,并使onReceivedSslError
方法始终调用handler.proceed()
- 但不建议这样做。不要使用自签名证书!
答案 1 :(得分:3)
我做了以下操作来解决限制(目前使用Cordova 1.7.0)。这绝对是不安全的:
public class MyWebViewClient extends CordovaWebViewClient {
public MyWebViewClient(DroidGap ctx) {
super(ctx);
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
// testing against getPrimaryError() or hasErrors() will fail on Honeycomb or older.
// You might check for something different, such as specific info in the certificate,
//if (error.getPrimaryError() == SslError.SSL_IDMISMATCH) {
handler.proceed();
//} else {
// super.onReceivedSslError(view, handler, error);
//}
}
}
然后在主要活动中:
@Override
public void init() {
super.init();
//pass in our webviewclient to override SSL error
this.setWebViewClient(this.appView, new MyWebViewClient(this));
}