javamail通过tls在工作站上发送,但不在服务器上发送

时间:2013-10-24 18:41:41

标签: java ssl javamail keystore

我可以从我的工作站连接并发送自己的电子邮件

工作站版本:

  • Java - 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

服务器正在运行:

  • Java - 1.6.0_18-b-07
  • Tomcat - 6.0.28

Javamail与我的Web应用程序捆绑在一起,版本为 1.4.3

修改:

为了完整起见,我将捆绑的 Javamail 升级为 1.5.0-b01
我仍然遇到同样的错误。

带有默认java密钥库密码的

keytool -list -keystore <path-to-default-java-keystore>适用于两个系统。

进一步修改:

经过多次挖掘后,我发现了这个问题:Accessing Tomcat's configured KeyStore and TrustStore

我在应用程序中添加了一些日志记录语句: 我在Workstation上得到的结果与在服务器上的结果相同。

10-25@12:20:30 DEBUG [statements] TextEmail - javax.net.ssl.trustStore: null
10-25@12:20:30 DEBUG [statements] TextEmail - javax.net.ssl.trustStorePassword: fedizPass
10-25@12:20:30 DEBUG [statements] TextEmail - javax.net.ssl.trustStoreType: null
10-25@12:20:30 DEBUG [statements] TextEmail - javax.net.ssl.keyStore: null
10-25@12:20:30 DEBUG [statements] TextEmail - javax.net.ssl.keyStorePassword: fedizPass
10-25@12:20:30 DEBUG [statements] TextEmail - javax.net.ssl.keyStoreType: null

如果仔细查看,则不会返回默认密码,也不会返回信任存储。 我为 WS-FEDERATION配置了 Fediz-1.1.0-SNAPSHOT trustStore 我的Fediz代码正在使用 Spring-安全性插件。所有这一切都正常。我在WorkStation和Test Server上都部署了第二个应用程序,它也使用了它。它也可以正常工作,并可以通过FTPS将文件发送到另一台服务器。另外如果它在SystemProperties中提供了错误的密码,那为什么它在我的工作站上工作而不在服务器上呢?

2 个答案:

答案 0 :(得分:1)

感谢@Bill Shannon我能够让它发挥作用。

我最终扩展MailSSLSocketFactoryJavamail - SSLNotes中的示例中列出了System.getProperty("java.home") 我跟着JSSE Reference - Creating Your Own X509TrustManager了 我用它来添加一个Backup TrustManager,它从X509TrustManager获取默认的 KeyStore 并传入默认密码。如果MailSSLSocketFactory创建的默认验证无法验证证书,它会尝试将{{1}}设置为后备。

答案 1 :(得分:0)

您的Tomcat配置可能正在选择具有非默认密码的其他密钥库吗?