Estou fazendo uma postagem https e estou recebendo uma exceção de exceção SSL. Certificado de servidor não confiável. Se eu fizer o http normal, ele está funcionando perfeitamente bem. Tenho que aceitar o certificado do servidor de alguma forma?
101
Respostas:
Estou tentando adivinhar, mas se você quiser que um handshake real ocorra, é necessário informar ao Android sobre o seu certificado. Se você deseja apenas aceitar, não importa o que aconteça, use este pseudocódigo para obter o que você precisa com o cliente HTTP Apache:
CustomSSLSocketFactory:
FullX509TrustManager é uma classe que implementa javax.net.ssl.X509TrustManager, mas nenhum dos métodos realmente executa qualquer trabalho, obtenha uma amostra aqui .
Boa sorte!
fonte
FullX509TrustManager
Isso é o que estou fazendo. Ele simplesmente não verifica mais o certificado.
e
fonte
javax.net.ssl.SSLException: Received fatal alert: bad_record_mac
. Também tentei substituirTLS
por,SSL
mas não ajudou. Por favor me ajude, obrigadoAo tentar responder a esta pergunta, encontrei um tutorial melhor. Com ele, você não precisa comprometer a verificação do certificado.
http://blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html
* Eu não escrevi isso, mas agradeço a Bob Lee pelo trabalho
fonte
Você também pode ler o artigo do meu blog, muito parecido com o crazybobs.
Esta solução também não compromete a verificação de certificado e explica como adicionar certificados confiáveis em seu próprio armazenamento de chaves.
http://blog.antoine.li/index.php/2010/10/android-trusting-ssl-certificates/
fonte
http://madurangasblogs.blogspot.in/2013/08/avoiding-javaxnetsslsslpeerunverifiedex.html
Cortesia Maduranga
Ao desenvolver um aplicativo que usa https, seu servidor de teste não tem um certificado SSL válido. Ou às vezes o site está usando um certificado autoassinado ou o site está usando um certificado SSL gratuito. Portanto, se você tentar se conectar ao servidor usando Apache
HttpClient
, obterá uma exceção informando que o "par não autenticado". Embora não seja uma boa prática confiar em todos os certificados de um software de produção, pode ser necessário fazer isso de acordo com a situação. Esta solução resolve a exceção causada por "par não autenticado".Mas antes de irmos para a solução, devo avisar que esta não é uma boa ideia para um aplicativo de produção. Isso violará o propósito de usar um certificado de segurança. Portanto, a menos que você tenha um bom motivo ou tenha certeza de que isso não causará nenhum problema, não use esta solução.
Normalmente você cria um
HttpClient
assim.HttpClient httpclient = new DefaultHttpClient();
Mas você tem que mudar a maneira como cria o HttpClient.
Primeiro você deve criar uma extensão de classe
org.apache.http.conn.ssl.SSLSocketFactory
.Em seguida, crie um método como este.
Então você pode criar o
HttpClient
.HttpClient httpclient = getNewHttpClient();
Se você está tentando enviar uma solicitação de postagem para uma página de login, o resto do código seria assim.
Você obtém a página html para o InputStream. Então você pode fazer o que quiser com a página html retornada.
Mas aqui você enfrentará um problema. Se você deseja gerenciar uma sessão usando cookies, não poderá fazê-lo com este método. Se quiser obter os cookies, terá de o fazer através de um navegador. Então, só você receberá cookies.
fonte
Se você estiver usando um certificado StartSSL ou Thawte, haverá falha no Froyo e em versões anteriores. Você pode usar o repositório CAcert de uma versão mais recente em vez de confiar em todos os certificados.
fonte
Nenhum desses funcionou para mim (agravado pelo bug Thawte também). Eventualmente, resolvi o problema com a aceitação de SSL autoassinado no Android e o tratamento de SSL personalizado parou de funcionar no Android 2.2 FroYo
fonte
Nenhuma dessas respostas funcionou para mim, então aqui está o código que confia em qualquer certificado.
fonte
Não sei sobre as especificações do Android para certificados SSL, mas faria sentido que o Android não aceite um certificado SSL autoassinado de cara. Encontrei esta postagem de fóruns do Android que parece abordar o mesmo problema: http://androidforums.com/android-applications/950-imap-self-signed-ssl-certificates.html
fonte
Este é um problema conhecido do Android 2.x. Eu estava lutando com esse problema por uma semana até que me deparei com a seguinte pergunta, que não só fornece um bom histórico do problema, mas também fornece uma solução funcional e eficaz, sem falhas de segurança.
Erro 'Nenhum certificado de mesmo nível' no Android 2.3, mas NÃO no 4
fonte
Por algum motivo, a solução mencionada para httpClient acima não funcionou para mim. No final, consegui fazer funcionar, substituindo corretamente o método ao implementar a classe SSLSocketFactory personalizada.
É assim que funcionou perfeitamente para mim. Você pode ver a classe personalizada completa e a implementação no seguinte tópico: http://blog.syedgakbar.com/2012/07/21/android-https-and-not-trusted-server-certificate-error/
fonte
Eu fiz esta aula e encontrei
em seu código branco isso
fonte
Fontes que me ajudaram a trabalhar com meu certificado autoassinado em meu servidor AWS Apache e conectar com HttpsURLConnection do dispositivo Android:
SSL na instância aws - tutorial amazon em ssl
Android Security com HTTPS e SSL - criando seu próprio gerenciador de confiança no cliente para aceitação seu certificado
Criando certificado autoassinado - script fácil para criar seus certificados
Então eu fiz o seguinte:
create_my_certs.sh
:bash create_my_certs.sh yourdomain.com
Coloque os certificados em seus lugares apropriados no servidor (você pode encontrar a configuração em /etc/httpd/conf.d/ssl.conf). Todos eles devem ser definidos:
SSLCertificateFile
SSLCertificateKeyFile
SSLCertificateChainFile
SSLCACertificateFile
Reinicie o httpd usando
sudo service httpd restart
e certifique-se de que o httpd tenha iniciado:Parando o httpd: [OK]
Iniciando o httpd: [OK]
Copie
my-private-root-ca.cert
para a pasta de ativos do projeto AndroidCrie seu gerente de confiança:
SSLContext SSLContext;
CertificateFactory cf = CertificateFactory.getInstance ("X.509"); InputStream caInput = context.getAssets (). Open ("my-private-root-ca.cert.pem"); Certificado ca; tente {ca = cf.generateCertificate (caInput); } finalmente {caInput.close (); }
E faça a conexão usando HttpsURLConnection:
Conexão HttpsURLConnection = (HttpsURLConnection) url.openConnection (); connection.setSSLSocketFactory (SSLContext.getSocketFactory ());
É isso, tente sua conexão https.
fonte
Provavelmente você pode tentar algo assim. Isso me ajudou
fonte
Basta usar este método como seu HTTPClient:
fonte