¿Cómo resuelvo javax.net.ssl.SSLHandshakeException en Heroku?

Me enfrenté SSLHandshakeException en Heroku.

Esta aplicación no era una aplicación SSL. Pero esta aplicación llamó a una API web basada en SSL desde el interior de la aplicación. Por lo general, el uso de keytool para adoptar el certificado SSL en JVM resuelve este tipo de problema.

Pero, ¿cómo hago esto en Heroku?

registros aquí:

    2012-06-12T11:08:08+00:00 app[web.1]: Caused by: sun.security.validator.ValidatorException:  PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException:  unable to find valid certification path to requested target
    2012-06-12T11:08:08+00:00 app[web.1]:   at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:324) ~[na:1.6.0_20]
    2012-06-12T11:08:08+00:00 app[web.1]:   at sun.security.validator.Validator.validate(Validator.java:235) ~[na:1.6.0_20]
    2012-06-12T11:08:08+00:00 app[web.1]:   at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:147) ~[na:1.6.0_20]
    2012-06-12T11:08:08+00:00 app[web.1]:   at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:230) ~[na:1.6.0_20]
    2012-06-12T11:08:08+00:00 app[web.1]: Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    2012-06-12T11:08:08+00:00 app[web.1]:   at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:270) ~[na:1.6.0_20]
    2012-06-12T11:08:08+00:00 app[web.1]:   at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:197) ~[na:1.6.0_20]
    2012-06-12T11:08:08+00:00 app[web.1]:   at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:255) ~[na:1.6.0_20]
    2012-06-12T11:08:08+00:00 app[web.1]:   at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:319) ~[na:1.6.0_20]
    2012-06-12T11:08:08+00:00 app[web.1]:   at sun.security.validator.Validator.validate(Validator.java:235) ~[na:1.6.0_20]
    2012-06-12T11:08:08+00:00 app[web.1]:   at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:147) ~[na:1.6.0_20]
    2012-06-12T11:08:08+00:00 app[web.1]:   at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:224) ~[na:1.6.0_20]

preguntado el 12 de junio de 12 a las 12:06

4 Respuestas

En realidad, no estoy seguro de si Heroku tiene algún soporte para actualizar el almacén de claves, pero siempre puede proporcionar su propio almacén de claves como parámetros de entorno de Java en su configuración o archivo de proceso como este

web: java -jar -Djavax.net.ssl.trustStore=path/to/keystore -Djavax.net.ssl.trustStorePassword=changeit --port $PORT target/*.war

Respondido 15 Oct 12, 14:10

Cuando estas haciendo un SSL connection to a server, you should be having the Server's certificate en el almacén de confianza del cliente.

Debes import the server certificate into a keystore y especifique el almacén de claves usando javax.net.ssl.trustStore y javax.net.ssl.trustStorePassword.

Compruebe si ha especificado estas propiedades. Si ya se ha especificado, compruebe si apuntan al almacén de claves correctamente.

Respondido el 12 de junio de 12 a las 13:06

Gracias. Intentaré. Y descubrí que este certificado SSL en realidad se autocertificó después de publicar esta pregunta. Resolví este problema pidiéndole al administrador que cambiara el certificado al apropiado. Muchísimas gracias. - Takafumi Ikeda

Tenga en cuenta que esto solo es necesario si el certificado del servidor está autofirmado. Si está firmado por una Autoridad de Certificación reconocida, no tiene que hacer nada. - user207421

La pregunta original era específica de Heroku y todavía me gustaría saber cómo importar un certificado (autofirmado) en el almacén de claves de JVM cuando no tengo acceso a la JVM real en Heroku. - Edad Mooij

Para solucionar el problema de validación del certificado SSL (generalmente ocurre con los certificados autofirmados), debe agregar un certificado al almacén de claves de Java para decirle a JVM que siempre confíe en él.

Para agregarlo localmente:

  • encuentre su archivo de almacén de claves (generalmente ubicado en jre/lib/security/cacerts)
  • descargar certificado .cer archivo (aquí hay algunas maneras de hacer eso, creo que descargar con Firefox es la más fácil)
  • Importe el certificado a su almacén de claves: keytool -import -keystore cacerts -file custom.cer

Cargue su almacén de claves en Heroku por la adición de cacerts archivo como un archivo JVM personalizado.

respondido 20 mar '17, 10:03

He actualizado el proceso en el blog usando el cual pude personalizar con éxito los cacerts en Heroku.

https://deepaksinghviblog.blogspot.com/2021/04/heroku-custom-trust-store-for-ssl.html

Respondido 10 Abr '21, 19:04

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.