从 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握手问题

Cakephp 3 尝试使用 gmail 发送电子邮件时出错

为啥 SSL 握手会给出“无法生成 DH 密钥对”异常?

无聊的 SSL 握手失败和复制身份凭证时出错

在Android Nougat中使用自签名证书通过https连接时的SSL握手异常