Java:方法找不到证书路径——我需要设置什么?

标签 java ssl glassfish ssl-certificate keystore

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

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 上进行任何设置吗?

希望有人可以帮助我了解基础知识。预先感谢您的任何评论。

更新:

好的,在下面 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)等证书。非常困惑。

最佳答案

因此 SMTP SSL 使用端口 465,这意味着客户端为了连接到服务器,必须信任服务器的证书。 Java 和 Glassfish 有一个默认的信任库,适用于任何大型证书颁发机构(Thawt、Verisign 等)签署的任何证书,并且由于它无法按原样工作,这让我相信您的服务器正在使用自己的证书签名的 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

关于Java:方法找不到证书路径——我需要设置什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17325209/

相关文章:

android - 如何以编程方式获取服务器证书并添加到 truestore,并检查证书

java - 如何配置 spring boot 应用程序以在 MySQL 上使用 SSL/TLS?

java - MySQL 排序规则和 Glassfish 默认字符集编码

java - arrayList 是空的 Firebase 数据库

java - SQLException : Incorrect syntax near 'bit'

ssl - Typo3 多域与 ssl : TOO_MANY_REDIRECTS

maven - 如何将 Maven Web 应用程序部署到本地安装的 Glassfish?

java - 计算差异。两次之间,因为我们有两个不同的时间和日期字符串

Java - 字节的模加法

glassfish - 使用 Glassfish 应用服务器设置上下文根