GoDaddy SSL Cert Ne Fonctionne Pas Avec 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.

MISE À JOUR 29/11/2014 This C'est toujours un problème, et Godaddy semble ne pas s'en soucier et ne fera rien à ce sujet. Il y a un article de blog ici par Godaddy VICE-président des produits de sécurité d'il y a plusieurs mois disant qu'un correctif était en route et a fourni un contournement temporaire, mais à ce jour, rien n'a changé. Il est important de noter que le serveur G2 CA de Godaddy existe depuis au moins 5 ans et que Godaddy n'a pas pris les mesures appropriées pour résoudre ce problème. Le contournement fourni est juste cela, un contournement, pas une solution. Les utilisateurs de services tiers n'ont aucun contrôle sur la façon dont le certificat est installé sur le serveur.

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

Voici les coordonnées de leur équipe SSL si vous vous sentez enclin à appeler:

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

MISE À JOUR 17/9/2014 This C'est toujours un problème, et Godaddy semble ne pas s'en soucier et ne fera rien à ce sujet. En novembre, lorsque Google déprécie tous les certificats SHA-1, cela deviendra un problème majeur. Je recommande fortement toute personne qui peut contacter Godaddy et les pointer ici.

~

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)

J'ai un serveur de messagerie que j'essaie d'envoyer du courrier à partir de mon application Java. Je peux envoyer sur le port 25 avec succès donc je sais que le code fonctionne et tout, mais 25 n'est pas une session cryptée. J'ai besoin d'utiliser TLS sur le port 587 qui nécessite un certificat SSL. J'ai un certificat SSL valide sur le serveur qui est signé par GoDaddy G2 CA et est en place depuis un certain temps maintenant (aucun problème).

Mon problème, c'est que je reçois le fameux PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target message d'erreur lorsque j'essaie de me connecter et d'envoyer du courrier sur 587.

D'après ma compréhension de nombreux liens SO ainsi que de google-fu normal, cela est généralement causé lorsque Java ne fait pas confiance au cert ou à CA as comme c'est courant pour un cert auto-signé. J'ai utilisé plusieurs vérificateurs de certificat SSL en ligne pour m'assurer que la chaîne est valide, etc. Tout semble être normal... mais java n'utilisera pas le certificat automatiquement.

Je suis conscient qu'il y a un fichier de classe quelque part de Sun qui téléchargera et configurera le certificat dans le keystore local afin que java lui fasse confiance... mais ce n'est pas seulement peu pratique pour une application qui sera déployée sur plusieurs systèmes, mais c'est tout simplement idiot pour un certificat signé Godaddy.

Que se passe-t-il? Comment puis-je faire en sorte que java utilise le certificat valide sur le serveur sans que doive faire en sorte que java accepte tous les certificats?

EDIT: Je viens de regarder dans mon panneau de configuration Windows Java (installation par défaut de jdk 7) et bien sûr, sous Signer CA le émis Par: The Go Daddy Group, Inc. Go Daddy Class 2 Certification Authority est répertorié... donc, ce qui donne? Mon certificat est un certificat Godaddy...

UPDATE --

Voici la chaîne de certificats telle que vue de la commande openssl recommandée dans les commentaires:

~]# 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
---

Semble ok pour moi je pense...

UPDATE 2 --

Ok, grâce à @Bruno, j'ai pu déterminer que ma chaîne était foirée -- J'ai recalé le serveur et maintenant ma chaîne apparaît comme telle:

 ~]# 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
---

Qui semble mieux qu'avant. -- Java lève toujours la même exception à propos du chemin cert,etc. Il semble donc que la chaîne de certificats G2 ne soit pas encore approuvée par défaut dans le magasin de clés par défaut de java 7.

FINAL UPDATE FOR COMPLETENESS @ 1/14/2014

Juste comme une mise à jour - C'est en effet un problème GoDaddy (j'ai eu de longs e-mails de soutien avec eux). Ils ont 2 serveurs CA, l'un appelé Class 2 CA et l'autre appelé G2 CA. Leur Class 2 CA tous les signes SHA-1 certificats, tandis que les G2 CA signe tous leurs SHA-2 certificats. C'est là que réside le problème - GoDaddy n'a pas ajouté leur nouveau G2 CA serveur vers le truststore java par défaut - ce qui fait que les installations java par défaut ne font pas confiance à son autorité et, par conséquent, ne font pas confiance à votre certificat chaîné. Le contournement jusqu'à ce que GoDaddy ajoute le serveur G2 CA au truststore par défaut consiste simplement à re-saisir votre certificat en utilisant SHA-1 as-pour obtenir un certificat signé par le serveur Class 2 CA. Rekeying est gratuit pour les clients GoDaddy jusqu'à l'expiration de votre certificat (évidemment).

