Eu tenho uma classe que baixará um arquivo de um servidor https . Quando eu o executo, ele retorna muitos erros. Parece que tenho um problema com meu certificado. É possível ignorar a autenticação cliente-servidor? Se sim, como?
package com.da;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.CharBuffer;
import java.util.concurrent.Future;
import org.apache.http.HttpResponse;
import org.apache.http.client.utils.URIUtils;
import org.apache.http.impl.nio.client.DefaultHttpAsyncClient;
import org.apache.http.nio.IOControl;
import org.apache.http.nio.client.HttpAsyncClient;
import org.apache.http.nio.client.methods.AsyncCharConsumer;
import org.apache.http.nio.client.methods.HttpAsyncGet;
import org.apache.http.nio.client.methods.HttpAsyncPost;
public class RSDDownloadFile {
static FileOutputStream fos;
public void DownloadFile(String URI, String Request) throws Exception
{
java.net.URI uri = URIUtils.createURI("https", "176.66.3.69:6443", -1, "download.aspx",
"Lang=EN&AuthToken=package", null);
System.out.println("URI Query: " + uri.toString());
HttpAsyncClient httpclient = new DefaultHttpAsyncClient();
httpclient.start();
try {
Future<Boolean> future = httpclient.execute(
new HttpAsyncGet(uri),
new ResponseCallback(), null);
Boolean result = future.get();
if (result != null && result.booleanValue()) {
System.out.println("\nRequest successfully executed");
} else {
System.out.println("Request failed");
}
}
catch(Exception e){
System.out.println("[DownloadFile] Exception: " + e.getMessage());
}
finally {
System.out.println("Shutting down");
httpclient.shutdown();
}
System.out.println("Done");
}
static class ResponseCallback extends AsyncCharConsumer<Boolean> {
@Override
protected void onResponseReceived(final HttpResponse response) {
System.out.println("Response: " + response.getStatusLine());
System.out.println("Header: " + response.toString());
try {
//if(response.getStatusLine().getStatusCode()==200)
fos = new FileOutputStream( "Response.html" );
}catch(Exception e){
System.out.println("[onResponseReceived] Exception: " + e.getMessage());
}
}
@Override
protected void onCharReceived(final CharBuffer buf, final IOControl ioctrl) throws IOException {
try
{
while (buf.hasRemaining())
{
//System.out.print(buf.get());
fos.write(buf.get());
}
}catch(Exception e)
{
System.out.println("[onCharReceived] Exception: " + e.getMessage());
}
}
@Override
protected void onCleanup() {
try
{
if(fos!=null)
fos.close();
}catch(Exception e){
System.out.println("[onCleanup] Exception: " + e.getMessage());
}
System.out.println("onCleanup()");
}
@Override
protected Boolean buildResult() {
return Boolean.TRUE;
}
}
}
Erros:
URI Query: https://176.66.3.69:6443/download.aspx?Lang=EN&AuthToken=package
Aug 2, 2011 3:47:57 PM org.apache.http.impl.nio.client.NHttpClientProtocolHandler exception
SEVERE: I/O error: General SSLEngine problem
javax.net.ssl.SSLHandshakeException: General SSLEngine problem
at com.sun.net.ssl.internal.ssl.Handshaker.checkThrown(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLEngineImpl.checkTaskThrown(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLEngineImpl.writeAppRecord(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLEngineImpl.wrap(Unknown Source)
at javax.net.ssl.SSLEngine.wrap(Unknown Source)
at org.apache.http.impl.nio.reactor.SSLIOSession.doHandshake(SSLIOSession.java:154)
at org.apache.http.impl.nio.reactor.SSLIOSession.isAppInputReady(SSLIOSession.java:276)
at org.apache.http.impl.nio.client.InternalClientEventDispatch.inputReady(InternalClientEventDispatch.java:79)
at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:161)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:335)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:275)
at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104)
at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:542)
at java.lang.Thread.run(Unknown Source)
Caused by: javax.net.ssl.SSLHandshakeException: General SSLEngine problem
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLEngineImpl.fatal(Unknown Source)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source)
at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source)
at com.sun.net.ssl.internal.ssl.Handshaker$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.net.ssl.internal.ssl.Handshaker$DelegatedTask.run(Unknown Source)
at org.apache.http.impl.nio.reactor.SSLIOSession.doHandshake(SSLIOSession.java:180)
... 9 more
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.validator.PKIXValidator.doBuild(Unknown Source)
at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
at sun.security.validator.Validator.validate(Unknown Source)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(Unknown Source)
... 16 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
at java.security.cert.CertPathBuilder.build(Unknown Source)
... 21 more
onCleanup()
[DownloadFile] Exception: javax.net.ssl.SSLHandshakeException: General SSLEngine problem
Shutting down
Done
java
ssl
https
ssl-certificate
neztreh
fonte
fonte
Respostas:
O problema aparece quando o servidor possui certificado autoassinado. Para solucionar esse problema, você pode adicionar este certificado à lista de certificados confiáveis da sua JVM.
Neste artigo, o autor descreve como buscar o certificado do seu navegador e adicioná-lo ao arquivo cacerts da sua JVM. Você pode editar o
JAVA_HOME/jre/lib/security/cacerts
arquivo ou executar seu aplicativo com o-Djavax.net.ssl.trustStore
parâmetro Verifique também qual JDK / JRE você está usando, pois isso geralmente é uma fonte de confusão.Consulte também: Como os nomes dos servidores de certificados SSL são resolvidos / Posso adicionar nomes alternativos usando o keytool? Se você encontrar uma
java.security.cert.CertificateException: No name matching localhost found
exceção.fonte
cacerts
devem ser atualizadosAqui está o que funciona de maneira confiável para mim no macOS. Substitua example.com e 443 pelo nome do host e porta reais aos quais você está tentando se conectar e forneça um alias personalizado. O primeiro comando baixa o certificado fornecido do servidor remoto e o salva localmente no formato x509. O segundo comando carrega o certificado salvo no armazenamento confiável SSL do Java.
fonte
Eu tive o mesmo problema com um certificado curinga assinado válido da symantec.
Primeiro, tente executar seu aplicativo java com -Djavax.net.debug = SSL para ver o que realmente está acontecendo.
Acabei importando o certificado intermediário que estava causando a quebra da cadeia de certificação .
Fiz o download do certificado intermediário ausente da symantec (você pode ver o link para o certificado ausente no log de handshake ssl: http://svrintl-g3-aia.verisign.com/SVRIntlG3.cer no meu caso).
E eu importei o certificado no keystore java. Após importar o certificado intermediário, meu certificado curinga ssl finalmente começou a funcionar:
fonte
-Djavax.net.debug=ssl,handshake -Djavax.net.ssl.keyStoreType=PKCS12 -Djavax.net.ssl.keyStore=our-client-certs -Djavax.net.ssl.trustStoreType=jks -Djavax.net.ssl.trustStore=their-server-certs
JRE_HOME/bin
ouJDK/JRE/bin
keytool -keystore ..\lib\security\cacerts -import -alias your.ssl.server.name -file .\relative-path-to-cert-file\your.ssl.server.name.crt
fonte
changeit
( stackoverflow.com/a/22782035/1304830 ). Certifique-se também de executar o cmd como administrador.A resposta de @Gabe Martin-Dempesy é ajudada para mim. E eu escrevi um pequeno script relacionado a ele. O uso é muito simples.
Instale um certificado do host:
Remova o certificado que já está instalado.
java-cert-importer.sh
fonte
./java-cert-importer.sh example.com 1234
). É isso aí.Citação de No more 'incapaz de encontrar o caminho de certificação válido para o destino solicitado'
Experimente o código fornecido lá. Isso pode ajudar.
fonte
Isso resolveu meu problema,
Precisamos importar o certificado para o java local. Caso contrário, poderíamos obter a exceção abaixo.
SSLPOKE é uma ferramenta na qual você pode testar a conectividade https na sua máquina local.
Comando para testar a conectividade:
isso solicitaria primeiro "Digite a senha do keystore:"
changeit
é a senha padrão. e, finalmente, um prompt "Confiar neste certificado? [não]:", forneça "yes" para adicionar o certificado ao keystore.Verficação:
fonte
Consegui fazê-lo funcionar apenas com código, ou seja, não há necessidade de usar o keytool:
fonte
A origem desse erro na minha instância do Apache 2.4 (usando um certificado curinga Comodo) era um caminho incompleto para o certificado raiz assinado SHA-1. Havia várias cadeias no certificado emitido e a cadeia que levava a um certificado raiz SHA-1 estava sem um certificado intermediário . Navegadores modernos sabem como lidar com isso, mas o Java 7 não o trata por padrão (embora existam algumas maneiras complicadas de fazer isso no código). O resultado são mensagens de erro que parecem idênticas ao caso de certificados autoassinados:
Nesse caso, a mensagem "não é possível encontrar o caminho de certificação válido para o destino solicitado" está sendo produzida devido à falta do certificado intermediário. Você pode verificar qual certificado está ausente usando o SSL Labs teste no servidor. Depois de encontrar o certificado apropriado, faça o download e (se o servidor estiver sob seu controle), adicione-o ao pacote de certificados. Como alternativa, você pode importar o certificado ausente localmente. Acomodar esse problema no servidor é uma solução mais geral para o problema.
fonte
Somente para Windows, siga estas etapas:
fonte
Para quem gosta de Debian e Java pré-empacotado:
Não se esqueça de verificar
/etc/default/cacerts
:Para remover o cert:
fonte
Isso também pode ser causado pelo uso de certificados GoDaddy com Java 7 assinados usando SHA2.
O Chrome e todos os outros navegadores estão começando a descontinuar certificados SSL assinados usando o SHA1, pois não é tão seguro.
Mais informações sobre o problema podem ser encontradas aqui , além de como resolvê-lo em seu servidor, se você precisar agora.
fonte
Eu tive o mesmo problema com o erro de certificados e foi por causa do SNI, e o cliente http que eu usei não teve o SNI implementado. Então, uma atualização de versão fez o trabalho
fonte
ATUALIZAÇÃO: Que uma reinicialização ajudou foi coincidência (eu esperava, hooray!). A verdadeira causa do problema foi a seguinte: quando o Gradle é direcionado para usar um keystore específico, esse keystore também deve conter todos os certificados raiz oficiais. Caso contrário, ele não poderá acessar bibliotecas de repositórios regulares. O que eu tinha que fazer era isso:
Importe o certificado autoassinado:
Adicione os certificados raiz oficiais:
Talvez o daemon Gradle também tenha atrapalhado. Pode valer a pena matar todos os daemons em execução encontrados,
./gradlew --status
se as coisas começarem a parecer sombrias.POSTAGEM ORIGINAL:
Ninguém vai acreditar nisso, eu sei. Ainda assim, se tudo mais falhar, tente: Após a reinicialização do meu Mac, o problema desapareceu. Grrr.
Background: ./gradlew jar continuava me dando "incapaz de encontrar um caminho de certificação válido para o destino solicitado"
Estou com um certificado autoassinado, salvo no navegador, importado em privateKeystore.jks. Em seguida, instruiu Gradle a trabalhar com privateKeystore.jks:
Como mencionado, isso só funcionou após uma reinicialização.
fonte
O AVG versão 18.1.3044 (com Windows 10) interfere no meu aplicativo local do Spring.
Solução: entre na seção AVG chamada "Web e email" e desative a "proteção de email". O AVG bloqueia o certificado se o site não for seguro.
fonte
Verifique se o https://176.66.3.69:6443/ possui um certificado válido. você pode verificá-lo através do navegador em primeiro lugar, se funcionar no navegador, ele funcionará em java.
isso está funcionando pra mim
fonte
Há muitas maneiras de resolver isso ...
Uma maneira é definir os certificados TrustStore em um arquivo keystore e colocá-lo no caminho do aplicativo, e definir essas propriedades do sistema no método principal:
Outra maneira é colocar o keystore como arquivo de recurso dentro do arquivo jar do projeto e carregá-lo:
No Windows, você também pode tentar esta solução: https://stackoverflow.com/a/59056537/980442
Criei o arquivo keystore a partir de um
.crt
arquivo CA da autoridade de certificação desta maneira:FYI: https://docs.oracle.com/javadb/10.8.3.0/adminguide/cadminsslclient.html
fonte
Você tem duas opções, importe o certificado autoassinado no keystore do java para cada jvm em que o software será executado ou tente a fábrica ssl não validada:
fonte
Teve o problema como esta imagem.
Tentei algumas soluções. Mas descobriu que, mesmo que seja o mesmo projeto, quando estiver no local de trabalho de outras pessoas, está totalmente bem. Não são necessárias configurações extras. Então achamos que é uma questão ambiental. Tentamos alterar a versão do JDK, IDE, mas não funcionou. demorou cerca de 4 horas para a investigação, até tentarmos a resposta mais bem avaliada. Não encontrei o erro mencionado nessa resposta, mas descobri no meu navegador sobre o URL HTTP (bloqueio) que havia uma certificação de Charles. Então eu percebi que meu Charles estava ligado o tempo todo. Desde que eu desliguei, tudo funcionou bem.
Então, deixei minha experiência que poderia ser útil para o seu caso.
fonte
No meu caso, estou executando o MacOs High Sierra com Java 1.6. O arquivo cacert está em um local diferente do mencionado acima na resposta de Gabe Martin-Dempesy. O arquivo cacert também já estava vinculado a outro local (/ Library / Internet Plug-Ins / JavaAppletPlugin.plugin / Contents / Home / lib / security / cacerts).
Usando o FireFox, eu exportei o certificado do site em questão para um arquivo local chamado "exportedCertFile.crt". A partir daí, usei o keytool para mover o certificado para o arquivo cacert. Isso resolveu o problema.
fonte
primeiro Baixe o certificado ssl e, em seguida, você pode ir para o caminho do java bin e executar o comando abaixo no console.
fonte
No meu caso, eu tinha o keystore e o armazenamento confiável com o mesmo certificado, portanto, a remoção do armazenamento confiável ajudou. Às vezes, a cadeia de certificados pode ser um problema se você tiver várias cópias de certificados.
fonte