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: 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证书。我在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的某个类文件将在本地密钥库中下载并设置证书,因此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我能够确定我的链条搞砸了 - 我重新键入了服务器,现在我的链条显示为:
~]# 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的默认密钥库中,似乎默认情况下不会信任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
简单地重新生成证书,以获得Class 2 CA
服务器签署的证书。 GoDaddy客户可以免费更换密码,直到您的证书到期(显然)。
答案 0 :(得分:44)
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: ra@godaddy.com
更新2014年9月17日 - 这仍然是一个问题,Godaddy似乎不关心也不会做任何事情。 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
服务器添加到默认信任库/密钥库之前的解决方法是使用SHA-1
简单地重新生成证书,以获得Class 2 CA
服务器签署的证书。 GoDaddy客户可以免费更换密码,直到您的证书到期(显然)。
一旦SHA-1
服务器签署了Class 2 CA
证书,您的信任链应按预期工作,并且不需要自定义信任库/密钥库导入和/或设置。
我必须使用“弱”证书以使其正常工作,这并不让我感到高兴,到目前为止与GoDaddy通过电子邮件支持进行的讨论表明他们目前没有计划添加{{1}服务器到默认的truststore / keystore。我想在他们确实添加之前,如果您打算使用Java,请确保获得G2 CA
SHA-1
服务器签名证书。
答案 1 :(得分:19)
先生。 Fixer和Wayne Thayer的答案被低估了,但他们实际上是在倡导正确的解决方案。事实上,Wayne Thayer领导GoDaddy的SSL业务,所以他可能知道。您应该将" GoDaddy G1安装到G2 Cross"证书链中的证书以及中间证书。
降级为SHA1并不是一个理想的选择,因为它已被弃用,并将在未来为您带来更多工作。幸运的是,GoDaddy提供了一个解决此问题的交叉证书。他们发布了Wayne重复的说明,并且他们被埋葬了in the comments here。
我亲自使用SHA2证书对此解决方案进行了测试,效果很好。与重新键入和降级到SHA1相比,它是一个非常优秀的解决方案。当需要SHA2时,此选项无论如何都不可用,并且在没有新证书的情况下可能仍然存在Java工具链。
根据GoDaddy的支持,截至2014年7月,最新版本的Java 8中包含正确的根证书,2014年9月,GoDaddy的also said的Wayne Thayer表示证书"计划在在接下来的几个月内被添加到Java中#34;我已经在Java 8 for Mac OS downloaded from here中检查了cacerts文件,它确实包含SHA2根证书。
所以不要把你的链看起来像这样:
它应该是这样的:
See also - my blog post summarizing this issue with work-arounds.
答案 2 :(得分:13)
要使用SHA2使用Godaddy证书在Java中工作,您需要在链中使用其交叉证书将G2(SHA2)根链接到G1(SHA1)根,直到Java决定更新其存储库。可以在此处下载交叉证书包:
https://certs.godaddy.com/anonymous/repository.pki
GoDaddy证书套装 - G2与G1交叉,包括Root
[gd_bundle-g2-g1.crt][1]
答案 3 :(得分:11)
先生。 Fixer是对的。将" GoDaddy G1安装到G2 Cross"证书包文件中的证书以及中间证书。这允许任何识别SHA-1根(包括Java)的客户端信任GoDaddy SHA-2证书。您可以从https://certs.godaddy.com/repository获取此文件。安装此文件后,Java将构建一个证书链,从您的证书到#34; GoDaddy安全服务器证书(中间证书)"到#D; GoDaddy G1到G2交叉证书"到GoDaddy SHA-1根目录。您还可以在我们的存储库中找到包含交叉证书的捆绑文件。关于此选项的最后一点注意事项:根证书上的签名未经检查,因此即使您依赖SHA-1根,这也与完整的SHA-2证书链一样安全。
答案 4 :(得分:4)
以下评论和openssl s_client -connect the.server.name:587 -starttls smtp
的输出。
在证书链中,证书n应该由列表中的证书n + 1颁发:证书的发行人(i)应该是证书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
此处,证书0由证书1(罚款)颁发,证书1由证书2(罚款)颁发,证书2由自签名(也很好,这是根CA)。
但是,证书2不是由证书3颁发的。证书3是错误放置的(可能与证书1相同)。这可能会导致问题,因为这会使链无效。
您至少应该从配置中删除证书3。此外,您还可以删除证书2,因为没有必要使用根CA(无论如何都由客户端知道)。
答案 5 :(得分:1)
听起来您的邮件服务器未由Go Daddy Class 2 Certification Authority
签名,但实际上是由其中一个证书颁发机构签署的。您需要自己验证这一点。假设情况就是这样......
理论上,您的软件应该可以工作 - 因为中间证书由第2类权限签名,并且您在默认JDK证书存储中具有第2类权限。但是,除非您还将中间证书添加到证书库,否则我发现它不起作用。以下是描述类似体验的博客文章的链接:
http://drcs.ca/blog/adding-godaddy-intermediate-certificates-to-java-jdk/
以下是更多GoDaddy中级证书的直接链接: https://certs.godaddy.com/anonymous/repository.pki
我无法确切地告知您必须添加哪个证书 - 这取决于您的邮件服务器中使用的是哪个CA.
[更新]
is there a way to do this programmically?
也许。取决于你想做什么。我使用java.security.KeyStore
类直接从Java代码自动更新私有密钥库,而不使用keytool
。它在概念上很简单 - 从文件加载密钥库,读取新证书,将其添加到密钥库,然后将密钥库写出到新文件。但是,需要一段时间才能获得正确的细节,导入单个证书可能不值得。
尽管如此,尝试还是很有趣。结帐KeyStore JavaDoc并阅读load
,store
和setCertificateEntry
方法。
答案 6 :(得分:1)
在“Java控制面板”中,我刚刚将GD根证书添加到“安全站点CA”,并且在使用Java时我不再出现证书错误。我添加的证书是: Go Daddy Class 2 Certification Authority Root Certificate - G2
答案 7 :(得分:1)
如果将de GoDady G2包导入java密钥库,则可以解决问题:
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
答案 8 :(得分:0)
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.
好的,我可能已经为我的案子找到了解决办法。
props.put("mail.smtp.ssl.trust", "smtp.somecompany.com");
我将此添加到我的Session构建中,现在它可以工作了。这是一个解决方法,而不是修复imho,因为我仍然不知道为什么我的Godaddy SSL证书不是默认值得信任的......它不是自签名证书。
任何人都可以随意加入,因为我真的很想了解这个问题。
答案 9 :(得分:0)
这是您可以尝试的。在运行时将GoDaddy根证书和中间证书添加到信任管理器。即启动该应用程序。
静态最终字符串GD_CERT1 = //“ --- BEGIN CERTIFICATE -----” “ MIIE0DCCA7igAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx” +“ EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT” +“ EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp” +“ ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTExMDUwMzA3MDAwMFoXDTMxMDUwMzA3” +“ MDAwMFowgbQxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +“ EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjEtMCsGA1UE” +“ CxMkaHR0cDovL2NlcnRzLmdvZGFkZHkuY29tL3JlcG9zaXRvcnkvMTMwMQYDVQQD +“ EypHbyBEYWRkeSBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIwggEi” +“ MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC54MsQ1K92vdSTYuswZLiBCGzD” +“ BNliF44v / z5lz4 / OYuY8UhzaFkVLVat4a2ODYpDOD2lsmcgaFItMzEUz6ojcnqOv” +“ K / 6AYZ15V8TPLvQ / MDxdR / yaFrzDN5ZBUY4RS1T4KL7QjL7wMDge87Am + GZHY23e” +“ cSZHjzhHU9FGHbTj3ADqRay9vHHZqm8A29vNMDp5T19MR / gd71vCxJ1gO7GyQ5HY” +“ pDNO6rPWJ0 + tJYqlxvTV0KaudAVkV4i1RFXULSo6Pvi4vekyCgKUZMQWOlDxSq7n” +“ eTOvDCAHf + jfBDnCaQJsY1L6d8EbyHSHyLmTGFBUNUtpTrw700kuH9zB0lL7AgMB” +“ AAGjggEaMIIBFjAPBgNVHRMBAf8EBTADAQH / MA4GA1UdDwEB / wQEAwIBBjAdBgNV” +“ HQ4EFgQUQMK9J47MNIMwojPX + 2yz8LQsgM4wHwYDVR0jBBgwFoAUOpqFBxBnKLbv” +“ 9r0FQW4gwZTaD94wNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8v” +“ b2NzcC5nb2RhZGR5LmNvbS8wNQYDVR0fBC4wLDAqoCigJoYkaHR0cDovL2NybC5n” +“ b2RhZGR5LmNvbS9nZHJvb3QtZzIuY3JsMEYGA1UdIAQ / MD0wOwYEVR0gADAzMDEG” +“ CCsGAQUFBwIBFiVodHRwczovL2NlcnRzLmdvZGFkZHkuY29tL3JlcG9zaXRvcnkv” +“ MA0GCSqGSIb3DQEBCwUAA4IBAQAIfmyTEMg4uJapkEv / oV9PBO9sPpyIBslQj6Zz” +“ 91cxG7685C / b + LrTW + C05 + Z5Yg4MotdqY3MxtfWoSKQ7CC2iXZDXtHwlTxFWMMS2” +“ RJ17LJ3lXubvDGGqv + QqG + 6EnriDfcFDzkSnE3ANkR / 0yBOtg2DZ2HKocyQetawi” +“ DsoXiWJYRBuriSUBAA / NxBti21G00w9RKpv0vHP8ds42pM3Z2Czqrpv1KrKQ0U11” +“ GIo / ikGQI31bS / 6kA1ibRrLDYGCD + H1QQc7CoZDDu + 8CL9IVVO5EFdkKrqeKM + 2x” +“ LXY2JtwE65 / 3YR8V3Idv7kaWKK2hJn0KCacuBKONvPi8BDAB”; // +“ ----- END CERTIFICATE -----”;
static final String GD_CERT2 =
//"-----BEGIN CERTIFICATE-----"
"MIIEfTCCA2WgAwIBAgIDG+cVMA0GCSqGSIb3DQEBCwUAMGMxCzAJBgNVBAYTAlVT"
+"MSEwHwYDVQQKExhUaGUgR28gRGFkZHkgR3JvdXAsIEluYy4xMTAvBgNVBAsTKEdv"
+"IERhZGR5IENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTQwMTAx"
+"MDcwMDAwWhcNMzEwNTMwMDcwMDAwWjCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT"
+"B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHku"
+"Y29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1"
+"dGhvcml0eSAtIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv3Fi"
+"CPH6WTT3G8kYo/eASVjpIoMTpsUgQwE7hPHmhUmfJ+r2hBtOoLTbcJjHMgGxBT4H"
+"Tu70+k8vWTAi56sZVmvigAf88xZ1gDlRe+X5NbZ0TqmNghPktj+pA4P6or6KFWp/"
+"3gvDthkUBcrqw6gElDtGfDIN8wBmIsiNaW02jBEYt9OyHGC0OPoCjM7T3UYH3go+"
+"6118yHz7sCtTpJJiaVElBWEaRIGMLKlDliPfrDqBmg4pxRyp6V0etp6eMAo5zvGI"
+"gPtLXcwy7IViQyU0AlYnAZG0O3AqP26x6JyIAX2f1PnbU21gnb8s51iruF9G/M7E"
+"GwM8CetJMVxpRrPgRwIDAQABo4IBFzCCARMwDwYDVR0TAQH/BAUwAwEB/zAOBgNV"
+"HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9BUFuIMGU2g/eMB8GA1Ud"
+"IwQYMBaAFNLEsNKR1EwRcbNhyz2h/t2oatTjMDQGCCsGAQUFBwEBBCgwJjAkBggr"
+"BgEFBQcwAYYYaHR0cDovL29jc3AuZ29kYWRkeS5jb20vMDIGA1UdHwQrMCkwJ6Al"
+"oCOGIWh0dHA6Ly9jcmwuZ29kYWRkeS5jb20vZ2Ryb290LmNybDBGBgNVHSAEPzA9"
+"MDsGBFUdIAAwMzAxBggrBgEFBQcCARYlaHR0cHM6Ly9jZXJ0cy5nb2RhZGR5LmNv"
+"bS9yZXBvc2l0b3J5LzANBgkqhkiG9w0BAQsFAAOCAQEAWQtTvZKGEacke+1bMc8d"
+"H2xwxbhuvk679r6XUOEwf7ooXGKUwuN+M/f7QnaF25UcjCJYdQkMiGVnOQoWCcWg"
+"OJekxSOTP7QYpgEGRJHjp2kntFolfzq3Ms3dhP8qOCkzpN1nsoX+oYggHFCJyNwq"
+"9kIDN0zmiN/VryTyscPfzLXs4Jlet0lUIDyUGAzHHFIYSaRt4bNYC8nY7NmuHDKO"
+"KHAN4v6mF56ED71XcLNa6R+ghlO773z/aQvgSMO3kwvIClTErF0UZzdsyqUvMQg3"
+"qm5vjLyb4lddJIGvl5echK1srDdMZvNhkREg5L4wn3qkKQmw4TRfZHcYQFHfjDCm"
+"rw==";
//+"-----END CERTIFICATE-----";
static final String GD_CERT3 =
//"-----BEGIN CERTIFICATE-----"
"MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh"
+"MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE"
+"YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3"
+"MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo"
+"ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg"
+"MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN"
+"ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA"
+"PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w"
+"wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi"
+"EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY"
+"avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+"
+"YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE"
+"sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h"
+"/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5"
+"IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj"
+"YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD"
+"ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy"
+"OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P"
+"TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ"
+"HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER"
+"dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf"
+"ReYNnyicsbkqWletNw+vHX/bvZ8=";
//+"-----END CERTIFICATE-----";
公共静态void main(String [] args)引发异常 {
TrustManagerFactory dtmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
dtmf.init((KeyStore) null); // gets you the default trust manager
X509TrustManager defaultTm = null;
for (TrustManager tm : dtmf.getTrustManagers())
{
if (tm instanceof X509TrustManager)
{
defaultTm = (X509TrustManager) tm;
break;
}
}
CertificateFactory cf = CertificateFactory.getInstance("X.509");
byte [] decoded = Base64.getDecoder().decode(GD_CERT1);
ByteArrayInputStream in = new ByteArrayInputStream(decoded);
Certificate ca1 = cf.generateCertificate(in);
in.close();
decoded = Base64.getDecoder().decode(GD_CERT2);
in = new ByteArrayInputStream(decoded);
Certificate ca2 = cf.generateCertificate(in);
in.close();
decoded = Base64.getDecoder().decode(GD_CERT3);
in = new ByteArrayInputStream(decoded);
Certificate ca3 = cf.generateCertificate(in);
in.close();
String keyStoreType = KeyStore.getDefaultType();
KeyStore ks = KeyStore.getInstance(keyStoreType);
ks.load(null, null);
ks.setCertificateEntry("cert1", ca1);
ks.setCertificateEntry("cert2", ca2);
ks.setCertificateEntry("cert3", ca3);
TrustManagerFactory gdtmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
gdtmf.init(ks);
X509TrustManager gdTm = null;
for (TrustManager tm : gdtmf.getTrustManagers())
{
if (tm instanceof X509TrustManager)
{
gdTm = (X509TrustManager) tm;
break;
}
}
TrustManager tms[] = new TrustManager[2];
tms[0] = gdTm;
tms[1] = defaultTm;
try
{
SSLContext sslCtx = SSLContext.getInstance("TLS");
sslCtx.init(null, tms, new SecureRandom());
}
catch (java.security.GeneralSecurityException e)
{
e.printStackTrace();
throw e;
}
HttpsURLConnection.setDefaultSSLSocketFactory(sslCtx.getSocketFactory());
}
我从工作版本中复制了代码。因此可能会出现并发症错误。您只需要完成这些工作即可。
答案 10 :(得分:-2)
如果您在发送邮件时使用以下属性,请对其进行评论。这适合我。但这可能会导致安全问题。
props.put("mail.smtp.starttls.enable","true");