通过Gmail发送电子邮件导致获得PKIX证书路径错误。这同样适用于从Tomcat发送电子邮件。
解决问题后,我希望您觉得这篇文章很有用。这篇文章为您提供了对这些错误的逐步诊断。
第1步:我尝试使用this post和another post解决问题,但这对我没有帮助。在大多数情况下,这就足够了。您可以使用keytool通过'keytool -list -keystore'%JAVA_HOME%/ jre / lib / security / cacerts“'
列出证书我通过单击gmail URL的锁定图标并将证书导出/导入到我使用的JDK版本的cacert文件来添加证书。我可以通过keytool -list看到证书已添加。这个过程在(链接)帖子中有很好的描述。
第2A步:我使用的是正确的信任库吗?我添加了JVM参数来指导证书搜索,例如-Djavax.net.ssl.trustStore =“.... / jre / lib / security / cacerts” -Djavax.net.ssl.trustStorePassword = “的changeit”。
步骤2B :当我将cacerts文件的值更改为cacertsXYZ时,我收到错误。因此,这证明了'cacert'被使用了。
引起:javax.mail.MessagingException:无法向SMTP发送命令 主办;嵌套异常是:javax.net.ssl.SSLException: java.lang.RuntimeException:意外错误: java.security.InvalidAlgorithmParameterException:trustAnchors 参数必须为非空
步骤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。
第3步:我尝试使用公开提供的“ SSLPoke ”Java类来查看我是否可以与Google和/或smtp.gmail.com建立联系。结果在列表中:我可以通过端口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();
}
第4步:受信任的商店可能已损坏?我安装了更新版本的JDK1.8是v152。我没有成功地重新启动应用程序。这与JDK和JRE之间的区别有关吗?只有JRE具有lib \ security \ cacerts文件。我尝试了SSL(465)和TLS(587)端口。不。
第5步:运行 openssl (使用s_client -connect smtp.gmail.com:587-starttls smtp)显示我的病毒扫描程序(Avast)禁止发送安全邮件所以,有一会儿我禁用了这个电子邮件盾牌。这给出了以下错误:
java.lang.RuntimeException:javax.mail.AuthenticationFailedException
第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帐户可以通过弱验证的应用访问',这是Google帐户中的一个设置,最终会在正确发送电子邮件时产生。这是security settings of your Google account的链接。
第7步:从其他服务器发送电子邮件可能有问题。验证错误(仍然)是结果。要克服这些错误,您可以:
注意:mkyong example是我的简单测试应用程序的基础。
答案 0 :(得分:3)
最后我找到了答案。
1 - 当然google / gmail证书还可以;-)第1步是执行这些检查。尝试手动添加证书CA等。见上文。
2 - 第2步检查已知的' SSLPoke ' Java类Java类可以与安全网站联系。
3 - 检查完所有上述检查后,执行' openssl '显示我的病毒扫描程序电子邮件屏蔽阻止了流量。停止这种防御一段时间是第3步。
4 - 然后我得到了未经过身份验证的'来自Gmail的错误。允许 gmail帐户可以从经过弱验证的应用访问',最终提供了正确发送的电子邮件。这是Google account security setting