2010-09-02 5 views
9

Je suis en train de créer une version test d'une application pour un client. Une partie de cette application utilise un WebView qui appelle un site basé sur SSL. À son tour, le client a fourni un domaine de test dans lequel 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 suis en train de contourner ce problème sur l'application ad hoc iOS compagnon avec une ligne de code (encore une fois, pas pour une utilisation en production - juste à des fins de test) .J'ai cherché des informations similaires sur Android OS, mais les solutions que j'ai vu ici et ailleurs sont assez pour faire tourner la tête de mon grand temps par comparaison!Android WebView SSL 'Avertissement de sécurité'

est-il un moyen simple de contourner cela? Même un utilisateur face à réglage caché quelque part?

Clues

Répondre

6

Créez un WebViewClient et gérez l'onReceivedSslError qui ressemble à ceci:

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

À l'intérieur de ce rappel, vous pouvez simplement appeler handler.proceed() et la page continuera le chargement. Si vous ne gérez pas ce rappel et appelez la méthode proceed(), le comportement par défaut sera que la page ne soit pas chargée.

+1

AVERTISSEMENT: Ceci est dangereux - il supprime toute sécurité de SSL. Je sais que Joe veut l'inclure uniquement dans son application de test, ce qui est bien, mais la communauté de la sécurité a vu de nombreux cas où ce type de code se retrouve par inadvertance dans des versions de production compromettant leur sécurité. Donc, si vous désactivez la sécurité comme ceci, soyez très prudent pour vous assurer qu'il ne se propage pas à vos versions. Merci d'avoir écouté cette annonce de service public. –

0

Mise à jour de la réponse selon la nouvelle mise à jour de la politique de sécurité de Google pour le gestionnaire d'erreurs SSL, s'il vous plaît voir cette Android Developers Help Center article.

Pour empêcher le rejet de l'application sur Google Play en cas de violation de notre politique de comportement malveillant.

Pour gérer correctement la validation du certificat SSL, changez votre code pour appeler SslErrorHandler.proceed() chaque fois que le certificat présenté par le serveur répond à vos attentes, et invoquez SslErrorHandler.cancel() dans le cas contraire. Par exemple, j'ajoute une boîte de dialogue d'alerte pour que l'utilisateur confirme et semble que Google ne montre 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(); 

}