Tengo una clase que descargará un archivo de un servidor https . Cuando lo ejecuto, devuelve muchos errores. Parece que tengo un problema con mi certificado. ¿Es posible ignorar la autenticación cliente-servidor? ¿Si es así, cómo?
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;
}
}
}
Errores:
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
fuente
fuente
Respuestas:
El problema aparece cuando su servidor tiene un certificado autofirmado. Para solucionarlo, puede agregar este certificado a la lista de certificados de confianza de su JVM.
En este artículo, el autor describe cómo obtener el certificado de su navegador y agregarlo al archivo cacerts de su JVM. Puede editar el
JAVA_HOME/jre/lib/security/cacerts
archivo o ejecutar su aplicación con el-Djavax.net.ssl.trustStore
parámetro. Verifique qué JDK / JRE está utilizando también, ya que esto a menudo es una fuente de confusión.Consulte también: ¿Cómo se resuelven los nombres del servidor de certificados SSL / ¿Puedo agregar nombres alternativos usando keytool? Si te topas con la
java.security.cert.CertificateException: No name matching localhost found
excepción.fuente
cacerts
deben actualizarseEsto es lo que funciona de manera confiable para mí en macOS. Asegúrese de reemplazar example.com y 443 con el nombre de host y el puerto reales al que intenta conectarse, y proporcione un alias personalizado. El primer comando descarga el certificado proporcionado del servidor remoto y lo guarda localmente en formato x509. El segundo comando carga el certificado guardado en el almacén de confianza SSL de Java.
fuente
Tuve el mismo problema con un certificado comodín firmado válido de Symantec.
Primero intente ejecutar su aplicación Java con -Djavax.net.debug = SSL para ver qué está sucediendo realmente.
Terminé importando el certificado intermedio que estaba causando la ruptura de la cadena de certificados .
Descargué el certificado intermedio faltante de Symantec (puede ver el enlace de descarga del certificado faltante en el registro de protocolo de enlace SSL: http://svrintl-g3-aia.verisign.com/SVRIntlG3.cer en mi caso).
E importé el certificado en el almacén de claves de Java. Después de importar el certificado intermedio, mi certificado SSL comodín finalmente comenzó a funcionar:
fuente
-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
oJDK/JRE/bin
keytool -keystore ..\lib\security\cacerts -import -alias your.ssl.server.name -file .\relative-path-to-cert-file\your.ssl.server.name.crt
fuente
changeit
( stackoverflow.com/a/22782035/1304830 ). También asegúrese de ejecutar cmd como administrador.La respuesta de @Gabe Martin-Dempesy me ayudó. Y escribí un pequeño guión relacionado con él. El uso es muy simple.
Instale un certificado del host:
Elimine el certificado que ya se instaló.
java-cert-importer.sh
fuente
./java-cert-importer.sh example.com 1234
). Eso es.Citando de No más "no se puede encontrar la ruta de certificación válida para el objetivo solicitado"
Pruebe el código provisto allí. Podría ayudar.
fuente
Esto resolvió mi problema,
Necesitamos importar el certificado en el Java local. Si no, podríamos obtener la siguiente excepción.
SSLPOKE es una herramienta donde puede probar la conectividad https desde su máquina local.
Comando para probar la conectividad:
esto primero indicaría "Ingresar contraseña del almacén de claves:"
changeit
es la contraseña predeterminada. y finalmente un mensaje "¿Confía en este certificado? [no]:", proporcione "sí" para agregar el certificado al almacén de claves.Verificación:
fuente
Pude hacerlo funcionar solo con código, es decir, no es necesario usar keytool:
fuente
El origen de este error en mi instancia de Apache 2.4 (usando un certificado comodín Comodo) fue una ruta incompleta al certificado raíz firmado SHA-1. Había varias cadenas en el certificado emitido, y la cadena que conducía a un certificado raíz SHA-1 no tenía un certificado intermedio . Los navegadores modernos saben cómo manejar esto, pero Java 7 no lo maneja de manera predeterminada (aunque hay algunas formas complicadas de lograr esto en el código). El resultado son mensajes de error que parecen idénticos al caso de los certificados autofirmados:
En este caso, se está produciendo el mensaje "no se puede encontrar la ruta de certificación válida para el objetivo solicitado" debido a la falta del certificado intermedio. Puede verificar qué certificado falta con la prueba SSL Labs en el servidor. Una vez que encuentre el certificado apropiado, descárguelo y (si el servidor está bajo su control) agréguelo al paquete de certificados. Alternativamente, puede importar el certificado que falta localmente. Acomodar este problema en el servidor es una solución más general al problema.
fuente
Solo para Windows, siga estos pasos:
fuente
Para quienes gustan de Debian y Java preempaquetado:
No olvides verificar
/etc/default/cacerts
por:Para eliminar cert:
fuente
Esto también puede deberse al uso de certificados GoDaddy con Java 7 que están firmados con SHA2.
Chrome y todos los demás navegadores están comenzando a desaprobar los certificados SSL firmados con SHA1, ya que no es tan seguro.
Puede encontrar más información sobre el problema aquí , así como sobre cómo resolverlo en su servidor si lo necesita ahora.
fuente
Tuve el mismo problema con el error de certificados y fue debido a SNI, y el cliente http que usé no tenía SNI implementado. Entonces, una actualización de versión hizo el trabajo
fuente
ACTUALIZACIÓN: Que un reinicio ayudó fue una coincidencia (¡eso esperaba, hooray!). La verdadera causa del problema fue esta: cuando se le indica a Gradle que use un almacén de claves específico, ese almacén de claves también debe contener todos los certificados raíz oficiales. De lo contrario, no puede acceder a bibliotecas desde repositorios regulares. Lo que tuve que hacer fue esto:
Importe el certificado autofirmado:
Agregue los certificados raíz oficiales:
Tal vez el demonio Gradle también se interpuso en el camino. Podría valer la pena matar a todos los demonios en ejecución encontrados con
./gradlew --status
si las cosas comienzan a verse sombrías.PUBLICACIÓN ORIGINAL:
Nadie lo creerá, lo sé. Aún así, si todo lo demás falla, pruébalo: después de reiniciar mi Mac, el problema desapareció. Grrr.
Antecedentes: ./gradlew jar me seguía dando "no se puede encontrar la ruta de certificación válida para el objetivo solicitado"
Estoy atascado con un certificado autofirmado, guardado desde el navegador, importado en privateKeystore.jks. Luego le indicó a Gradle que trabajara con privateKeystore.jks:
Como se mencionó, esto solo funcionó después de un reinicio.
fuente
La versión 18.1.3044 de AVG (con Windows 10) interfiere con mi aplicación Spring local.
Solución: ingrese en la sección AVG llamada "Web y correo electrónico" y desactive la "protección de correo electrónico". AVG bloquea el certificado si el sitio no es seguro.
fuente
Asegúrese de que https://176.66.3.69:6443/ tenga un certificado válido. Puede verificarlo a través del navegador en primer lugar, si funciona en el navegador, funcionará en Java.
eso me funciona
fuente
Hay muchas maneras de resolver esto ...
Una forma es establecer los certificados de TrustStore en un archivo de almacén de claves y colocarlo en la ruta de la aplicación, y establecer estas propiedades del sistema en el método principal:
Otra forma es colocar el almacén de claves como archivo de recursos dentro del archivo jar del proyecto y cargarlo:
En Windows también puede probar esta solución: https://stackoverflow.com/a/59056537/980442
Creé el archivo de almacén de claves a partir de un
.crt
archivo CA de autoridad de certificación de esta manera:FYI: https://docs.oracle.com/javadb/10.8.3.0/adminguide/cadminsslclient.html
fuente
Tiene dos opciones: importe el certificado autofirmado en el almacén de claves de Java para cada jvm en el que se ejecutará el software o pruebe la fábrica SSL no validante:
fuente
Tenía el problema como esta imagen.
Intenté algunas soluciones. Pero descubrí que incluso si es el mismo proyecto, cuando está en el lugar de trabajo de otro, está totalmente bien. No se necesitan configuraciones adicionales. Así que supusimos que es un problema ambiental. Intentamos cambiar la versión JDK, IDE pero no funcionó. La investigación tardó aproximadamente 4 horas, hasta que probamos la respuesta mejor calificada. No encontré el error mencionado en esa respuesta, pero encontré a través de mi navegador sobre HTTP URL (bloqueo) que había una certificación de Charles. Entonces me di cuenta de que Charles estaba encendido todo el tiempo. Mientras lo apague, todo funciona bien.
Así que dejé mi experiencia que podría ser útil para su caso.
fuente
En mi caso, estoy ejecutando MacOs High Sierra con Java 1.6. El archivo cacert está en una ubicación diferente a la mencionada anteriormente en la respuesta de Gabe Martin-Dempesy. El archivo cacert también ya estaba vinculado a otra ubicación (/ Library / Internet Plug-Ins / JavaAppletPlugin.plugin / Contents / Home / lib / security / cacerts).
Usando FireFox, exporté el certificado del sitio web en cuestión a un archivo local llamado "exportedCertFile.crt". A partir de ahí, utilicé keytool para mover el certificado al archivo cacert. Esto solucionó el problema.
fuente
Primero descargue el certificado SSL, luego puede ir a su ruta java bin y ejecutar el siguiente comando en la consola.
fuente
En mi caso, tenía el almacén de claves y el almacén de confianza con el mismo certificado, por lo que fue útil eliminar el almacén de confianza. A veces, la cadena de certificados puede ser un problema si tiene varias copias de certificados.
fuente