从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服务器运行它抛出此异常。代码从六个月开始工作,但突然开始抛出这个例外。
似乎有些证书已过期。
我的应用程序(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");
似乎有些证书已过期。
正确。服务器证书已过期。如果你不能自己完成,请重新申请,或向他们投诉。
否则尚未进入有效期。
谢谢@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
这给你的证书为可读文本中的所有信息进行解码。
试试看和理解这个http://stackoverflow.com/questions/9619030/resolving-javax-net-ssl-sslhandshakeexception-sun-security-validator-validatore/12524960#12524960 – NDeveloper