GoDaddy SSL Cert不适用于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.

UPDATE 11/29/2014 - 这仍然是一个问题,Godaddy似乎不在乎,也不会做任何事情。 几个月前,Godaddy安全产品副总裁在这里发表了一篇博客文章,表示正在解决这个问题,并提供了一个临时解决方案,但至今为止没有任何改变。 需要注意的是,Godaddy的G2 CA服务器已经存在了至少5年,在那段时间,Godaddy没有采取适当的措施来解决这个已知问题。 提供的解决方法就是这样一种解决方法,而不是解决方案。 第三方服务的用户无法控制证书在服务器上的安装方式。

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

如果您愿意拨打以下电话号码,请访问SSL团队的联系信息:

GoDaddy SSL Team Support Number: 1-480-505-8852 -- Email: ra@godaddy.com

更新9/17/2014 - 这仍然是一个问题,Godaddy似乎不在乎,也不会做任何事情。 到11月份,当Google弃用所有SHA-1证书时,这将成为一个主要问题。 我强烈建议任何可以联系Godaddy并将其指向此处的人。

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)

我有一个邮件服务器,我试图从我的Java应用程序发送邮件。 我可以成功发送端口25,所以我知道代码工程和所有,但25不是加密会话。 我需要在端口587上使用需要SSL证书的TLS。 我在GoDaddy G2 CA签署的服务器上有一个有效的SSL证书,并且已经存在了一段时间(没有问题)。

我的问题是,我得到着名的PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target尝试在587上连接和发送邮件时, PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target错误消息的PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

从我对许多SO链接以及普通的google-fu的理解来看,这通常是由于Java不信任证书或CA而导致的 - 这是自签名证书常见的情况。 我已经使用了几个在线SSL Cert检查器来确保链是有效的,等等。所有这些看起来都很正常......但是java不会自动使用证书。

我知道有一个来自Sun的某个类文件,它将下载并设置本地密钥库中的证书,以便java相信它......但这对于将部署到多个系统的应用程序不仅不切实际,而且仅仅是愚蠢的Godaddy签署的证书。

这是怎么回事? 我如何让java在服务器上使用有效的证书而不必让java接受所有的证书?

编辑:我只是看着我的Windows Java控制面板(jdk 7的默认安装),果然,在Signer CA下发布: The Go Daddy Group, Inc. Go Daddy Class 2 Certification Authority ...所以给了什么? 我的证书是Godaddy证书...

UPDATE --

这里是从评论中推荐的openssl命令看到的cert链:

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

看起来对我来说我认为...

UPDATE 2 --

好吧,感谢@Bruno,我能够确定我的链条已经搞乱了 - 我重新键入了服务器,现在我的链条出现了:

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

看起来比以前更好。 --Java仍然抛出与证书路径相同的异常等等。所以看起来,默认情况下,G2证书链在Java 7的默认密钥库中不受信任。

FINAL UPDATE FOR COMPLETENESS @ 1/14/2014

就像更新 - 这确实是一个GoDaddy问题(我已经与他们长时间的电子邮件支持)。 他们有2台CA服务器,一台称为Class 2 CA ,另一台称为G2 CA 他们的Class 2 CA签署所有SHA-1证书,而G2 CA签署他们所有的SHA-2证书。 这就是问题出在哪里 - GoDaddy没有将他们新的G2 CA服务器添加到默认的java truststore中 - 导致默认的java安装不信任它的权限,因此不信任您的链接证书。 直到GoDaddy将G2 CA服务器添加到默认信任库为止的解决方法是简单地使用SHA-1重新签名您的证书,以获得由Class 2 CA服务器签名的证书。 直到您的证书到期(显然),重新开机对于GoDaddy客户是免费的。


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.

UPDATE 11/29/2014 - 这仍然是一个问题,Godaddy似乎不在乎,也不会做任何事情。 几个月前,Godaddy安全产品副总裁[here][1]发表了一篇博客文章,表示修复正在进行中,并提供了一个临时解决方案,但至今没有任何改变。 需要注意的是,Godaddy的G2 CA服务器已经存在了至少5年,在那段时间,Godaddy没有采取适当的措施来解决这个已知问题。 提供的解决方法就是这样一种解决方法,而不是解决方案。 第三方服务的用户无法控制证书在服务器上的安装方式。

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

如果您愿意拨打以下电话号码,请访问SSL团队的联系信息:

GoDaddy SSL Team Support Number: 1-480-505-8852 -- Email: ra@godaddy.com

更新9/17/2014 - 这仍然是一个问题,Godaddy似乎不在乎,也不会做任何事情。 到11月份,当Google弃用所有SHA-1证书时,这将成为一个主要问题。 我强烈建议任何可以联系Godaddy并将其指向此处的人。

~~~~

