通過gmail發送電子郵件導致獲取PKIX證書路徑錯誤。這同樣適用於從Tomcat發送電子郵件。訪問Gmail(或安全網站)而未獲取PKIX證書路徑錯誤
解決問題後,我希望你覺得這篇文章有用。這篇文章爲您提供了針對這些錯誤的逐步診斷。
第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'被使用了。
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:從其他服務器發送電子郵件可能是一個問題。認證錯誤(仍然)是結果。要解決這些錯誤,您可以執行以下操作:
- 檢查兩步驗證是否已關閉(Google設置)。
- 允許訪問谷歌帳戶從https://accounts.google.com/b/0/DisplayUnlockCaptcha
通知:mkyong example是我的簡單測試應用程序的基礎。
我想你的JVM的可信存儲已損壞。它應該關心谷歌證書,你不應該添加它們。你有沒有嘗試重新安裝JDK?從gmail賬戶發送電子郵件在我的控制檯/ IntelliJ中沒有任何錯誤地爲我工作,而無需添加任何jvm參數。 –
使用SSLpoke查看我的更新。我安裝了1.8_152 JDK版本。 – tjm1706