6

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

非常感谢任何帮助

4

2 回答 2

10

问题是您使用的是自签名证书。默认情况下,Android WebView 不允许自签名 SSL 证书。PhoneGap/Cordova 在 CordovaWebViewClient 类中覆盖了这一点,但它的行为并没有太大偏离;如果应用程序经过调试签名,它将proceed忽略错误,否则将失败。

您可以在应用程序中更改上面链接到的代码并使该onReceivedSslError方法始终调用handler.proceed()- 但不建议这样做。不要使用自签名证书!

于 2012-06-11T07:07:52.840 回答
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));
}
于 2012-08-08T02:13:25.987 回答