Question

Je construis une version de test d'une application pour un client. Une partie de cette application utilise une WebView qui appelle à un site SSL. À son tour, le client a fourni un domaine de test où le nom du certificat ne correspond pas au nom de domaine complet. Hélas, ils ne sont pas en mesure de fournir un cert qui correspond. : (

Je travaille autour de cette question sur le compagnon iOS ad hoc app avec une ligne de code (encore une fois, et non pour la production - juste à des fins de test). J'ai cherché pour plus d'informations similaires sur Android OS, mais les solutions que je l'ai vu ici et ailleurs sont assez pour faire tourner la tête de mon grand temps par comparaison!

Yat-il un moyen simple de contourner cela? Même un cadre exceptionnel face à l'utilisateur caché quelque part?

Clues apprécié!

Était-ce utile?

La solution

Créer un WebViewClient et gérer la onReceivedSslError qui ressemble à ceci:

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

Dans ce rappel, vous pouvez simplement appeler handler.proceed() et la page continuera chargement. Si vous ne gérez pas ce rappel et appelez la méthode proceed() le comportement par défaut sera pour la page de ne pas charger.

Autres conseils

réponse Mise à jour selon une nouvelle mise à jour de la politique de sécurité de Google pour erreur SSL Handler, s'il vous plaît voir cette Développeurs Android Centre d'aide article .

Pour prévenir le rejet de la demande sur Google Play pour avoir violé notre politique de comportement malveillant.

Pour gérer correctement la validation du certificat SSL, modifiez votre code pour appeler SslErrorHandler.proceed () chaque fois que le certificat présenté par le serveur répond à vos attentes, et Invoke SslErrorHandler.cancel () autrement.

Par exemple, ajouter une boîte de dialogue d'alerte à l'utilisateur de faire ont confirmé et semble Google montre pas plus d'avertissement.

@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();

}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top