2017-12-02 194 views
4

通过gmail发送电子邮件导致获取PKIX证书路径错误。这同样适用于从Tomcat发送电子邮件。访问Gmail(或安全网站)而未获取PKIX证书路径错误

解决问题后,我希望你觉得这篇文章有用。这篇文章为您提供了针对这些错误的逐步诊断。

第1步:我试图用this postanother 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'被使用了。

Caused by: javax.mail.MessagingException: Can't send command to SMTP host; nested exception is: javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty

步骤2C:当时这也为我的Tomcat Web服务器的情况下?我证实在我的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类,想看看我是否能与谷歌和或smtp.gmail.com连接。结果是在上市:我可以通过端口443

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使用SSL连接到google.com和mail.google.com:可信存储可能被损坏?我安装了更新版本的JDK1.8 v152。我没有任何成功地重新启动应用程序。这是否与JDK和JRE的区别?只有JRE具有lib \ security \ cacerts文件。我尝试了SSL(465)和TLS(587)端口。不。

步骤5:运行OpenSSL的(带的s_client.First -connect smtp.gmail.com:587 -starttls SMTP)显示,我的病毒扫描(停住)被禁止安全邮件的发送。所以,暂时我禁用了这个电子邮件屏蔽。这给了以下错误:

java.lang.RuntimeException: javax.mail.AuthenticationFailedException

步骤6:释放virusscanner网盾,使用openssl后给了以下错误:CN =谷歌互联网管理局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 verify error:num=20:unable to get local issuer certificate ....

允许的Gmail帐户从弱认证应用accessable“,在你的谷歌账户的设置,即最终在正确发送电子邮件产生。这是链接到security settings of your Google account

步骤7:从其他服务器发送电子邮件可能是一个问题。认证错误(仍然)是结果。要解决这些错误,您可以执行以下操作:

通知:mkyong example是我的简单测试应用程序的基础。

+0

我想你的JVM的可信存储已损坏。它应该关心谷歌证书,你不应该添加它们。你有没有尝试重新安装JDK?从gmail账户发送电子邮件在我的控制台/ IntelliJ中没有任何错误地为我工作,而无需添加任何jvm参数。 –

+0

使用SSLpoke查看我的更新。我安装了1.8_152 JDK版本。 – tjm1706

回答

3

最后我找到了答案。

1 - 当然谷歌/ gmail证书是好的;-)第1步是执行这些类型的检查。尝试手动添加证书CA等。请参阅上文。

2 - 第2步是检查已知的'SSLPoke'Java类Java类是否可以与安全网站进行联系。

3 - 检查完所有上述检查后,执行'openssl'显示我的病毒扫描器电子邮件盾阻止了流量。停止一段时间的防御是第3步。

4 - 然后我得到了来自Gmail的'未经过身份验证的'错误。允许'gmail帐户可从弱认证的应用程序'访问,这最终给出了正确发送的电子邮件。这是一个Google account security setting

相关问题