【问题标题】:SSLHandshakeException with valid certificate on Tomcat serverSSLHandshakeException 与 Tomcat 服务器上的有效证书
【发布时间】:2018-07-27 18:44:44
【问题描述】:

我有一个 Apache Web 服务器,前面有一个运行我的网站的 Tomcat 8 Web 服务器,我正在将顶级域从 my.website.ie 切换到 my.website.com。我有一些代码可以响应生成 PDF 的特定请求而运行。该代码获取从同一 Web 服务器提供的图像(使用 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 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径
...
原因:sun.security.validator.ValidatorException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径
...
原因:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径

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

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

【问题讨论】:

    标签: java ssl ssl-certificate tomcat8 sslhandshakeexception


    【解决方案1】:

    不信任意味着使用的 CA 不受软件信任。 自签名证书永远不受信任。

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

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

    Does Java support Let's Encrypt certificates?

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 编辑系统密钥库恕我直言是个坏主意。正确的方法是创建一个自定义信任库,其中包含所需的所有根 CA 证书,并将其用作应用程序中的信任库。
      猜你喜欢
      • 2017-05-19
      • 1970-01-01
      • 2020-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-01
      相关资源
      最近更新 更多