Estoy tratando de obtener tweets usando la biblioteca twitter4j para mi proyecto java. En mi primera ejecución recibí un error sobre el certificado sun.security.validator.ValidatorException
y sun.security.provider.certpath.SunCertPathBuilderException
. Luego agregué el certificado de Twitter por:
C:\Program Files\Java\jdk1.7.0_45\jre\lib\security>keytool -importcert -trustcacerts -file PathToCert -alias ca_alias -keystore "C:\Program Files\Java\jdk1.7.0_45\jre\lib\security\cacerts"
Pero sin éxito. Aquí está el procedimiento para obtener tweets:
public static void main(String[] args) throws TwitterException {
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setDebugEnabled(true)
.setOAuthConsumerKey("myConsumerKey")
.setOAuthConsumerSecret("myConsumerSecret")
.setOAuthAccessToken("myAccessToken")
.setOAuthAccessTokenSecret("myAccessTokenSecret");
TwitterFactory tf = new TwitterFactory(cb.build());
Twitter twitter = tf.getInstance();
try {
Query query = new Query("iphone");
QueryResult result;
result = twitter.search(query);
System.out.println("Total amount of tweets: " + result.getTweets().size());
List<Status> tweets = result.getTweets();
for (Status tweet : tweets) {
System.out.println("@" + tweet.getUser().getScreenName() + " : " + tweet.getText());
}
} catch (TwitterException te) {
te.printStackTrace();
System.out.println("Failed to search tweets: " + te.getMessage());
}
Y aquí está el error:
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Relevant discussions can be found on the Internet at:
http://www.google.co.jp/search?q=d35baff5 or
http://www.google.co.jp/search?q=1446302e
TwitterException{exceptionCode=[d35baff5-1446302e 43208640-747fd158 43208640-747fd158 43208640-747fd158], statusCode=-1, message=null, code=-1, retryAfter=-1, rateLimitStatus=null, version=3.0.5}
at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:177)
at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:61)
at twitter4j.internal.http.HttpClientWrapper.get(HttpClientWrapper.java:81)
at twitter4j.TwitterImpl.get(TwitterImpl.java:1929)
at twitter4j.TwitterImpl.search(TwitterImpl.java:306)
at jku.cc.servlets.TweetsAnalyzer.main(TweetsAnalyzer.java:38)
Caused by: javax.net.ssl.SSLHandshakeException: 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.ssl.Alerts.getSSLException(Unknown Source)
at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source)
at sun.security.ssl.ClientHandshaker.processMessage(Unknown Source)
at sun.security.ssl.Handshaker.processLoop(Unknown Source)
at sun.security.ssl.Handshaker.process_record(Unknown Source)
at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at java.net.HttpURLConnection.getResponseCode(Unknown Source)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(Unknown Source)
at twitter4j.internal.http.HttpResponseImpl.<init>(HttpResponseImpl.java:34)
at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:141)
... 5 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 sun.security.ssl.X509TrustManagerImpl.validate(Unknown Source)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(Unknown Source)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
... 20 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)
... 26 more
Failed to search tweets: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Respuestas:
"more info" > "security" > "show certificate" > "details" > "export.."
. Elija el nombre y elija el tipo de archivo example.cerAhora tiene un archivo con el almacén de claves y debe agregarlo a su JVM. Determinar la ubicación de los archivos cacerts, por ejemplo.
C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts.
Luego importe el
example.cer
archivo en cacerts en la línea de comando:keytool -import -alias example -keystore C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts -file example.cer
Se le pedirá una contraseña cuyo valor predeterminado es
changeit
Reinicie su JVM / PC.
fuente: http://magicmonster.com/kb/prg/java/ssl/pkix_path_building_failed.html
fuente
alias
nombre del certificado en la línea de comando debe ser único.Después de muchas horas tratando de crear archivos cert para que mi instalación de Java 6 funcione con los nuevos certificados de twitter, finalmente me topé con una solución increíblemente simple enterrada en un comentario en uno de los paneles de mensajes. Simplemente copie el archivo cacerts de una instalación de Java 7 y sobrescriba el de su instalación de Java 6. Probablemente sea mejor hacer una copia de seguridad del archivo cacerts primero, pero luego simplemente copie el nuevo y ¡BOOM! Simplemente funciona.
Tenga en cuenta que en realidad copié un archivo de Windows Cacerts en una instalación de Linux y funcionó bien.
El archivo se encuentra en
jre/lib/security/cacerts
las antiguas y nuevas instalaciones Java jdk.Espero que esto le ahorre a alguien más horas de molestia.
fuente
$JAVA_HOME/jre/lib
,$JAVA_HOME/lib
pasé un poco de tiempo perdiendo ese detalle.MI enfoque UI:
Línea CMD:
keytool -importcert -file jetty.crt -alias jetty -keystore $JAVA_HOME/jre/lib/security/cacerts
changeit
(Puede cambiarse en Mac)fuente
keytool -importcert -file dinardap_cert.cer –alias dinardap –keystore “%JAVA_HOME%/jre/lib/security/cacerts”
Me he topado con este problema, que tardó muchas horas de investigación en solucionarse, especialmente con los certificados autogenerados, que a diferencia de los oficiales, son bastante complicados y a Java no le gustan mucho.
Por favor, consulte el siguiente enlace: Resolver problemas con certificados en Java
Básicamente, debe agregar el certificado del servidor a los certificados de Java Home.
InstallCert
y ejecútelo mientras se ejecuta el servidor, proporcionando los siguientes argumentosserver[:port]
. No se necesita contraseña, ya que la contraseña original funciona para los certificados de Java ("changeit").jssecerts
archivo dentro del directorio donde ejecutó el programa (si se ejecuta desde Eclipse, asegúrese de configurar el trabajo directorio enRun -> Configurations
).$JAVA_HOME/jre/lib/security
Después de seguir estos pasos, las conexiones con el certificado ya no generarán excepciones dentro de Java.
El siguiente código fuente es importante y desapareció de los blogs de Oracle (Sun), la única página que encontré estaba en el enlace proporcionado, por lo tanto, lo adjunto en la respuesta para cualquier referencia.
fuente
SandeepanNath:test sandeepan.nath$ java InstallCert repo1.maven.org:443 Loading KeyStore /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/jre/lib/security/cacerts... Opening connection to repo1.maven.org:443 ... Starting SSL handshake... javax.net.ssl.SSLException: Received fatal alert: protocol_version .. Could not obtain server certificate chain
1. Verifique el certificado
Intente cargar la URL de destino en el navegador y ver el certificado del sitio (generalmente se puede acceder mediante el icono con el signo de bloqueo. Está en el lado izquierdo o derecho de la barra de direcciones del navegador) ya sea que haya expirado o no sea de confianza por algún otro motivo.
2. Instale las últimas versiones de JRE y JDK
Las nuevas versiones generalmente vienen con el conjunto actualizado de los certificados de confianza.
Además, si es posible, desinstale las versiones anteriores. Esto hará explícitos los errores de configuración incorrecta.
3. Verifique su configuración:
4. Copie todo el almacén de claves de la nueva versión de Java
Si desarrolla bajo el JDK que no sea el último disponible, intente reemplazar el
%JAVA_HOME%/jre/lib/security/cacerts
archivo con el nuevo del último JRE instalado (haga una copia de seguridad primero) como sugiere @ jeremy-goodell en su respuesta5. Agregue certificado (s) a su almacén de claves
Si nada de lo anterior resuelve su problema, use
keytool
para guardar los certificados en el almacén de claves de Java:El archivo con el certificado se puede obtener del navegador como @MagGGG sugiere en su respuesta .
Nota 1: es posible que deba repetir esto para cada certificado de la cadena al certificado de su sitio. Comience desde la raíz.
Nota 2:
<alias_name>
debe ser única entre las claves de la tienda okeytool
mostrará un error.Para obtener una lista de todos los certificados en la tienda, puede ejecutar:
En caso de que algo salga mal, esto lo ayudará a eliminar el certificado de la tienda:
fuente
Se utiliza para saltar la validación del certificado.
Advertencia ¡El uso solo con fines de desarrollo para esto no es seguro!
fuente
Tuve una situación ligeramente diferente, cuando JDK y JRE 1.8.0_112 estaban presentes en mi sistema.
Importé los nuevos certificados de CA para
[JDK_FOLDER]\jre\lib\security\cacerts
usar el comando ya conocido:Aún así, seguí obteniendo el mismo error de construcción de ruta PKIX fallido .
Agregué información de depuración a la CLI de Java, usando
java -Djavax.net.debug=all ... > debug.log
. En el archivo debug.log, la línea que comienza con trustStore es: en realidad apunta al almacén de cacerts que se encuentra en[JRE_FOLDER]\lib\security\cacerts
.En mi caso, la solución fue copiar el archivo cacerts utilizado por JDK (que tenía las nuevas CA agregadas) sobre el utilizado por JRE y que solucionó el problema.
fuente
Antecedentes del problema:
Recibí el siguiente error cuando intento ejecutar mvn clean install en mi proyecto y a través de Netbeans IDE clean and build option. Este problema se debe a que el certificado no está disponible cuando lo descargamos a través de NET beans IDE / mediante el símbolo del sistema, pero podemos descargar los archivos a través del navegador.
Error :
Resolución:
1. Descargue el certificado de la URL en cuestión:
2. Ahora instale el almacén de claves para solucionar el problema.
Ejemplo de comandos / salida de línea de comando:
fuente
Quería importar un certificado para smtp.gmail.com
La única solución que funcionó para mí es 1. Ingrese el comando para ver este certificado
Copie y guarde las líneas entre "----- BEGIN CERTIFICATE -----" y "----- END CERTIFICATE -----" en un archivo, gmail.cer
correr
Ingrese la contraseña chageit
Haga clic en Sí para importar el certificado.
Reiniciar java
ahora ejecuta el comando y listo
fuente
Esta no es una respuesta específica de Twitter, pero esta es la pregunta que surge cuando busca este error. Si su sistema recibe este error cuando se conecta a un sitio web que parece tener un certificado válido cuando se ve en un navegador web , eso probablemente significa que el sitio web tiene una cadena de certificados incompleta .
Para un breve resumen del problema: las autoridades de certificación no usan su certificado raíz para firmar cualquier certificado antiguo. En cambio, (generalmente) firman certificados intermedios que también tienen establecido el indicador de Autoridad de certificación (es decir, pueden firmar certificados). Luego, cuando compra un certificado de una CA, firman su CSR con uno de estos certificados intermedios.
Su tienda de confianza Java probablemente solo tenga el Root Cert, no los intermedios.
Un sitio mal configurado podría devolver solo su certificado firmado. Problema: se firmó con un certificado intermedio que no está en su tienda de confianza. Los navegadores manejarán este problema descargando o usando un certificado intermedio en caché; Esto maximiza la compatibilidad del sitio web. Java y herramientas como OpenSSL, sin embargo, no lo harán. Y eso causará el error en la pregunta.
Puede verificar esta sospecha utilizando la Prueba Qualys SSL . Si ejecuta eso contra un sitio y dice
entonces eso lo confirma. También puede ver esto mirando las rutas de certificación y viendo el texto Descarga adicional .
Cómo solucionarlo: el administrador del servidor necesita configurar el servidor web para que también devuelva los certificados intermedios. Para Comodo, por ejemplo, aquí es donde el
.ca-bundle
archivo resulta útil. Por ejemplo, en una configuración de Apache con mod_ssl, usaría laSSLCertificateChainFile
configuración. Para nginx, debe concatenar los certificados intermedios y el certificado firmado y usarlo en la configuración del certificado SSL. Puede encontrar más buscando "cadena de certificados incompleta" en línea.fuente
La razón por la que obtenemos el error anterior es que JDK se incluye con muchos certificados de autoridad de certificación (CA) confiables en un archivo llamado 'cacerts', pero este archivo no tiene idea de nuestro certificado autofirmado. En otras palabras, el archivo cacerts no tiene nuestro certificado autofirmado importado y, por lo tanto, no lo trata como una entidad confiable y, por lo tanto, da el error anterior.
Cómo arreglar el error anterior
Para corregir el error anterior, todo lo que necesitamos es importar el certificado autofirmado en el archivo cacerts.
Primero, ubique el archivo cacerts. Tendremos que averiguar la ubicación de JDK. Si está ejecutando su aplicación a través de uno de los IDE como Eclipse o IntelliJ Idea, vaya a la configuración del proyecto y descubra cuál es la ubicación del JDK. Por ejemplo, en una Mac OS, la ubicación típica del archivo cacerts sería en esta ubicación / Library / Java / JavaVirtualMachines / {{JDK_version}} / Contents / Home / jre / lib / security en la máquina de Windows, estaría en {{Installation_directory} } / {{JDK_version}} / jre / lib / security
Una vez que haya localizado el archivo cacerts, ahora necesitamos importar nuestro certificado autofirmado a este archivo cacerts. Consulte el último artículo, si no sabe cómo generar el certificado autofirmado correctamente.
Si no tiene un archivo de certificado (.crt) y solo tiene un archivo .jks, puede generar un archivo .crt utilizando el siguiente comando. En caso de que ya tenga un archivo .crt / .pem, puede ignorar el siguiente comando
## Para generar el certificado del almacén de claves (archivo .jks) ####
El paso anterior generará un archivo llamado selfsigned.crt. Ahora importe el certificado a cacerts
Ahora agregue el certificado a JRE / lib / security / cacerts (trustore)por ej.
Eso es todo, reinicie su aplicación y debería funcionar bien. Si aún no funciona y obtén una excepción de protocolo de enlace SSL. Probablemente significa que está utilizando un dominio diferente al registrado en el certificado.
El enlace con explicación detallada y resolución paso a paso está aquí.
fuente
Agregar
cacerts
no funcionó para mí. Después de habilitar el registro con la bandera-Djavax.net.debug=all
, luego conocí la lectura de Javajssecacerts
.Importar a
jssecacerts
trabajado finalmente.fuente
jssecacerts
si está presente, de lo contrariocacerts
.Esta es una solución pero en forma de mi historia con este problema:
Estaba casi muerto probando toda la solución dada anteriormente (durante 3 días) y nada funcionó para mí.
Perdí toda esperanza.
Me puse en contacto con mi equipo de seguridad con respecto a esto porque estaba detrás de un proxy y me dijeron que habían actualizado recientemente su política de seguridad.
Los regañé mucho por no informar a los Desarrolladores.
Más tarde emitieron un nuevo archivo "cacerts" que contiene todos los certificados.
Eliminé el archivo cacerts que está presente dentro de% JAVA_HOME% / jre / lib / security y resolvió mi problema.
Entonces, si se enfrenta a este problema, podría ser de su equipo de red también de esta manera.
fuente
Me encontré con esta pregunta al intentar instalar el complemento Cucumber-Eclipse en Eclipse a través de su sitio de actualización. Recibí el mismo error de SunCertPathBuilderException:
Si bien algunas de las otras respuestas son apropiadas y útiles para la situación dada de esta pregunta, sin embargo, fueron inútiles y engañosas para mi problema.
En mi caso, el problema era que la URL proporcionada para su sitio de actualización es:
Sin embargo, cuando se navega a través de un navegador, se redirige a (tenga en cuenta el " .github " agregado ):
Entonces, la resolución es simplemente usar la versión redirigida de la URL del sitio de actualización al agregar el sitio de actualización en eclipse.
fuente
Estaba enfrentando el mismo problema y lo resolví usando los siguientes pasos simples:
1) Descargue InstallCert.java de google
2) Compílelo usando javac InstallCert.java
3) Ejecute InstallCert.java usando java InstallCert.java , con el nombre de host y el puerto https, y presione “1” cuando solicite información. Agregará el "localhost" como un almacén de claves de confianza y generará un archivo llamado "jssecacerts" como se muestra a continuación:
Java InstallCert localhost: 443
4) copie jssecacerts en la carpeta $ JAVA_HOME / jre / lib / security
La fuente principal para resolver el problema aquí es:
https://ankurjain26.blogspot.in/2017/11/javaxnetsslsslhandshakeexception.html
fuente
Resolví este problema en Windows Server 2016 con Java 8, importando el certificado de la
pkcs12
tienda alcacerts
almacén de claves.Ruta a la tienda pkcs12:
C:\Apps\pkcs12.pfx
Ruta a los cacerts de Java:
C:\Program Files\Java\jre1.8.0_151\lib\security\cacerts
Ruta a keytool:
C:\Program Files\Java\jre1.8.0_151\bin
después de posicionarse en la carpeta con keytool en el símbolo del sistema (como administrador), el comando para importar el certificado de
pkcs12
acacerts
es el siguiente:keytool -v -importkeystore -srckeystore C:\Apps\pkcs12.pfx -srcstoretype PKCS12 -destkeystore "C:\Program Files\Java\jre1.8.0_151\lib\security\cacerts" -deststoretype JKS
Se le pedirá que:
1. ingrese la contraseña del almacén de claves de destino (contraseña de cacerts, el valor predeterminado es "changeit")
2. ingrese la contraseña del almacén de claves de origen (contraseña pkcs12)
Para que los cambios surtan efecto, reinicie la máquina del servidor (o simplemente reinicie JVM).
fuente
Aquí, normalmente, este tipo de excepción se produce cuando no hay coincidencia en la RUTA del certificado de confianza. Verifique la configuración o ruta donde se requiere este certificado de servidor para una comunicación segura.
fuente
Para mí, apareció un error de certificado porque tenía el violinista ejecutándose en segundo plano y eso se equivoca con el certificado. Actúa como un proxy tan cerca que reinicia el eclipse.
fuente
metas:
Cómo hacerlo:
Mi archivo contenedor Keystore:
Esta clase creará un almacén de claves si es necesario y podrá administrar certificados dentro de él. Ahora clase para contexto SSL:
Esta clase se hizo como singleton, porque solo se permite un contexto predeterminado de SSL. Entonces, ahora uso:
Posiblemente, no funcionará con esta configuración, porque mantengo el archivo de certificado dentro de la carpeta de recursos, por lo que mi ruta no es absoluta. Pero en general, funciona perfectamente.
fuente
available()
está específicamente advertido en su propio Javadoc.Es además de la respuesta https://stackoverflow.com/a/36427118/1491414 . Gracias @MagGGG
fuente
Lo arreglé usando el siguiente método:
fuente
Cuando tiene el error anterior con el software atlassian ej. jira
puede agregar certs a su almacén de claves de confianza (cambie missing_ca al nombre de cert adecuado):
Si se le solicita una contraseña, coloque
changeit
y confirmey
Después de eso, simplemente reinicie jira.
fuente
Si la URL de su repositorio también funciona en HTTP y la seguridad no es una preocupación, puede ir a settings.xml (a menudo, pero no siempre, ubicado en
%USERPROFILE%/.m2
) y reemplazar HTTPS con HTTP para<repository>
y<pluginRepository>
URL.Por ejemplo, esto:
debe ser reemplazado por esto:
fuente
Estaba usando mi propia tienda de confianza en lugar de JRE al pasar arg
-Djavax.net.ssl.trustStore=
Recibía este error independientemente de los certificados en el almacén de confianza. El problema para mí fue el orden de las propiedades pasadas en la línea arg. Cuando puse
-Djavax.net.ssl.trustStore=
&-Djavax.net.ssl.trustStorePassword=
before-Dspring.config.location=
&-jar
args pude invocar con éxito mi llamada de descanso a través de https.fuente
Si está utilizando CloudFoundry y se encuentra con un problema de certificado, entonces deberá asegurarse de presionar el jar nuevamente con el servicio de almacén de claves con el certificado. Simplemente desenlazar, enlazar y reiniciar no funcionará.
fuente
En caso de que su host se encuentre detrás del firewall / proxy , use el siguiente comando en cmd:
Reemplace
<proxy_hostname>
y<proxy_port>
con el servidor proxy HTTP que está configurado. Reemplace<remote_host_name:remote_ssl_port>
con uno de los hosts remotos (básicamente url) y el puerto que tiene el problema de certificación.Tome el último contenido del certificado impreso y cópielo (también copie el certificado inicial y final). Pégalo en un archivo de texto y dale la extensión .crt . Ahora importe este certificado a cacerts usando el comando java keytool y debería funcionar.
fuente
Intenta copiar jace cacerts:
cp /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.172-9.b11.fc28.x86_64/jre/lib/security/cacerts $JAVA_HOME/jre/lib/security/cacerts
fuente
Si ve este problema en un contenedor de Linux cuando la aplicación Java intenta comunicarse con otra aplicación / sitio, es porque el certificado se ha importado incorrectamente al equilibrador de carga. Hay una secuencia de pasos a seguir para importar certificados y que si no se hace correctamente, verá problemas como
Una vez que los certificados se importan correctamente, debe hacerse. No es necesario jugar con ningún certificado JDK.
fuente
Lo resolví para Intellij Idea Me enfrento a este problema Aunque, cambié mucho lugar para resolver el problema. Encontré una solución para mí. Haga clic derecho en su proyecto, verá Maven , luego presione Generar fuentes y actualizar carpetas y volver a importar
Se hace.
fuente
Estaba enfrentando el mismo problema, estaba usando 8.1.0-3, pero luego usé 9.2.1-0 y el problema se solucionó sin ningún paso manual. El certificado autofirmado funcionó bien.
fuente