GoDaddy SSL Cert 無法使用 Java

2022-08-31 16:24:59

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安全产品副总裁在这里发表了一篇博客文章,称修复程序正在进行中,并提供了临时的解决方法,但截至今天没有任何变化。重要的是要注意,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

2014 年 9 月 17 日更新 -- 这仍然是一个问题,Godaddy 似乎并不在乎,也不会对此采取任何措施。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不是加密会话。我需要在端口587上使用TLS,这需要SSL证书。我在服务器上有一个有效的SSL证书,该证书由GoDaddy G2 CA签名,并且已经存在了一段时间(没有问题)。

我的问题是,我在尝试在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的某个地方有一个类文件,它将在本地密钥库中下载并设置证书,因此java会信任它...但这对于将部署到多个系统的应用程序来说不仅不切实际,而且对于Godaddy签名的证书来说只是愚蠢的。

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

编辑:我刚刚在我的Windows中查看了Java控制面板(jdk 7的默认安装),果然,在发布者:下列出...那么是什么原因呢?我的证书是 Godaddy 证书...Signer CAThe Go Daddy Group, Inc. Go Daddy Class 2 Certification Authority

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我能够确定我的链被搞砸了 - 我重新键入了服务器,现在我的链看起来像这样:

 ~]# 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 服务器,一个称为 ,另一个称为 。他们签署所有证书,而签署所有证书。这就是问题所在 - GoDaddy尚未将其较新的服务器添加到默认java信任库 - 导致默认java安装不信任其权限,因此不信任您的链式证书。在 GoDaddy 将服务器添加到默认信任库之前,解决方法是使用 as- 获取由服务器签名的证书,只需重新键入证书即可。在您的证书到期之前,GoDaddy 客户可以免费重新加密(显然)。Class 2 CAG2 CAClass 2 CASHA-1G2 CASHA-2G2 CAG2 CASHA-1Class 2 CA


答案 1

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安全产品副总裁发表了一篇博客文章,称正在修复,并提供了临时的解决方法,但截至今天没有任何变化。重要的是要注意,Godaddy的G2 CA服务器已经存在了至少5年,在此期间,Godaddy尚未采取适当的步骤来解决此已知问题。提供的解决方法只是一种解决方法,而不是解决方案。第三方服务的用户无法控制证书在服务器上的安装方式。[here][1]

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

2014 年 9 月 17 日更新 -- 这仍然是一个问题,Godaddy 似乎并不在乎,也不会对此采取任何措施。11月,当谷歌弃用所有SHA-1证书时,这将成为一个主要问题。我强烈推荐任何可以联系Godaddy并指出他们在这里的人。

~~~~

我最初的帖子/问题是关于为什么我的连锁店不起作用。很明显,我有一个糟糕的设置(很快就被@Bruno和其他人的建议修复了——谢谢)。然而,当我的修正链仍然不能与Java一起使用时,很明显有一个更大的问题潜伏着。这花了一段时间,但问题实际上出在GoDaddy上。

这实际上是一个GoDaddy问题(我与他们一起收到了冗长的支持电子邮件)。

他们有 2 个 CA 服务器,一个称为 ,另一个称为 。他们签署所有证书,而签署所有证书。Class 2 CAG2 CAClass 2 CASHA-1G2 CASHA-2

这就是问题所在 - GoDaddy尚未将其较新的服务器添加到默认服务器 - 导致默认Java安装不信任其权限,因此不信任您的链式证书。G2 CAJava truststore/keystore

在 GoDaddy 将服务器添加到默认信任库/密钥库之前,解决方法是使用 as-获取由服务器签名的证书,只需重新生成证书密钥即可。在您的证书到期之前,GoDaddy 客户可以免费重新加密(显然)。G2 CASHA-1Class 2 CA

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

我必须使用“较弱”的证书才能使其正常工作,这并不让我感到高兴,到目前为止,通过电子邮件支持与GoDaddy的讨论表明他们目前没有计划将服务器添加到默认信任库/密钥库。我想在他们添加它之前,如果您打算使用Java,请确保您获得服务器签名的证书。G2 CASHA-1Class 2 CA


答案 2

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

降级到SHA1不是一个理想的选择,因为它已被弃用,并且将导致您将来做更多的工作。幸运的是,GoDaddy 提供了解决此问题的交叉证书。他们发布了Wayne复制的说明,他们被埋葬在这里的评论中

我亲自使用SHA2证书测试了此解决方案,并且效果很好。与重新键入和降级到SHA1相比,这是一个优越得多的解决方案。当需要 SHA2 时,此选项无论如何都不可用,并且可能仍然有 Java 工具链没有新证书。

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

因此,您的链看起来像这样:

  • Go Daddy 根证书颁发机构 – 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 安全证书颁发机构 – 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 Certification Authority: (SHA-1) – Hash 27 96 BA E6 3F 18 01 E2 77 26 1B A0 D7 77 70 02 8F 20 EE E4.这是内置于大多数系统(包括 Java)中的旧根证书。
  • Go Daddy 根证书颁发机构 – G2: (SHA-2) – 哈希 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 安全证书颁发机构 – 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 证书

另请参阅 - 我的博客文章总结了这个问题与解决方法。