我可以連接和發送電子郵件我自己就好從我的工作站的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
編輯:
爲了完整起見,我升級了捆綁JAVAMAIL到1.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配置了一個自定義的trustStore爲WS-FEDERATION我Fediz代碼使用的是Spring的安全插件。所有這些工作正常。我的工作站和測試服務器上都部署了第二個應用程序,並使用它。它也可以正常工作,並可以通過FTPS將文件發送到另一臺服務器。另外,如果它在SystemProperties中提供了錯誤的密碼,那麼它爲什麼會在我的工作站上工作,而不是在服務器上工作?
如何判斷它是否指向不同的密鑰庫?我試着向Catalina.sh添加'JAVA_OPTS =「$ JAVA_OPTS -Djavax.net.ssl.trustStore = $ JAVA_HOME/lib/security/cacerts -Djavax.net.ssl.trustStorePassword = changeit」',但這並沒有幫助。 – Raystorm
請參閱[SSLNOTES.txt](https://javamail.java.net/docs/SSLNOTES.txt)中的調試部分。也許一些額外的JSSE調試輸出會有所幫助。您也可以嘗試從程序中打印出javax.net.ssl.trustStore屬性,以確保它按照您的預期設置。 –
我試着設置各種調試選項。 (我剛剛意識到我的Log4J設置可能會壓扁它)。但是,按照我的編輯中指定的方式打印javax.net.ssl。* store *屬性,這讓我意識到有些事情是設置密碼以訪問信任庫錯誤。所以我最終根據'MailSSLSocketFactory'連接了一個TrustManager。可能不是最好的方法,但有效。 – Raystorm