El certificado SSL de GoDaddy no funciona con Java

UPDATE 1/26/2015 -- It appears the most recent JRE/JDK for Java 8 (update >= 31) and JRE/JDK for Java 7 now include the Godaddy G2 CA server in the default trust store. If possible, it's urged you upgrade your JRE/JDK to the latest Java 8 update to resolve this issue.

ACTUALIZACIÓN 29/11/2014 - Esto sigue siendo un problema, y ​​parece que a Godaddy no le importa y tampoco hará nada al respecto. Hay una entrada de blogaquí Godaddy, VP de productos de seguridad de hace varios meses, dijo que había una solución en camino y que ofrecía una solución temporal temporal, pero a partir de hoy nada ha cambiado. Es importante tener en cuenta que el servidor G2 CA de Godaddy ha existido durante un mínimo de 5 años, y en ese momento, Godaddy no ha tomado las medidas adecuadas para resolver este problema conocido. La solución temporal proporcionada es solo eso, una solución temporal, no una solución. Los usuarios de servicios de terceros tienen control cero sobre cómo se instala el certificado en el servidor.

It seems users should avoid purchasing Godaddy SSL certs until they get serious about being a CA.

Aquí está la información de contacto de su equipo de SSL si se siente inclinado a llamar:

GoDaddy SSL Team Support Number: 1-480-505-8852 -- Email: [email protected]

ACTUALIZACIÓN 9/17/2014 - Esto sigue siendo un problema, y ​​parece que a Godaddy no le importa y no hará nada al respecto. En noviembre, cuando Google desapruebe todos los certificados SHA-1, esto se convertirá en un problema importante. Recomiendo encarecidamente a cualquiera que pueda ponerse en contacto con Godaddy y señalarlos aquí.

~

tl;dr; - final update with current solution/workaround at the bottom of this post (it is a GoDaddy problem and there is a workaround until they fix it)

Tengo un servidor de correo al que estoy intentando enviar correo desde mi aplicación Java. Puedo enviar el puerto 25 correctamente, así que sé que el código funciona y todo, pero 25 no es una sesión cifrada. Necesito usar TLS en el puerto 587 que requiere un certificado SSL. Tengo un certificado SSL válido en el servidor que está firmado por GoDaddy G2 CA y ha estado vigente durante un tiempo (sin problemas).

Mi problema, es que estoy consiguiendo el famosoPKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target mensaje de error al intentar conectarse y enviar correo al 587.

Por lo que sé de muchos enlaces SO, así como de google-fu normal, esto suele deberse a que Java no confía en el certificado o CA, como es habitual en un certificado autofirmado. He utilizado varios de los verificadores de certificados SSL en línea para asegurar que la cadena sea válida, etc. Todo parece ser normal ... pero Java no usará el certificado automáticamente.

Soy consciente de que hay un archivo de clase en algún lugar de Sun que descargará y configurará el certificado en el almacén de claves local, por lo que Java confiará en él ... pero esto no solo es poco práctico para una aplicación que se implementará en varios sistemas, sino que es simplemente tonto para un certificado firmado Godaddy.

¿Que esta pasando? ¿Cómo puedo hacer que java use el certificado válido en el servidor?sin ¿Tener que hacer java aceptar todos los certificados?

EDITAR: Acabo de mirar en el Panel de control de Java de Windows (instalación predeterminada de jdk 7) y, desde luego, enSigner CA El Emitido por:The Go Daddy Group, Inc. Go Daddy Class 2 Certification Authority está listado ... entonces, ¿qué da? Mi certificado es un certificado de GoDaddy ...

UPDATE --

Aquí está la cadena de certificados tal como se ve en el comando openssl recomendado en los comentarios:

~]# openssl s_client -connect smtp.somecompany.com:587 -starttls smtp
CONNECTED(00000003)
depth=2 C = US, ST = Arizona, L = Scottsdale, O = "GoDaddy.com, Inc.", CN = Go Daddy Root Certificate Authority - G2
verify error:num=19:self signed certificate in certificate chain
verify return:0
---
Certificate chain
 0 s:/OU=Domain Control Validated/CN=smtp.somecompany.com
   i:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./OU=http://certs.godaddy.com/repository//CN=Go Daddy Secure Certificate Authority - G2
 1 s:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./OU=http://certs.godaddy.com/repository//CN=Go Daddy Secure Certificate Authority - G2
   i:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./CN=Go Daddy Root Certificate Authority - G2
 2 s:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./CN=Go Daddy Root Certificate Authority - G2
   i:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./CN=Go Daddy Root Certificate Authority - G2
 3 s:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./OU=http://certs.godaddy.com/repository//CN=Go Daddy Secure Certificate Authority - G2
   i:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./CN=Go Daddy Root Certificate Authority - G2
---

Me parece bien, creo ...

UPDATE 2 --

Bien, gracias a @Bruno pude determinar que mi cadena estaba desordenada. Volví a teclear el servidor y ahora mi cadena aparece como tal:

 ~]# openssl s_client -connect smtp.somecompany.com:587 -starttls smtp
CONNECTED(00000003)
depth=2 C = US, ST = Arizona, L = Scottsdale, O = "GoDaddy.com, Inc.", CN = Go Daddy Root Certificate Authority - G2
verify error:num=19:self signed certificate in certificate chain
verify return:0
---
Certificate chain
 0 s:/OU=Domain Control Validated/CN=smtp.somecompany.com
   i:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./OU=http://certs.godaddy.com/repository//CN=Go Daddy Secure Certificate Authority - G2
 1 s:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./OU=http://certs.godaddy.com/repository//CN=Go Daddy Secure Certificate Authority - G2
   i:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./CN=Go Daddy Root Certificate Authority - G2
 2 s:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./CN=Go Daddy Root Certificate Authority - G2
   i:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./CN=Go Daddy Root Certificate Authority - G2
---

Que se ve mejor que antes. - Java aún lanza la misma excepción sobre la ruta del certificado, etc. Entonces, parece que la cadena de certificados G2 no es, de manera predeterminada, confiable en el almacén de claves predeterminado de Java 7.

FINAL UPDATE FOR COMPLETENESS @ 1/14/2014

Solo como una actualización: este es realmente un problema de GoDaddy (he tenido correos electrónicos de soporte muy largos con ellos). Tienen 2 servidores CA, uno llamado.Class 2 CA y el otro llamadoG2 CA. SuClass 2 CA firma todoSHA-1 certificados, mientras queG2 CA firma todos susSHA-2 certificados Aquí es donde radica el problema: GoDaddy no ha agregado su versión más nueva.G2 CA del servidor al almacén de confianza de Java predeterminado, lo que hace que las instalaciones de Java predeterminadas no confíen en su autoridad y, por lo tanto, no confíe en su certificado encadenado. El trabajo hasta que GoDaddy agrega elG2 CA del servidor al almacén de confianza predeterminado es simplemente cambiar la clave de su certificado usandoSHA-1 como para obtener un certificado firmado por elClass 2 CA servidor. La renovación de claves es gratuita para los clientes de GoDaddy hasta que su certificado expire (obviamente).

Respuestas a la pregunta(11)

Su respuesta a la pregunta