2013-10-24 49 views
1

我可以連接和發送電子郵件我自己就好從我的工作站的JavaMail通過對工作站TLS發送,但不在服務器上

工作站版本:

  • 爪哇 - 1.6.0_21
  • Tomcat的 - 6.0.29

但是在服務器上我得到一個錯誤:

javax.mail.MessagingException: Could not connect to SMTP host: 
    smtpa.state.ak.us, port: 465 
    (java.net.SocketException: java.security.NoSuchAlgorithmException: 
    Error constructing implementation 
    (algorithm: Default, provider: SunJSSE, 
     class: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)) 

在堆棧跟蹤的底部以下的部分

Caused by: java.io.IOException: Keystore was tampered with, or password was incorrect 
     at sun.security.provider.JavaKeyStore.engineLoad(Unknown Source) 
     at sun.security.provider.JavaKeyStore$JKS.engineLoad(Unknown Source) 
     at java.security.KeyStore.load(Unknown Source) 
     at com.sun.net.ssl.internal.ssl.TrustManagerFactoryImpl.getCacertsKeyStore(Unknown Source) 
     at com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl.getDefaultTrustManager(Unknown Source) 
     at com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl.<init>(Unknown Source) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
     at java.lang.reflect.Constructor.newInstance(Unknown Source) 
     at java.lang.Class.newInstance0(Unknown Source) 
     at java.lang.Class.newInstance(Unknown Source) 
     ... 76 more 
Caused by: java.security.UnrecoverableKeyException: Password verification failed 
     ... 88 more 

服務器運行的是:

  • 爪哇 - 1.6.0_18-B-07
  • 的Tomcat - 6.0.28

JavaMail是捆綁了我的Web應用程序,是版本1.4.3

編輯:

爲了完整起見,我升級了捆綁JAVAMAIL1.5.0-B01
我仍然收到相同的錯誤。

keytool -list -keystore <path-to-default-java-keystore>使用默認的Java密鑰庫密碼可以在兩個系統上使用。

進一步編輯:

經過一些挖我發現這太問題:Accessing Tomcat's configured KeyStore and TrustStore

我加了一些記錄語句我的應用程序: 我得到同樣的結果在我的工作站,我做在服務器上。

[email protected]:20:30 DEBUG [statements] TextEmail - javax.net.ssl.trustStore: null 
[email protected]:20:30 DEBUG [statements] TextEmail - javax.net.ssl.trustStorePassword: fedizPass 
[email protected]:20:30 DEBUG [statements] TextEmail - javax.net.ssl.trustStoreType: null 
[email protected]:20:30 DEBUG [statements] TextEmail - javax.net.ssl.keyStore: null 
[email protected]:20:30 DEBUG [statements] TextEmail - javax.net.ssl.keyStorePassword: fedizPass 
[email protected]:20:30 DEBUG [statements] TextEmail - javax.net.ssl.keyStoreType: null 

如果仔細觀察,默認密碼不會返回,也不是信任商店。 我有Fediz-1.1.0-SNAPSHOT配置了一個自定義的trustStoreWS-FEDERATION我Fediz代碼使用的是Spring的安全插件。所有這些工作正常。我的工作站和測試服務器上都部署了第二個應用程序,並使用它。它也可以正常工作,並可以通過FTPS將文件發送到另一臺服務器。另外,如果它在SystemProperties中提供了錯誤的密碼,那麼它爲什麼會在我的工作站上工作,而不是在服務器上工作?

回答

1

感謝@Bill Shannon我能夠讓它工作。

我結束了在Javamail - SSLNotes
延伸MailSSLSocketFactory,在一個示例中列出我跟着JSSE Reference - Creating Your Own X509TrustManager
我用它來添加備份的TrustManager從System.getProperty("java.home")抓住默認密鑰庫並傳遞默認密碼。如果由MailSSLSocketFactory創建的默認證書未能驗證證書,它將嘗試將該X509TrustManager設置爲回退。

0

可能你的Tomcat配置選擇了一個非默認密碼的不同密鑰庫?

+0

如何判斷它是否指向不同的密鑰庫?我試着向Catalina.sh添加'JAVA_OPTS =「$ JAVA_OPTS -Djavax.net.ssl.trustStore = $ JAVA_HOME/lib/security/cacerts -Djavax.net.ssl.trustStorePassword = changeit」',但這並沒有幫助。 – Raystorm

+1

請參閱[SSLNOTES.txt](https://javamail.java.net/docs/SSLNOTES.txt)中的調試部分。也許一些額外的JSSE調試輸出會有所幫助。您也可以嘗試從程序中打印出javax.net.ssl.trustStore屬性,以確保它按照您的預期設置。 –

+0

我試着設置各種調試選項。 (我剛剛意識到我的Log4J設置可能會壓扁它)。但是,按照我的編輯中指定的方式打印javax.net.ssl。* store *屬性,這讓我意識到有些事情是設置密碼以訪問信任庫錯誤。所以我最終根據'MailSSLSocketFactory'連接了一個TrustManager。可能不是最好的方法,但有效。 – Raystorm

相關問題