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 的较新版本是否已包含该证书。
我有一个 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 的较新版本是否已包含该证书。