2012-06-10 10 views
6

Ho creato un'applicazione per PhoneGap che deve comunicare con un servizio SSL autofirmato.Phonegap/Cordova ha autorizzato la richiesta SSL del dominio incrociato non funzionante dopo l'esportazione dell'APK

ho whitelist il mio url nella res/xml/cordova.xml in questo modo:

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

e questo funziona bene quando ho eseguito e costruire da Eclipse, ma se poi esportare e firmare la mia app e manualmente installa l'APK, quindi l'app non è in grado di comunicare con il mio servizio web.

La comunicazione con il server avviene tramite la libreria Sencha tocco in questo modo:

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

Qualsiasi aiuto molto apprezzato

risposta

10

Il problema è che si sta utilizzando un CERT auto-firmato. Android WebView non consente di default certificati SSL autofirmati. PhoneGap/Cordova overrides this in the CordovaWebViewClient class ma non devia il suo comportamento di molto; se l'app è debug-signed, sarà proceed e ignorerà l'errore, altrimenti fallirà.

È possibile modificare il codice sopraindicato nell'applicazione e rendere il metodo onReceivedSslError sempre chiamato handler.proceed(), ma non è consigliabile. Non utilizzare un certificato autofirmato!

+0

Sì ho avuto un cert SSL firmato e ha funzionato bene. Grazie per l'aiuto. –

+0

@DeanWild Ho lo stesso problema, chiedi un certificato SSL dal tuo provider/server API e lo usi per firmare il tuo apk? – JunM

+0

Non si acquista un certificato SSL da un provider (ci sono molti provider, ad esempio: http://www.verisign.com/), quindi si installa questo certificato SSL sul server Web –

3

Ho fatto quanto segue per ovviare alla restrizione (attualmente utilizzando Cordova 1.7.0). Questo è sicuramente intrinsecamente insicuro:

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

e poi nell'attività principale:

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

    //pass in our webviewclient to override SSL error 
    this.setWebViewClient(this.appView, new MyWebViewClient(this)); 
} 
Problemi correlati