javamail在工作站上通过tls发送,但不在服务器上
我可以从我的工作站连接并发送电子邮件 工作站版本:javamail在工作站上通过tls发送,但不在服务器上,java,ssl,jakarta-mail,keystore,Java,Ssl,Jakarta Mail,Keystore,我可以从我的工作站连接并发送电子邮件 工作站版本: Java-1.6.0\u 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: Err
- Java-1.6.0\u 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))
stacktrace的底部是以下部分
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
如果仔细查看,默认密码不会返回,信任存储也不会返回。
我为WS-FEDERATION配置了自定义信任库,我的Fediz代码使用的是Spring Security插件。所有这些都能正常工作。我在工作站和测试服务器上都部署了第二个应用程序,它也在使用它。它也可以正常工作,可以通过FTPS将文件发送到另一台服务器。如果它在SystemProperties中提供了错误的密码,那么,为什么它在我的工作站上工作,而在服务器上不工作呢?可能是您的Tomcat配置选择了一个具有非默认密码的不同密钥库?可能是您的Tomcat配置选择了具有非默认密码的不同密钥库?多亏了@Bill Shannon,我才能够让它工作 我最终扩展了
mailssocketfactory
,在我遵循了
我使用它添加了一个备份信任管理器,它从
System.getProperty(“java.home”)
获取默认密钥库,并传入默认密码。它试图将X509TrustManager
设置为备用,以防MailSSLSocketFactory
创建的默认证书无法验证证书。多亏@Bill Shannon,我才能够使其正常工作
我最终扩展了mailssocketfactory
,在我遵循了
我使用它添加了一个备份信任管理器,它从
System.getProperty(“java.home”)
获取默认密钥库,并传入默认密码。它试图将X509TrustManager
设置为备用,以防MailSSLSocketFactory
创建的默认密钥无法验证证书。如何判断它是否指向其他密钥库?我尝试将JAVA_OPTS=“$JAVA_OPTS-Djavax.net.ssl.trustStore=$JAVA_HOME/lib/security/cacerts-Djavax.net.ssl.trustStorePassword=changeit”
添加到Catalina.sh,但没有任何帮助。请参阅中的调试部分。也许一些额外的JSSE调试输出会有所帮助。您还可以尝试从程序中打印javax.net.ssl.trustStore属性,以确保它的设置符合预期。它们似乎都没有打印出来。(我刚刚意识到我的Log4J设置可能会将其压扁。)但是,打印javax.net.ssl.*store*属性(如编辑中指定的)帮助我意识到访问信任库的密码设置错误。因此,我最终基于mailssocketfactory
将TrustManager连接在一起。可能不是最好的方法,但很有效。我如何判断它是否指向不同的密钥库?我尝试将JAVA_OPTS=“$JAVA_OPTS-Djavax.net.ssl.trustStore=$JAVA_HOME/lib/security/cacerts-Djavax.net.ssl.trustStorePassword=changeit”
添加到Catalina.sh,但没有任何帮助。请参阅中的调试部分。也许一些额外的JSSE调试输出会有所帮助。您还可以尝试从程序中打印javax.net.ssl.trustStore属性,以确保它的设置符合预期。它们似乎都没有打印出来。(我刚刚意识到我的Log4J设置可能会将其压扁。)但是,打印javax.net.ssl.*store*属性(如编辑中指定的)帮助我意识到访问信任库的密码设置错误。因此,我最终基于mailssocketfactory
将TrustManager连接在一起。可能不是最好的方法,但很有效。
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