6

自己署名SSLサービスと通信する必要があるphonegapアプリを作成しました。

次のように、res / xml/cordova.xmlのURLをホワイトリストに登録しました。

<access origin="https://www.mydomain.com" subdomains="true" />

これは、Eclipseから実行およびビルドする場合は正常に機能しますが、アプリをエクスポートして署名し、APKを手動でインストールすると、アプリはWebサービスと通信できなくなります。

サーバーとの通信は、SenchaTouchライブラリを使用して次のように実行されます。

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 に答える