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根证书。
所以,而不是你的链看起来像这样:
它应该是这样的:
另请参阅 - 我的博客文章用解决方法总结了这个问题。
要使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?