2012-06-10 15 views
6

Stworzyłem aplikację phonegap, która musi komunikować się z samopodpisaną usługą SSL.Phonegap/Cordova do białej listy żądanie SSL domeny nie działa po wyeksportowaniu APK

I whitelisted mój adres URL w res/xml/cordova.xml tak:

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

i to działa dobrze, gdy biegnę i zbudować od zaćmienia ale gdybym wtedy eksport i podpisać moją aplikację i ręcznie zainstaluj pakiet APK, a aplikacja nie będzie mogła komunikować się z moją usługą internetową.

Komunikacja z serwerem odbywa się przy użyciu biblioteki Sencha Touch jak tak:

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

Każda pomoc mile widziane

Odpowiedz

10

Problemem jest używasz samopodpisany cert. Android WebView nie zezwala na domyślne, samopodpisane certyfikaty SSL. PhoneGap/Cordova overrides this in the CordovaWebViewClient class ale nie odstaje od jego zachowania o wiele; jeśli aplikacja jest podpisana przez debugowanie, będzie proceed i zignorować błąd, w przeciwnym razie nie powiedzie się.

Możesz zmienić powyższy link do kodu w swojej aplikacji i ustawić metodę onReceivedSslError zawsze wywołując handler.proceed() - ale nie jest to zalecane. Nie używaj certyfikatu z podpisem własnym!

+0

Tak mam podpisaną cert SSL i to działało dobrze. Dzięki za pomoc. –

+0

@DeanWild Mam również ten sam problem, czy pytasz o certyfikat SSL od twojego dostawcy/serwera api i używasz go do podpisania apk? – JunM

+0

Nie kupujesz certyfikatu SSL od dostawcy (jest wielu dostawców, np .: http://www.verisign.com/), a następnie zainstalujesz ten certyfikat SSL na swoim serwerze WWW –

3

Wykonałem następujące czynności, aby ominąć to ograniczenie (obecnie używa się Cordova 1.7.0). Jest to z pewnością z natury niepewne:

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); 
     //} 
    } 
} 

a następnie w głównym działalności:

@Override 
public void init() { 
    super.init(); 

    //pass in our webviewclient to override SSL error 
    this.setWebViewClient(this.appView, new MyWebViewClient(this)); 
} 
Powiązane problemy