从 Java 发送电子邮件时出错(SSL 握手异常)
Posted
技术标签:
【中文标题】从 Java 发送电子邮件时出错(SSL 握手异常)【英文标题】:error while mailing from Java (SSLHandShake Exception) 【发布时间】:2014-05-11 17:40:20 【问题描述】:从 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 服务器运行时会抛出此异常。代码已经运行了六个月,但突然开始抛出这个异常。
似乎某些证书已过期。
【问题讨论】:
尝试看到并理解这个***.com/questions/9619030/… 【参考方案1】:回答您关于如何获取有关可能已过期证书的信息的请求:
找出您的邮件发送到哪个服务器。这取决于你发送邮件的实用程序类,JEE 风格是从 jboss 中配置的邮件会话中获取它。
假设您将邮件发送到端口 25 上的某个主机,您可以使用 openssl s_client
执行 TLS 握手以获取证书:
openssl s_client -starttls smtp -crlf -connect somehost:25
这将为您提供证书本身(“-----BEGIN CERTIFICATE-----”和“-----END CERTIFICATE-----”分隔符之间的base64编码部分和一些基本信息关于它。将包含分隔线的证书存储在一个文件中,例如cert.pem
。
然后你可以使用解码它
openssl x509 -text -noout <cert.pem
这会将证书中的所有信息作为可读文本提供给您。
【讨论】:
感谢您的信息,但对于 openssl,我是否需要在 windows 中安装任何应用程序 .exe。【参考方案2】:当我的应用程序(IBM Java 1.6)处理与网络服务器(Oracle Java 1.6)的连接时,我曾经遇到过这种错误。协商 SSH 协议时可能会出现 Handshake 异常。
您最好手动设置您的 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");
【讨论】:
谢谢伙计...效果很好...此代码可能存在的任何问题..@alexer【参考方案3】:似乎某些证书已过期。
正确。服务器证书已过期。更新它,或者如果您自己无法完成,请向他们投诉。
否则还没有进入有效期。
【讨论】:
谢谢@ejp,但是关于服务器证书,你能给我一些关于这个证书的更多信息吗?我的意思是这个文件的位置和检查它的到期日期..以上是关于从 Java 发送电子邮件时出错(SSL 握手异常)的主要内容,如果未能解决你的问题,请参考以下文章
Gottox socket.io-java-client“握手时出错”空指针异常
GRPC Java客户端和NodeJS服务器之间的ssl握手问题