2017-12-02 135 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

相關問題