Tomcat 服务器上的有效证书出现 SSLHandshakeException

SSLHandshakeException with valid certificate on Tomcat server

我有一个 Apache 网络服务器面向 Tomcat 8 网络服务器,即 运行 我的网站,我正在将顶级域从 my.website.ie 切换到 my.website.com。我有一些代码运行以响应生成 PDF 的特定请求。该代码获取从同一网络服务器提供的图像(使用 URL),例如

Image.getInstance(new URL("https://my.website.com/img/myimage.png"))

除了域更改之外,我还将我的 SSL 证书提供商更改为 LetsEncrypt(免费 SSL 证书)。我在新 .com 域的开发网站是 运行 并且证书有效并且不会在几个月内过期。

我在一台单独的机器上有另一个开发服务器 运行,它仍在使用 .ie 域。这两个服务器上的 Tomcat 代码库 运行 现在是相同的。他们都试图在上面显示的特定代码段中的 URL 处获取图像。

.ie 服务器上,生成 PDF 的请求工作正常,获取图像没有任何问题。在 .com 服务器上,请求失败并出现此错误:

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
...
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
...
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

我对此错误的理解是目标 URL 的证书不受信任(例如自签名),但在这种情况下并非如此。此外,两台服务器都为图像点击相同的 URL,那么为什么一台服务器信任证书而另一台服务器不信任?

我没有在 .ie 服务器上做任何我在 .com 服务器上没有做的额外配置更改(关于设置新证书),所以有我没有考虑过的其他一些(错误)配置?

不信任表示所使用的 CA 不受软件信任。 Self-signed 证书永远不受信任。

Java 有自己的信任库(仅在 Linux 上使用系统信任库 AFAIR?)。如果 CA 证书比使用的 Java 版本更新,则 Java 可能不信任 CA。结论:更新您的 Java.

根据这个 Whosebug 答案,您至少需要 Java 8u101 才能支持 Let's Encrypt:

错误表明该链没有指向受信任的根证书。受信任的 CA 根证书存储在 Java 的根密钥库中,其中显然缺少 Let's Encrypt 颁发的根证书。

您可以手动将根证书添加到商店或检查 Java 的较新版本是否已包含该证书。