Author: SnakeDoc, 2013-09-11

10 answers

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.

MISE À JOUR 29/11/2014 This C'est toujours un problème, et Godaddy semble ne pas s'en soucier et ne fera rien à ce sujet. Il y a un article de blog[here][1]de Godaddy Vice-président des produits de sécurité d'il y a plusieurs mois disant qu'un correctif était en route et a fourni un contournement temporaire, mais à ce jour, rien n'a changé. Il est important de noter que le serveur G2 CA de Godaddy existe depuis au moins 5 ans et que Godaddy n'a pas pris les mesures appropriées pour résoudre ce problème connu question. Le contournement fourni est juste cela, un contournement, pas une solution. Les utilisateurs de services tiers n'ont aucun contrôle sur la façon dont le certificat est installé sur le serveur.

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

Voici les coordonnées de leur équipe SSL si vous vous sentez enclin à appeler:

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

MISE À JOUR 17/9/2014 This C'est toujours un problème, et Godaddy semble ne pas s'en soucier et ne fera rien à ce sujet. En novembre, lorsque Google déprécie tous les certificats SHA-1, cela deviendra un problème majeur. Je je recommande fortement toute personne qui peut contacter Godaddy et les pointer ici.

~~~~

Mon message/question initial concernait les raisons pour lesquelles ma chaîne ne fonctionnait pas. Il est devenu évident que j'avais une mauvaise configuration(qui a été rapidement corrigée avec quelques conseils de @ Bruno et d'autres-merci). Cependant, lorsque ma chaîne corrigée ne fonctionnait toujours pas avec Java, il est devenu évident qu'il y avait un problème beaucoup plus important qui se cachait. Cela a pris un certain temps, mais le problème est en fait avec GoDaddy.

C'est en fait en effet, un problème GoDaddy (j'ai eu de longs e-mails de soutien avec eux).

Ils ont 2 serveurs d'autorité de certification, l'un appelé Class 2 CA et l'autre appelé G2 CA. Leur Class 2 CA tous les signes SHA-1 certificats, tandis que les G2 CA signe tous leurs SHA-2 certificats.

C'est là que réside le problème - GoDaddy n'a pas ajouté son nouveau serveur G2 CA au serveur par défaut Java truststore/keystore - ce qui empêche les installations Java par défaut de faire confiance à son autorité et, par conséquent, ne fait pas confiance à votre certificat chaîné.

Le le contournement jusqu'à ce que GoDaddy ajoute le serveur G2 CA au magasin de clés/magasin de clés par défaut consiste simplement à réactiver votre certificat en utilisant SHA-1 as-pour obtenir un certificat signé par le serveur Class 2 CA. Rekeying est gratuit pour les clients GoDaddy jusqu'à l'expiration de votre certificat (évidemment).

Une fois que vous avez un certificat SHA-1 signé par le serveur Class 2 CA, votre chaîne de confiance devrait fonctionner comme prévu et aucune importation et/ou configuration personnalisée de truststore/keystore n'est requise.

Cela ne me rend pas heureux que je doive utiliser un certificat "plus faible" dans afin de le faire fonctionner correctement, et les discussions avec GoDaddy via l'assistance par e-mail jusqu'à présent ont indiqué qu'ils n'avaient pas de plans actuels pour ajouter le serveur G2 CA au magasin de clés/magasin de clés par défaut. Je suppose que jusqu'à ce qu'ils l'ajoutent, assurez-vous d'obtenir un SHA-1 Class 2 CA certificat signé par le serveur si vous prévoyez de travailler avec Java.

 44
Author: SnakeDoc, 2015-01-27 18:15:08

Les réponses de M. Fixer et Wayne Thayer ont été rejetées, mais elles préconisent en fait les solutions de contournement correctes. En fait, Wayne Thayer dirige l'entreprise SSL de GoDaddy, donc il le sait probablement. Vous devez installer le certificat "GoDaddy G1 to G2 Cross" dans votre chaîne de certificats avec le certificat intermédiaire.

Le déclassement en SHA1 n'est pas une option idéale car il est obsolète et vous entraînera plus de travail à l'avenir. Heureusement, GoDaddy a fourni un crossover certificat qui résout ce problème. Ils ont posté des instructions, que Wayne a dupliquées, et ils sont enterrés dans les commentaires ici.

