从Java发送电子邮件时出错(SSL HandShake异常)

时间:2014-04-01 05:32:43

标签: java email jboss sslhandshakeexception

我从Java发送邮件时遇到异常。

31/03 14:06:19:571 INFO [ ] IBSUtils sendMailfromsmtp() MessagingException in Sending Mail :javax.mail.MessagingException: Can't send command to SMTP host;
nested exception is:
    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: timestamp check failed

它在独立的Java程序中发送邮件,但是从JBoss服务器运行时抛出了这个异常。代码已经工作了六个月,但突然开始抛出这个例外。

似乎某些证书已过期。

3 个答案:

答案 0 :(得分:1)

当我的应用程序(IBM Java 1.6)处理与webserver(Oracle Java 1.6)的连接时,我遇到了这种错误。协商SSH协议时可能会出现握手异常。

您最好手动设置Java协议。

// Using IBM jre there will be a handshake failure as IBM java 1.6 will
// negotiate to server SSLv3 protocol while it SHOULD be TLSv1
    System.setProperty("https.protocols", "TLSv1");

答案 1 :(得分:0)

  

似乎某些证书已过期。

正确。服务器证书已过期。重新获得它,或者如果你自己无法完成它,就向他们抱怨。

否则它尚未进入有效期。

答案 2 :(得分:0)

回答有关如何获取有关可能已过期证书的信息的请求:

  • 找出您的邮件发送到哪台服务器。配置的位置取决于您发送邮件的实用程序类,JEE样式是从jboss中配置的邮件会话中获取它。

  • 假设您将邮件发送到端口25上的某个主机,您可以使用openssl s_client执行TLS握手来获取证书:

openssl s_client -starttls smtp -crlf -connect somehost:25

这为您提供证书本身(“----- BEGIN CERTIFICATE -----”和“----- END CERTIFICATE -----”分隔符和一些基本信息之间的base64编码部分) abobout it。将包含分隔线的证书存储在一个文件中,比如cert.pem

然后您可以使用

对其进行解码
openssl x509 -text -noout <cert.pem

这会将证书中的所有信息作为可读文本提供。