从Java发送邮件时出错(SSLHandShake异常)

问题描述:

从Java发送邮件时出现以下异常。从Java发送邮件时出错(SSLHandShake异常)

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服务器运行它抛出此异常。代码从六个月开始工作,但突然开始抛出这个例外。

似乎有些证书已过期。

+0

试试看和理解这个http://*.com/questions/9619030/resolving-javax-net-ssl-sslhandshakeexception-sun-security-validator-validatore/12524960#12524960 – NDeveloper

我的应用程序(IBM Java 1.6)处理与Web服务器(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"); 
+0

谢谢你......它工作得很好......这个代码的任何可能的问题.. @alexer – hacker

+0

到目前为止的代码按预期工作 – Alexer

似乎有些证书已过期。

正确。服务器证书已过期。如果你不能自己完成,请重新申请,或向他们投诉。

否则尚未进入有效期。

+0

谢谢@ejp但关于服务器证书,你能给我一些关于这个证书的更多信息,我的意思是这个文件的位置和检查它的有效日期.. – hacker

在回答有关如何获取获取有关信息,可能你的要求过期的证书:

  • 找出哪些服务器邮件传递到。在这里配置取决于你发送邮件的工具类,JEE风格是从jboss中配置的邮件会话中获取它。

  • 假设您提供您的邮件,某端口25上可以使用openssl s_client执行TLS握手拿到证书:

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

这给你的证书本身(以base64将“----- BEGIN CERTIFICATE -----”和“----- END CERTIFICATE -----”分隔符之间的编码部分和一些基本信息放在一起,将包含分隔线的证书存储在文件,说cert.pem

然后,您可以使用

openssl x509 -text -noout <cert.pem 

这给你的证书为可读文本中的所有信息进行解码。

+0

感谢您的信息,但对于openssl,我是否需要在Windows中安装任何应用程序.exe .. – hacker

+0

是的,请参阅http://www.openssl.org/related/binaries.html – Drunix