【问题标题】:Java: method cannot find cert path -- what do I need to set?Java:方法找不到证书路径——我需要设置什么?
【发布时间】:2013-06-26 16:09:45
【问题描述】:

我在尝试连接到服务器的 SMTP 邮件服务器的服务器上有一个 java 方法,但我收到了这个错误:

stack trace: org.apache.commons.mail.EmailException: Sending the email
to the following server failed : mail.mycompanyname.com:465

检索完整的堆栈跟踪后,我注意到以下行,它重复了 3 次/尝试:

 nested exception is:
 javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: 
 PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: 
 unable to find valid certification path to requested target

服务器在 Apache 服务器上安装了证书。但是,我使用 GlassFish 作为访问 java 方法的 Web 应用程序(在客户端)的应用程序服务器,而 GlassFish 位于 Apache Server 之后。我没有针对此证书在 GlassFish 上进行任何调整。

我看到了一些其他类似的问题和答案,例如这里,但我不明白如何实现它:

PKIX path building failed: unable to find valid certification path to requested target

另外,还有这个,但我不知道如何在我的情况下使用它,如果合适的话:

Unable to find valid certification path to requested target - error even after cert imported

所以我的问题是,从 Java 的角度来看,我需要做什么才能清除此错误?

我是否只需要创建一个属性文件,如下所示?:

Which is the default location for keystore/truststore of Java applications?

或者,我是否还需要设置 TrustStore?

我需要在 GlassFish 上设置什么吗?

希望有人可以帮助我了解这里的基础知识。提前感谢任何 cmets。

更新:

好的,终于在下面 Hiro2K 的出色帮助下搞定了。所缺少的只是将 Apache Webserver 的 SMTP 邮件服务器使用的证书导入 GlassFish。 Hiro2k 下面的命令运行良好,但我的麻烦是找到正确的证书。

使用WHM,我可以看到邮件服务器,在我的例子中是Exim,引用了host1.mycompany.com,所以我自然选择了自签名的认证名称host1.mycompany.com.crt。但是,此证书已过期,因此无法使用。我必须进入 Exim 的配置文件以找到其名为 exim.crt 的证书,并将该证书导入 GlassFish。然后它起作用了。

请注意,服务器上还有很多证书,包括 imap(例如 imapd.pem)和 pop3(pop3.pem)等。非常混乱。

【问题讨论】:

    标签: java ssl glassfish ssl-certificate keystore


    【解决方案1】:

    所以 SMTP SSL 使用端口 465,这意味着客户端为了连接到服务器,它必须信任服务器的证书。 Java 和 Glassfish 有一个默认的信任库,它适用于由任何大型证书颁发机构(Thawt、Verisign 等)签署的任何证书,并且由于它不能正常工作,这让我相信你的服务器正在使用 self签名 SSL 证书。

    这不是问题,并且得到了许多不想为这些证书付费的内部应用程序的完全支持。问题是 GlassFish 不知道该自签名证书,因此您必须将其导入默认 glassfish 信任库。您可以在 $GLASFISH_INSTALL_DIR$/domains/domain1/config/cacerts.jks 找到它

    要导入证书,您可以使用 java 自带的 keytool。

    keytool -importcert -v -noprompt -alias smtp.server.name -file 
    /path/to/smtp.server.der -keystore
    $GLASFISH_INSTALL_DIR$/domains/domain1/config/cacerts.jks -storepass changeit
    

    您唯一需要注意的是证书的格式。 Keytool 仅支持二进制 DER 格式,很多 linux 服务器使用称为 PEM 的 OpenSSL 文本格式。使用 OpenSSL 从一种转换到另一种很容易。

    openssl x509 -in input.crt -inform PEM –out output.der -outform DER
    

    【讨论】:

    • 您不必设置任何系统属性,GlassFish 已经拥有它们。您需要像我说的那样将证书导入 GlassFish 信任库。如果是这种情况,您也必须重复此过程。
    • 我创建了一个自签名证书,将格式从 .crt 更改为 .der,运行 keytool,它可以很好地导入证书。然而,我仍然抛出相同的 java 异常。我需要在某个地方更新 GlassFish 中的别名吗?我保留默认的changeit密码。 GlassFish 日志文件中没有出现错误。
    • 您无法创建自签名证书,您必须获取您尝试与之通信的证书。在这种情况下,SMTP 服务器的。
    • 没错,如果与该邮件服务器通信的软件正在 GlassFish 上运行,那么您需要将该自签名证书添加到 GlassFish 的信任库中。我猜你的公司没有为其电子邮件服务器购买 SSL 证书。
    • 对,没有为电子邮件服务器购买 SSL 证书。所以...我只需要重复我上面所做的一切来将证书导入 GlassFish 信任库,但是使用 mail.mycompany.com 的证书,对吗?我是否需要更新 GlassFish 管理控制台(配置 > 网络配置网络侦听器 > http-listener-2;SSL 选项卡)并将默认认​​证昵称从“s1as”更改为我在上面发出 keytool 命令时使用的别名?
    猜你喜欢
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 2021-11-11
    • 2015-07-16
    • 2011-04-25
    • 2017-02-24
    相关资源
    最近更新 更多