J'ai personnellement testé cette solution avec un certificat SHA2, et cela fonctionne bien. C'est une solution bien supérieure par rapport à la nouvelle saisie et au déclassement en SHA1. Lorsque SHA2 devient requis, cette option ne sera pas disponible de toute façon, et il peut toujours y avoir des chaînes d'outils Java sans le nouveau certificat.

Selon le soutien de GoDaddy, en juillet 2014, le certificat racine correct a été inclus dans les versions récentes de Java 8, et en septembre 2014, Wayne Thayer de GoDaddy a également déclaré que le certificat "devrait être ajouté à Java dans les prochains mois". J'ai vérifié le fichier cacerts en Java 8 pour Mac OS téléchargé à partir d'ici , et il contient en effet le certificat racine SHA2.

Donc au lieu de votre chaîne ressemblant à ceci:

  • Go Daddy Certificat Racine de l'Autorité – G2: (SHA-2) – Hash 47 BE AB C9 22 EA E8 0E 78 78 34 62 A7 9F 45 C2 54 FD E6 8B. Il s'agit du certificat racine intégré à certains systèmes (par exemple Chrome). SnakeDoc affirme que"ce n'est pas intégré dans Java, Windows CE, Microsoft Exchange et d'autres plates-formes".
  • Go Daddy Certificat Sécurisé de l'Autorité – G2: (SHA-2) – Hash 27 AC 93 69 FA F2 52 07 BB 26 27 EC FA CC ÊTRE 4E F9 C3 19 B8
  • Votre certificat SHA2

, Il devrait ressembler à ceci:

  • Go Daddy Classe 2 Certification Autorité: (SHA-1) - Hash 27 96 BA E6 3F 18 01 E2 77 26 1B A0 D7 77 70 02 8F 20 EE E4. Il s'agit de l'ancien certificat racine intégré à la plupart des systèmes, y compris java.
  • Go Daddy Certificat Racine de l'Autorité – G2: (SHA-2) – Hash 34 0B 28 80 F4 46 FC C0 4E 59 ED 33 F5 2B 3D 08 D6 24 29 64. Il s'agit du soi-disant "Certificat croisé GoDaddy G1 à G2".
  • Go Daddy Secure Certificate Authority – G2: (SHA-2 – - Hash 27 AC 93 69 FA F2 52 07 BB 26 27 CE FA CC BE 4E F9 C3 19 B8
  • Votre certificat SHA - 2

Voir aussi mon blog résumant ce problème avec des solutions de rechange.

 19
Author: Isaac Potoczny-Jones, 2014-11-29 23:36:06

Pour que les certificats Godaddy fonctionnent en Java avec SHA2, vous devrez utiliser leur certificat croisé dans votre chaîne pour chaîner la racine G2(SHA2) à la racine G1(SHA1) jusqu'à ce que Java décide de mettre à jour leur référentiel. L'ensemble de certificats croisés peut être téléchargé ici:

Https://certs.godaddy.com/anonymous/repository.pki

Bundles de certificats GoDaddy - G2 Avec Croix à G1, inclut la racine

[gd_bundle-g2-g1.crt][1] 
 13
Author: Mr. Fixer, 2014-09-19 01:02:05

M. Fixer a raison. Installez le certificat" GoDaddy G1 to G2 Cross " dans votre fichier bundle de certificats avec le certificat intermédiaire. Cela permet aux certificats GoDaddy SHA-2 d'être approuvés par tout client qui reconnaît les racines SHA-1, y compris Java. Vous pouvez obtenir ce fichier à partir de https://certs.godaddy.com/repository Une fois cela installé, Java construira une chaîne de certificats de votre certificat vers le "Certificat de serveur sécurisé GoDaddy (Certificat intermédiaire)" vers le "Certificat croisé GoDaddy G1 à G2" à la racine GoDaddy SHA-1. Vous pouvez également trouver un fichier bundle contenant le certificat croisé dans notre référentiel. Une dernière note sur cette option: Les signatures sur les certificats racine ne sont pas vérifiées, donc même si vous comptez sur une racine SHA-1, c'est aussi sécurisé qu'une chaîne de certificats SHA-2 complète.

 11
Author: Wayne Thayer, 2014-10-08 00:25:35

Après les commentaires et la sortie de openssl s_client -connect the.server.name:587 -starttls smtp.

Dans une chaîne de certificats, le certificat n devrait être émis par le certificat n+1 dans la liste: l'émetteur (i) du certificat n devrait être le (s) sujet (s) du certificat n+1.

 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

Ici, cert 0 est délivré par le cert 1 (très bien), cert 1 est délivré par le cert 2 (fin), cert 2 est auto-signé (aussi très bien, c'est l'autorité de certification racine).

Cependant, cert 2 n'est pas émis par cert 3. Cert 3 est mal placé (et probablement le même que cert 1). Cela est susceptible de causer des problèmes, car cela rend la chaîne invalide.

Vous devez au moins supprimer cert 3 de votre configuration. De plus, vous pouvez également supprimer cert 2, car avoir un CAS racine n'est pas nécessaire (c'est au client de le savoir de toute façon).

 4
