2013-06-26 14 views
2

我試圖連接到服務器的SMTP郵件服務器的服務器上的Java方法,而我得到這個錯誤:Java:方法找不到證書路徑 - 我需要設置什麼?

stack trace: org.apache.commons.mail.EmailException: Sending the email 
to the following server failed : mail.mycompanyname.com:465 

獲取完整的堆棧跟蹤後,我注意到以下行,其中反覆3次/次嘗試:

nested exception is: 
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: 
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: 
unable to find valid certification path to requested target 

服務器在Apache服務器上安裝了證書。但是,我使用GlassFish作爲訪問Java方法的Web應用程序(在客戶端)的應用程序服務器,GlassFish位於Apache Server後面。我沒有在GlassFish上爲此證書調整任何內容。

我看到一些其他的問題,以及諸如這裏類似的答案,但我不明白如何實現它:

PKIX path building failed: unable to find valid certification path to requested target

此外,還有這個爲好,但再一次,我不知道如何使用它在我的情況下,如果適當的話:

Unable to find valid certification path to requested target - error even after cert imported

所以我的問題是,我需要做什麼,從Java的角度來看,以清除這個錯誤?

難道我只需要創建一個屬性文件,如下圖所示?:

Which is the default location for keystore/truststore of Java applications?

或者說,我還需要設置一個信任?

我是否需要在GlassFish上設置任何內容?

希望有人能幫助我在這裏的基礎知識。提前感謝您的任何意見。

UPDATE:

OK,最後用Hiro2K的下方優秀幫助了它。所缺少的是將Apache Webserver的SMTP郵件服務器使用的證書導入到GlassFish中。下面的Hiro2k的命令工作正常,但我的麻煩是找到正確的證書。

使用WHM,我可以看到郵件服務器,在我的情況下是Exim,稱爲host1.mycompany.com,所以我自然而然地選擇了自簽名的認證名host1.mycompany.com.crt 。但是,該證書已過期,因此無法使用。我不得不進入Exim的配置文件來找到它的名爲exim.crt的證書,並將其導入到GlassFish中。然後它工作。

請注意,服務器上還有許多證書,包括imap(例如imapd.pem)和pop3(pop3.pem)等。很令人困惑。

回答

3

因此SMTP SSL使用端口465,這意味着爲了讓客戶端連接到服務器,它必須信任服務器的證書。 Java和Glassfish有一個默認的信任庫,它可以用於任何大型證書頒發機構(Thawt,Verisign等)簽署的任何證書,並且由於它不工作,所以我相信您的服務器正在使用自己簽署SSL證書。

這不是問題,並且完全支持許多不想爲這些證書付費的內部應用程序。問題是GlassFish不知道該自簽名證書,因此您必須將其導入默認的glassfish信任庫。您將在$ GLASFISH_INSTALL_DIR $/domains/domain1/config/cacerts.jks中找到它。

要導入證書,您可以使用java附帶的keytool。

keytool -importcert -v -noprompt -alias smtp.server.name -file 
/path/to/smtp.server.der -keystore 
$GLASFISH_INSTALL_DIR$/domains/domain1/config/cacerts.jks -storepass changeit 

您唯一需要注意的是證書的格式。 Keytool僅支持二進制DER格式,而許多Linux服務器使用稱爲PEM的OpenSSL文本格式。使用OpenSSL從一個轉換到另一個很容易。

openssl x509 -in input.crt -inform PEM –out output.der -outform DER 
+0

謝謝Hiro2k,我以前購買過一個證書,它安裝在Apache Webserver中。 GlassFish不會直接與客戶交談。但是,Java方法可能使用GlassFish與Apache Webserver進行通信。我需要在我的java方法中設置系統屬性,例如karthik列出的嗎? http://stackoverflow.com/questions/5871279/java-ssl-and-cert-keystore – ggkmath

+0

當證書到期並且我得到一個新證書時,是否需要重複此過程將證書導入GlassFish? – ggkmath

+2

您不應該設置任何系統屬性,GlassFish已經擁有它們。您需要像我說的那樣將證書導入GlassFish信任庫。如果是這種情況,你也必須重複這個過程。 – Hiro2k

相關問題