导出APK后,Phonegap / Cordova白名单跨域SSL请求无效

时间:2012-06-10 13:20:07

标签: android cordova https whitelist

我创建了一个需要与自签名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) {         
        }           
    }); 

任何帮助非常感谢

2 个答案:

答案 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));
}