我最初的帖子/问题是关于为什么我的连锁店不工作。 很明显,我有一个不好的设置(这很快就被来自@布鲁诺和其他人的建议修复 - 谢谢)。 但是,当我的纠正链仍然不能与Java一起工作时,很显然潜伏着更大的问题。 这花了一段时间,但问题实际上是与GoDaddy。

这实际上确实是一个GoDaddy问题(我已经与他们长时间的电子邮件支持)。

他们有2台CA服务器,一台称为Class 2 CA ,另一台称为G2 CA 他们的Class 2 CA签署所有SHA-1证书,而G2 CA签署他们所有的SHA-2证书。

这就是问题出在哪里 - GoDaddy没有将他们新的G2 CA服务器添加到默认的Java truststore/keystore - 导致默认的Java安装不信任它的权限,因此不信任您的链接证书。

直到GoDaddy将G2 CA服务器添加到默认信任库/密钥库为止的解决方法是简单地使用SHA-1重新签名您的证书,以获得由Class 2 CA服务器签名的证书。 直到您的证书到期(显然),重新开机对于GoDaddy客户是免费的。

一旦您拥有由Class 2 CA服务器签署的SHA-1证书,您的信任链应该按预期工作,并且不需要导入和/或设置自定义信任库/密钥库。

为了让它正常运行,我不得不使用“较弱”的证书,并且通过电子邮件支持与GoDaddy的讨论表明他们目前没有计划将G2 CA服务器添加到默认信任库/密钥库。 我猜想,直到他们添加它时,如果您打算使用Java,请确保您获得了SHA-1 Class 2 CA服务器签名证书。


Fixer先生和Wayne Thayer先生的答案都被低估了,但他们实际上主张正确的解决方法。 事实上,Wayne Thayer领导GoDaddy的SSL业务,所以他可能知道。 您应该在证书链中安装“GoDaddy G1到G2 Cross”证书以及中间证书。

降级到SHA1并不是一个理想的选择,因为它已被弃用,并将在未来带来更多的工作。 幸运的是,GoDaddy提供了一个解决这个问题的交叉证书。 他们发布了韦恩重复的说明,并将其埋在这里的评论中。

我亲自用SHA2证书测试过这个解决方案,它运行良好。 与重新键入和降级到SHA1相比,这是一个非常优越的解决方案。 当需要SHA2时,该选项将无法使用,并且可能还有没有新证书的Java工具链。

根据GoDaddy的支持,截至2014年7月,最新版本的Java 8中包含了正确的根证书,并且在2014年9月,GoDaddy的Wayne Thayer还表示,该证书“计划在未来几个月内添加到Java ”。 我已经检查了从这里下载的用于Mac OS的Java 8中的cacerts文件,它确实包含SHA2根证书。

所以,而不是你的链看起来像这样:

  • Go爸爸根证书颁发机构 - G2:(SHA-2) - 散列47 BE AB C9 22 EA E8 0E 78 78 34 62 A7 9F 45 C2 54 FD E6 8B。 这是某些系统内置的根证书(例如Chrome)。 SnakeDoc声称“它不是内置于Java,Windows CE,Microsoft Exchange和更多平台”。
  • Go Daddy Secure证书颁发机构 - G2:(SHA-2) - 散列27 AC 93 69 FA F2 52 07 BB 26 27 CE FA CC BE 4E F9 C3 19 B8
  • 您的SHA2证书
  • 它应该是这样的:

  • Go Daddy Class 2认证机构:(SHA-1) - 散列27 96 BA E6 3F 18 01 E2 77 26 1B A0 D7 77 70 02 8F 20 EE E4。 这是大多数系统内置的旧的根证书,包括Java。
  • Go Daddy Root证书颁发机构 - G2:(SHA-2) - Hash 34 0B 28 80 F4 46 FC C0 4E 59 ED 33 F5 2B 3D 08 D6 24 29 64.这就是所谓的“GoDaddy G1到G2交叉证书” 。
  • Go Daddy Secure证书颁发机构 - G2:(SHA-2) - 散列27 AC 93 69 FA F2 52 07 BB 26 27 CE FA CC BE 4E F9 C3 19 B8
  • 您的SHA-2证书
  • 另请参阅 - 我的博客文章用解决方法总结了这个问题。


    要使Godaddy证书能够以SHA2的方式在Java中工作,您需要在您的链中使用他们的交叉证书,将G2(SHA2)根链接到G1(SHA1)根,直到Java决定更新其存储库。 交叉证书包可以在这里下载:

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

    GoDaddy证书包 - 带有Cross的G1,包含Root

    [gd_bundle-g2-g1.crt][1] 
    
    链接地址: http://www.djcxy.com/p/31281.html

    上一篇: GoDaddy SSL Cert Not Working With Java

    下一篇: How to use NSURLConnection to connect with SSL for an untrusted cert?