通过Gmail发送电子邮件导致获得PKIX证书路径错误 . 这同样适用于从Tomcat发送电子邮件 .
After solving the issue ,我希望你发现这篇文章很有用 . 这篇文章为您提供了对这些错误的逐步诊断 .
Step 1 :我试图使用this post和another post解决问题,但这对我没有帮助 . 在大多数情况下,这就足够了 . 您可以使用keytool通过'keytool -list -keystore 2871290 '列出证书
我通过单击gmail URL的锁定图标并将证书导出/导入到我使用的JDK版本的cacert文件来添加证书 . 我可以通过keytool -list看到证书已添加 . 这个过程在(链接)帖子中有很好的描述 .
Step 2A :我使用的是正确的信任库吗?我添加了JVM参数来指导证书搜索,例如-Djavax.net.ssl.trustStore = "..../jre/lib/security/cacerts" -Djavax.net.ssl.trustStorePassword = "changeit" .
Step 2B :当我将cacerts文件的值更改为cacertsXYZ时,我收到错误 . 因此,这证明使用了'cacert' .
引起:javax.mail.MessagingException:无法向SMTP主机发送命令;嵌套异常是:javax.net.ssl.SSLException:java.lang.RuntimeException:意外错误:java.security.InvalidAlgorithmParameterException:trustAnchors参数必须为非空
Step 2C :我的Tomcat网络服务器也是如此吗?我在JRE_HOME的cacerts中验证了证书在那里 . 在Tomcat中,我的JRE_HOME是"C:\Program Files\Java\jdk1.8.0_144\jre" . 我的JAVA_HOME = C:\ Program Files \ Java \ jdk1.8.0_144 .
Step 3 :我尝试使用公开的' SSLPoke 'Java类来查看我是否可以连接Google和/或smtp.gmail.com . 结果在列表中:我 could 通过端口443与SSL连接到google.com和mail.google.com .
try {
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
// **Fail** TLS - SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("smtp.gmail.com", 587);
// **Fail** SSL - SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("smtp.gmail.com", 465);
// **OK**
SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("google.com", 443);
// OK
SSLSocket sslsocket2 = (SSLSocket) sslsocketfactory.createSocket("mail.google.com", 443);
InputStream in = sslsocket.getInputStream();
OutputStream out = sslsocket.getOutputStream();
out.write(1); // write test byte to get reaction.
while (in.available() > 0) {
System.out.print(in.read());
}
System.out.println("Successfully connected");
} catch (Exception exception) {
exception.printStackTrace();
}
Step 4 :受信任的商店可能已损坏?我安装了更新版本的JDK1.8是v152 . 我没有成功地重新启动应用程序 . 这与JDK和JRE之间的区别有关吗?只有JRE具有lib \ security \ cacerts文件 . 我尝试了SSL(465)和TLS(587)端口 . 不 .
Step 5 :运行 openssl (使用s_client -connect smtp.gmail.com:587-starttls smtp)显示我的病毒扫描程序(Avast)禁止发送安全邮件 . 所以,有一会儿我禁用了这个电子邮件盾牌 . 这给出了以下错误:
java.lang.RuntimeException:javax.mail.AuthenticationFailedException
Step 6 :释放virusscanner网盾后,使用openssl发出以下错误:CN = Google Internet Authority G3验证错误:num = 20:无法获得本地颁发者证书 .
OpenSSL> s_client -connect smtp.gmail.com:587 -starttls smtp CONNECTED(00000280)depth = 1 C = US,O = Google Trust Services,CN = Google Internet Authority G3验证错误:num = 20:无法获取本地发行人证书....
允许'gmail account to be accessable from weakly authenticated apps'(谷歌帐户中的设置)最终在正确发送电子邮件时产生 . 这是security settings of your Google account的链接 .
Step 7 :从其他服务器发送电子邮件可能有问题 . 验证错误(仍然)是结果 . 要克服这些错误,您可以:
-
检查两步验证是否已关闭(Google设置) .
-
允许从https://accounts.google.com/b/0/DisplayUnlockCaptcha访问Google帐户
注意:mkyong example是我的简单测试应用程序的基础 .
1 回答
最后我找到了答案 .
1 - 当然google / gmail证书是好的;-)第1步是执行这些检查 . 尝试手动添加证书CA等 . 见上文 .
2 - 步骤2检查已知的' SSLPoke 'Java类Java类是否可以与安全网站联系 .
3 - 检查完所有上述检查后,执行' openssl '显示我的病毒扫描程序电子邮件屏蔽阻止了流量 . 停止这种防守一段时间是第3步 .
4 - 然后我从Gmail收到'not authenticated'错误 . 允许' gmail account accessable from weakly authenticated apps ',最终给出了正确发送的电子邮件 . 这是Google account security setting