Como ignorar o certificado SSL (confiar em todos) para Apache HttpClient 4.3 ?
Todas as respostas que encontrei no SO tratam de versões anteriores e a API mudou.
Relacionado:
- Como ignorar erros de certificado SSL no Apache HttpClient 4.0
- Como lidar com certificados SSL inválidos com Apache HttpClient?
- Precisa confiar em todos os certificados durante o desenvolvimento usando Spring
- Ignorar erros de certificado SSL com Java
Editar:
- É apenas para fins de teste. Crianças, não experimentem em casa (ou na produção)
java
ssl
apache-httpcomponents
Jakub M.
fonte
fonte
SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER
SSLContextBuilder
são encontradas pelo Idea.Se você estiver usando o procedimento PoolingHttpClientConnectionManager acima não funcionar, o SSLContext personalizado será ignorado. Você deve passar socketFactoryRegistry no contructor ao criar PoolingHttpClientConnectionManager.
fonte
HttpClients.custom().setConnectionManager(cm).build()
eHttpClients.custom().setSSLSocketFactory(connectionFactory).build()
funcionarão, então você não precisa criar umaPoolingHttpClientConnectionManager
Como um complemento à resposta de @mavroprovato, se você quiser confiar em todos os certificados em vez de apenas autoassinados, você o faria (no estilo do seu código)
ou (copiar e colar direto do meu próprio código):
E se você quiser pular a verificação do nome do host também, você precisa definir
também. (ALLOW_ALL_HOSTNAME_VERIFIER está obsoleto).
Aviso obrigatório: você realmente não deveria fazer isso, aceitar todos os certificados é uma coisa ruim. No entanto, existem alguns casos de uso raros em que você deseja fazer isso.
Como uma observação ao código fornecido anteriormente, você desejará fechar a resposta mesmo se httpclient.execute () lançar uma exceção
O código acima foi testado usando
E para os interessados, aqui está meu conjunto de testes completo:
(projeto de teste funcionando no github )
fonte
Um pequeno acréscimo à resposta de vasekt:
A solução fornecida com o SocketFactoryRegistry funciona ao usar PoolingHttpClientConnectionManager.
No entanto, as conexões via http simples não funcionam mais. Você precisa adicionar um PlainConnectionSocketFactory para o protocolo http para fazê-los funcionar novamente:
fonte
http
protocolo está sendo usadoPlainConnectionSocketFactory
por padrão. Eu apenas me registreihttps
ehttpclient
ainda posso obter URLs HTTP simples. portanto, não acho que essa etapa seja necessária.PoolingHttpClientConnectionManager
Depois de tentar várias opções, a configuração a seguir funcionou para http e https
Estou usando http-client 4.3.3 -
compile 'org.apache.httpcomponents:httpclient:4.3.3'
fonte
Código de trabalho mais simples e curto:
fonte
Aqui está uma destilação de trabalho das técnicas acima, equivalente a "curl --insecure":
fonte
Ao usar o cliente http 4.5, tive que usar o javasx.net.ssl.HostnameVerifier para permitir qualquer nome de host (para fins de teste). Aqui está o que acabei fazendo:
fonte
SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContextBuilder.build(), hostnameVerifierAllowAll);
porSSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContextBuilder.build(), (hostName, sslSession) -> true);
. Isso evita a classe anônima e torna o código um pouco mais legível.No topo da
PoolingHttpClientConnectionManager
juntamente comRegistry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create().register("https", sslFactory).build();
Se você quiser um assíncrono httpclient usandoPoolingNHttpClientConnectionManager
o código shoudl ser semelhante ao seguintefonte
Se você estiver usando
HttpClient 4.5.x
, seu código pode ser semelhante ao seguinte:fonte
fonte
Confie em todos os certificados no cliente Apache HTTP
fonte
(Eu teria acrescentado um comentário diretamente à resposta de vasekt, mas não tenho pontos de reputação suficientes (não tenho certeza da lógica aqui)
Enfim ... o que eu queria dizer é que mesmo que você não esteja explicitamente criando / solicitando um PoolingConnection, não significa que você não esteja recebendo um.
Eu estava enlouquecendo tentando descobrir por que a solução original não funcionou para mim, mas ignorei a resposta de vinekt, pois "não se aplicava ao meu caso" - errado!
Eu estava olhando para o meu stack-trace quando baixo e eis que vi um PoolingConnection no meio dele. Bang - cansei sua adição e sucesso !! (nossa demonstração é amanhã e eu estava ficando desesperado) :-)
fonte
Você pode usar o seguinte snippet de código para obter a instância HttpClient sem a verificação de certificação SSL.
fonte
Leve ajuste para responder de @divbyzero acima para corrigir os avisos de segurança do sonar
fonte
Inicialmente, consegui desabilitar o host local usando a estratégia de confiança, depois adicionei NoopHostnameVerifier. Agora funcionará tanto para localhost quanto para qualquer nome de máquina
fonte