javax.mail.MessagingException:无法向SMTP主机发送命令;

时间:2016-07-23 06:27:22

标签: java mule

我已将证书导入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.smtp.SMTPTransport.sendCommand(SMTPTransport.java:1420)           在com.sun.mail.smtp.SMTPTransport.sendCommand(SMTPTransport.java:1408)           在com.sun.mail.smtp.SMTPTransport.ehlo(SMTPTransport.java:847)           at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:384)           在javax.mail.Service.connect(Service.java:297)           在javax.mail.Service.connect(Service.java:156)           在javax.mail.Service.connect(Service.java:105)           在javax.mail.Transport.send0(Transport.java:168)           在javax.mail.Transport.send(Transport.java:98)           在com.issuetracker.esb.mail.GmailImpl.transportMessage(GmailImpl.java:94)           在com.issuetracker.esb.mail.Mail.sendSRMail(Mail.java:188)

1 个答案:

答案 0 :(得分:0)

使用keytool导入证书时是否使用了-trustcacerts参数?

编辑:我在这个主题上的谈话已经涵盖了发生错误的具体原因,但没有出现“回答”,所以这里是重写。

  

PKIX路径构建失败:   sun.security.provider.certpath.SunCertPathBuilderException:无法   找到所请求目标的有效证书路径

此错误表示无法从正在运行的JRE使用的驻留密钥库文件中获取用于信任传入证书的有效证书链(默认情况下,在JRE' s jre / lib / security中/ cacerts文件)。

这种情况的典型原因包括:

使用keytool命令导入证书时,忽略包含参数-trustcacerts。

当JRE正在寻找与之相匹配的证书时,它只会考虑以这种方式标记为受信任的证书。

证书已由根CA签署,JRE尚未为其安装根证书。

通常,这是因为证书由未知的根证书颁发机构(CA)签名,例如公司自己的内部CA(JRE对此尚不了解),甚至是某些第三方root CA并不像其他一些大牌供应商那样受欢迎,因此虽然浏览器或操作系统可能已经拥有根证书,但Java可能没有附带它。

要解决此问题,您还需要获取并安装根CA证书并将其标记为可信任。

还有一些提供证书签名的公司充当中间人,这意味着他们自己没有自己的根CA,但是由受信任的根CA提供证书以允许他们进一步签署证书签署请求(CSR)。

在这些情况下,虽然您可能拥有自己的证书并且已经安装并信任了基础根CA,但除非您还获得并安装了中间证书,否则“证书链”会被证实。已损坏,无法建立有效的证书路径。

总结可能的解决方案包括:

  1. 使用-trustcacerts参数为其他站点执行所有证书安装。
  2. 检查密钥库文件中是否存在根CA证书,如果没有,请使用keytool -importcert -trustcacerts获取并安装它。
  3. 检查是否还有中间证书来完成整个链,如果是,请使用keytool -importcert -trustcacerts获取并安装到密钥库文件中。
  4. 注意:通过双击文件来检查Windows中的.crt文件,可以让您有机会检查证书路径,看看是否以及涉及哪些根和中间CA来帮助显示您需要的内容。

    一旦安装了完整有效的证书链并将其置于密钥库文件中,就应该传递错误。