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!

Foi útil?

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

}

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top