1

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

工作站版本:

  • Java - 1.6.0_21
  • 雄猫 - 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
  • 雄猫 - 6.0.28

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

编辑:

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

keytool -list -keystore <path-to-default-java-keystore>使用默认的 java 密钥库密码可以在两个系统上使用。

进一步编辑:

经过一番挖掘后,我发现了这个 SO Question: Accessing Tomcat's configured KeyStore and TrustStore

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

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配置了自定义trustStore的Fediz-1.1.0-SNAPSHOT我的 Fediz 代码正在使用Spring-Security插件。所有这些都正常工作。我在我的 WorkStation 和测试服务器上都部署了第二个应用程序,它也使用它。它也可以正常工作,并且可以通过 FTPS 将文件发送到另一台服务器。此外,如果它在 SystemProperties 中提供了错误的密码,那么为什么它在我的工作站上工作而不是在服务器上工作?

4

2 回答 2

1

感谢@Bill Shannon,我能够让它工作。

我最终扩展了,在Javamail - SSLNotesMailSSLSocketFactory中的示例中列出 我遵循JSSE 参考 - 创建您自己的 X509TrustManager 我用它来添加一个备份 TrustManager,它从默认KeyStore中获取并传递默认密码。如果由创建的默认证书无法验证证书,它会尝试将其设置为后备。

System.getProperty("java.home")X509TrustManagerMailSSLSocketFactory

于 2013-10-26T00:03:02.377 回答
0

可能您的 Tomcat 配置选择了具有非默认密码的不同密钥库?

于 2013-10-25T07:28:08.280 回答