Android WebView SSL 'Aviso de segurança'
-
26-09-2019 - |
Pergunta
Estou construindo uma versão de teste de um aplicativo para um cliente. Parte deste aplicativo usa um WebView que chama para um site baseado em SSL. Por sua vez, o cliente forneceu um domínio de teste em que o nome do certificado não corresponde ao FQDN. Infelizmente, eles não estão em posição de provisionar um certificado que corresponda. :(
Estou trabalhando nessa edição no aplicativo ADPER IOS AD HOC com uma linha de código (novamente, não para uso da produção - apenas para fins de teste). Eu procurei informações semelhantes sobre o sistema operacional Android, mas as soluções que eu vi aqui e em outros lugares são suficientes para fazer minha cabeça girar muito em comparação!
Existe uma maneira direta de contornar isso? Mesmo uma configuração voltada para o usuário escondida em algum lugar?
Pistas apreciadas!
Solução
Crie um WebViewClient e manuseie o OnReceivedSSLERRor que se parece com o seguinte:
public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error)
Dentro deste retorno de chamada, você pode simplesmente ligar handler.proceed()
e a página continuará carregando. Se você não lidar com este retorno de chamada e ligar para o proceed()
Método, então, o comportamento padrão será para a página não carregar.
Outras dicas
Resposta atualizada De acordo Artigo do centro de ajuda.
Para impedir a rejeição da aplicação no Google Play por violar nossa política de comportamento malicioso.
Para lidar adequadamente com a validação do certificado SSL, altere seu código para invocar o SSLERRORHANDLER.PROECED () sempre que o certificado apresentado pelo servidor atende às suas expectativas e invoque o sslerrorhandler.cancel () de outra forma.
Por exemplo, adiciono uma caixa de diálogo de alerta para fazer o usuário confirmar e parece que o Google não mostra mais aviso.
@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();
}