Domanda

Sto costruendo una versione di prova di un app per un cliente. Una parte di questa applicazione utilizza un WebView che chiama a un sito basato su SSL. A sua volta, il cliente ha fornito un dominio di prova in cui il nome del certificato non corrisponde al nome di dominio completo. Ahimè, non sono in grado di provisioning di un cert che le partite. : (

Sto lavorando a questo problema sul compagno di iOS ad hoc app con una riga di codice (di nuovo, non per uso di produzione - solo a scopo di test). Ho cercato informazioni simili su sistema operativo Android, ma le soluzioni che ho visto qui e altrove, sono abbastanza per fare girare la testa alla grande in confronto!

C'è un modo semplice per ovviare a questo? Anche un ambiente user-fronte nascosto da qualche parte?

Gli indizi apprezzato!

È stato utile?

Soluzione

Crea un WebViewClient e gestire l'onReceivedSslError che assomiglia a questo:

public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error)

All'interno di questo callback si può chiamare handler.proceed() e la pagina continuerà il caricamento. Se non si gestisce questo callback e chiama il metodo proceed() poi il comportamento di default sarà per la pagina non a carico.

Altri suggerimenti

Risposta Aggiornato secondo nuovo aggiornamento Politica di sicurezza di Google per errore SSL Handler, si prega di vedere questo Android Developers Centro assistenza .

Per prevenire il rigetto di applicazione su Google Play per aver violato la nostra politica di comportamenti dannosi.

Consente di gestire correttamente la convalida dei certificati SSL, modificare il codice per richiamare SslErrorHandler.proceed () ogni volta che il certificato presentato dal server soddisfa le vostre aspettative, e invocare SslErrorHandler.cancel (altrimenti).

Per esempio, aggiungo una finestra di avviso per l'utente make hanno confermato e sembra che Google non mostra più di avvertimento.

@Override
public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
 String message = "SSL Certificate error.";
    switch (error.getPrimaryError()) {
        case SslError.SSL_UNTRUSTED:
            message = "The certificate authority is not trusted.";
            break;
        case SslError.SSL_EXPIRED:
            message = "The certificate has expired.";
            break;
        case SslError.SSL_IDMISMATCH:
            message = "The certificate Hostname mismatch.";
            break;
        case SslError.SSL_NOTYETVALID:
            message = "The certificate is not yet valid.";
            break;
    }
    message += " Do you want to continue anyway?";

    builder.setTitle("SSL Certificate Error");
    builder.setMessage(message);

builder.setPositiveButton("continue", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        handler.proceed();
    }
});
builder.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        handler.cancel();
    }
});
final AlertDialog dialog = builder.create();
dialog.show();

}

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top