Междоменный SSL-запрос Phonegap/Cordova из белого списка не работает после экспорта APK

Я создал приложение телефонной связи, которое должно взаимодействовать с самозаверяющей службой SSL.

Я внес свой URL в белый список в res/xml/cordova.xml следующим образом:

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

и это отлично работает, когда я запускаю и строю из eclipse, но если я затем экспортирую и подписываю свое приложение и вручную устанавливаю APK, тогда приложение не может взаимодействовать с моей веб-службой.

Связь с сервером осуществляется с помощью библиотеки Sencha Touch следующим образом:

Ext.Ajax.request({
        url: 'https://www.mydomain.com',
        method: 'get',          
        success: function(result) {                 
        },
        failure: function(result) {         
        }           
    }); 

Любая помощь очень ценится


person Dean Wild    schedule 10.06.2012    source источник


Ответы (2)


Проблема в том, что вы используете самоподписанный сертификат. Android WebView по умолчанию не разрешает самозаверяющие SSL-сертификаты. PhoneGap /Cordova переопределяет это в классе CordovaWebViewClient, но не сильно отклоняется от его поведения; если приложение подписано отладкой, оно proceed проигнорирует ошибку, иначе произойдет сбой.

Вы можете изменить указанный выше код в своем приложении и сделать так, чтобы метод onReceivedSslError всегда вызывал handler.proceed(), но это не рекомендуется. Не используйте самоподписанный сертификат!

person fil maj    schedule 11.06.2012
comment
Да, я получил подписанный сертификат SSL, и он работал нормально. Спасибо за вашу помощь. - person Dean Wild; 11.06.2012
comment
@DeanWild У меня тоже такая же проблема, запрашиваете ли вы SSL-сертификат у своего провайдера / сервера API и используете его для подписи своего apk? - person JunM; 27.02.2014
comment
Нет, вы покупаете сертификат SSL у поставщика (есть много поставщиков, например: verisign.com), тогда вы установите этот SSL-сертификат на свой веб-сервер - person Dean Wild; 27.02.2014
comment
Эта ошибка может появиться даже при использовании подписанного сертификата, который браузер Chromium не знает. У меня была проблема, например. с подписанным сертификатом от RapidSSL CA, GeoTrust, Inc. Это сработало, когда я использовал другой файл, выпущенный GlobalSign nv-sa. Проблема появилась только в релизной версии... - person Paul Weber; 24.06.2015

Я сделал следующее, чтобы обойти ограничение (в настоящее время использую 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));
}
person Chris    schedule 08.08.2012