![](/img/trans.png)
[英]javax.mail.MessagingException: Can't send command to SMTP host
[英]javax.mail.MessagingException: Can't send command to SMTP host;
我已将证书导入到cacerts(JAVA_HOME指向的位置),但仍然收到此错误。 无法找出问题。 客户端的邮件服务器(Microsoft ESMTP服务器)没有防火墙问题。 我可以通过服务器远程登录。 尝试过SSLpoke,但它已超时。 尝试了25端口的tcpdump,可以看到来回通信。 基本上是尝试触发来自邮件服务器的出站电子邮件。
详细的错误日志为:
原因:javax.mail.MessagingException:无法将命令发送到SMTP主机。 嵌套的异常是:javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法在com.sun.mail上找到请求的目标的有效证书路径。 com.sun.mail.smtp.SMTPTransport.sendCommand(SMTPTransport.java:1408)(位于com.sun.mail.smtp.SMTPTransport.ehlo(SMTPTransport.java:847)处的.smtp.SMTPTransport.sendCommand(SMTPTransport.java:1420) )的com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:384)的javax.mail.Service.connect(Service.java:297)的javax.mail.Service.connect(Service.java:156)的在com.issuetracker的javax.mail.Transport.send0(Transport.java:168)的javax.mail.Service.connect(Service.java:105)处。 esb.mail.GmailImpl.transportMessage(GmailImpl.java:94)位于com.issuetracker.esb.mail.Mail.sendSRMail(Mail.java:188)
使用keytool导入证书时是否使用-trustcacerts参数?
编辑:我在这个话题上的谈话已经涵盖了发生错误的具体原因,但没有出现“答案”的外观,因此这里是一个重写。
PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到到请求目标的有效认证路径
此错误表明,无法从正在运行的JRE使用的驻留密钥库文件中获得用于信任传入证书的有效证书链(默认情况下,在JRE的jre / lib / security / cacerts文件中)。
造成这种情况的典型原因包括:
使用keytool命令导入证书时,忽略包含-trustcacerts参数。
当JRE寻找它知道要与传入证书匹配的证书时,它将仅考虑以这种方式标记为受信任的证书。
该证书已由根CA签署,该根CA尚未为其安装JRE的根证书。
通常,这是由证书由未知的根证书颁发机构(CA)签名引起的,例如JRE尚不了解的公司自己的内部CA,甚至是由一些不太受欢迎的第三方根CA引起的。与其他一些知名厂商一样,因此尽管浏览器或OS可能已经具有根证书,但Java可能并未附带它。
要解决此问题,您还需要获取并安装根CA证书,并将其也标记为受信任。
也有提供证书签名的公司充当中介,这意味着它们本身没有自己的根CA,但是受信任的根CA授予了证书,以允许它们进一步签署证书签名请求(CSR) 。
在这些情况下,尽管您可能已经拥有自己的证书以及已经安装并受信任的基础根CA,但是除非您还获取并安装了中间证书,否则“证书链”将断开并且无法建立有效的证书路径。
因此,概括地说,可能的解决方案包括:
注意:通过双击Windows中的.crt文件,可以为您提供检查证书路径的机会,并查看是否涉及了哪些根CA和中间CA来帮助您显示所需的内容。
一旦安装了完整且有效的证书链并将其信任到密钥库文件中,该错误就会通过。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.