Author: Bruno, 2013-09-12 17:54:07

Il semble que votre serveur de messagerie ne soit pas signé par Go Daddy Class 2 Certification Authority, mais est en fait signé par l'une de leurs autorités de certification intermédiaires. Vous aurez besoin de vérifier cela par vous-même. En supposant que cela soit le cas...

En théorie, votre logiciel devrait fonctionner - puisque le certificat intermédiaire est signé par l'autorité de classe 2 et que vous avez l'autorité de classe 2 dans le magasin de certificats JDK par défaut. Cependant, j'ai trouvé que cela ne fonctionne tout simplement pas à moins que vous n'ajoutiez également l'intermédiaire certificat à votre magasin de certificats. Voici un lien vers un article de blog décrivant une expérience similaire:

Http://drcs.ca/blog/adding-godaddy-intermediate-certificates-to-java-jdk/

Voici un lien direct vers plus de certificats intermédiaires GoDaddy: https://certs.godaddy.com/anonymous/repository.pki

Je ne peux pas vous conseiller exactement quel certificat vous devez ajouter - cela dépend de l'autorité de certification utilisée dans votre courrier serveur.

[mise à jour]

is there a way to do this programmically?

Peut-être. Dépend de ce que vous voulez faire. J'ai utilisé la classe java.security.KeyStore pour mettre à jour automatiquement un magasin de clés privé directement à partir du code Java sans utiliser keytool. C'est conceptuellement simple - chargez le magasin de clés à partir d'un fichier, lisez le nouveau certificat, ajoutez-le au magasin de clés, puis écrivez le magasin de clés dans un nouveau fichier. Cependant il faut un certain temps pour obtenir les bons détails et cela ne vaut peut être pas la peine d'en importer un seul certificat.

Pourtant, il est intéressant d'essayer. La caisse KeyStore JavaDoc et de lire sur les load, store et setCertificateEntry méthodes.

 1
Author: Guido Simone, 2013-09-11 18:25:55

Dans le "Panneau de configuration Java", je viens d'ajouter le certificat racine GD à la "Secure Site CA" et je n'ai plus l'erreur de certificat lors de l'utilisation de Java. Le certificat que j'ai ajouté était: Go Daddy Classe 2 Certificat racine de l'Autorité de certification-G2

 1
Author: lanbrown, 2014-05-25 07:34:32

Si vous importez de GoDady G2 bundle dans le magasin de clés java résout le problème:

export JAVA_HOME=/usr/lib/jvm/java-8-oracle/
wget https://certs.godaddy.com/repository/gd_bundle-g2.crt
$JAVA_HOME/bin/keytool -import -alias root -file ./gd_bundle-g2.crt -storepass changeit -trustcacerts -keystore $JAVA_HOME/jre/lib/security/cacerts
 1
Author: jpereira, 2016-08-04 15:25:43

Update - this "solution" is no longer valid (see my above accepted answer) - keeping this answer because it did help alleviate the problem so long as the side-effects are tolerable.

Ok, j'ai peut-être trouvé une solution pour mon cas.

props.put("mail.smtp.ssl.trust", "smtp.somecompany.com");

J'ai ajouté ceci à ma construction de session, et maintenant cela fonctionne. Ceci est un contournement, pas un correctif à mon humble avis car je ne sais toujours pas pourquoi mon certificat SSL Godaddy n'est pas approuvé par défaut... ce n'est pas une auto-signé cert.

N'importe qui, n'hésitez pas à sonner car j'aimerais vraiment comprendre ce problème.

 0
Author: SnakeDoc, 2014-01-14 16:05:23

Si vous utilisez les propriétés ci-dessous lors de l'envoi d'un courrier, commentez-le. Cela fonctionne pour moi. Mais cela pourrait causer un problème de sécurité.

props.put("mail.smtp.starttls.enable","true");
 -2
Author: Prathap BS, 2014-10-22 07:43:29