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.
2014年11月29日更新-这仍然是一个问题,Godaddy似乎不在乎也不会对此做任何事情。几个月前,Godaddy安全产品副总裁发表了一篇博客文章here,说正在修复该问题,并提供了一种临时解决方法,但到目前为止,没有任何改变。重要的是要注意,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: [email protected]
2014年9月17日更新-这仍然是一个问题,Godaddy似乎不在乎也不会对此做任何事情。当Google在11月弃用所有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不是加密的 session 。我需要在需要SSL证书的端口587上使用TLS。我在由GoDaddy G2 CA签名的服务器上有一个有效的SSL证书,并且已经放置了一段时间(没有问题)。

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

根据我对许多SO链接以及普通google-fu的理解,这通常是Java不信任证书或CA时引起的-这是自签名证书的常见现象。我已经使用了几个在线SSL证书检查器来确保该链是有效的,等等。所有这些看起来都是正常的……但是java不会自动使用该证书。

我知道Sun某个地方有一个类文件,该文件将在本地 keystore 中下载并设置证书,因此Java会信任它...但这不仅对于将部署到多个系统的应用程序是不切实际的,对于Godaddy签名证书很傻。

这是怎么回事?如何使Java在服务器上使用有效证书而不需要让Java接受所有证书?

编辑:我只是看了我的Windows Java控制面板(jdk 7的默认安装),并且肯定,在Signer CA下,颁发者:The Go Daddy Group, Inc. Go Daddy Class 2 Certification Authority列出了...那么,给出什么呢?我的证书是Godaddy证书...
UPDATE --
这是注释中推荐的openssl命令所见的证书链:

~]# 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,我能够确定我的链条被弄乱了—我重新设置了服务器的 key ,现在我的链条显示为:
 ~]# 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仍然对证书路径等抛出相同的异常。因此,默认情况下,似乎在Java 7的默认 keystore 中仍不信任G2证书链。
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信任库中-导致默认的Java安装不信任它的权限,因此不信任您的链接证书。在GoDaddy将G2 CA服务器添加到默认信任库之前,解决方法是简单地使用SHA-1 as-对证书进行 key 更新,以获取由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.
2014年11月29日更新-这仍然是一个问题,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: [email protected]
2014年9月17日更新-这仍然是一个问题,Godaddy似乎不在乎也不会对此做任何事情。当Google在11月弃用所有SHA-1证书时,这将成为一个主要问题。我强烈建议任何可以联系Godaddy并将其指向此处的人。

~~~~

我最初的帖子/问题是关于为什么我的链式店不起作用。显而易见,我的设置不好(通过@Bruno等人的一些建议很快将其修复-谢谢)。但是,当我更正的链仍然无法使用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服务器添加到默认信任库/ keystore 之前,解决方法是仅使用SHA-1 as-对证书进行 key 更新,以获取由Class 2 CA服务器签名的证书。在您的证书过期之前(显然),GoDaddy客户可以免费重新键入密码。

拥有SHA-1服务器签名的Class 2 CA证书后,您的信任链应会按预期工作,并且不需要自定义信任库/ keystore 导入和/或设置。

我必须使用“较弱”的证书才能使其正常运行并不令我感到高兴,到目前为止,通过电子邮件支持与GoDaddy进行的讨论表明,他们目前尚无将G2 CA服务器添加到默认信任库/中的计划。 keystore 。我猜想直到他们添加它之前,如果您打算使用Java,请确保获得SHA-1 Class 2 CA服务器签名的证书。

关于java - GoDaddy SSL证书不适用于Java,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18746565/

10-10 04:35