gpt4 book ai didi

java - 如何更正 Java SSL REST 客户端中的 ValidatorException

转载 作者:太空宇宙 更新时间:2023-11-03 15:02:23 25 4
gpt4 key购买 nike

我有一个用 Java 编写的 RESTful 客户端,用于使用 SSL 的 Web 服务。该应用程序已经运行了几个星期。突然之间,所有与 Web 服务进行交易的尝试都会导致以下异常:

sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
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
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1699)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:241)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:235)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1206)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:136)
at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:593)
at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:529)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:893)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1138)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1165)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1149)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:434)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1172)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:234)
at com.MSCA.ESP.WebApp.ABSManager.getFacilityMetrics(ABSManager.java:1000)
....

我发现的关于类似困难的信息,例如 this one ,似乎表明我需要在我的客户端环境中使用由 Web 服务提供/为 Web 服务提供的证书做一些事情。但是,我仍然能够在 Firefox 中使用 RESTclient 执行在我的 Java 客户端中失败的相同事务,据我所知,我从未向 RESTclient 提供与该服务相关的任何类型的证书。

这个应用程序的背景故事是 Web 服务最初是基于 SOAP 协议(protocol)的,最近改用了 REST,这增加了另一个层次的复杂性和困惑,至少从我的角度来看,虽然这可能是一个线索告诉别人我的问题可能是什么。最重要的是,几年前我第一次开发应用程序时,我唯一记得的关于处理 SSL 的事情是我必须向其中添加以下代码:

static
{
Security.addProvider( new com.sun.net.ssl.internal.ssl.Provider() );
System.setProperty( "java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol" );
System.setProperty( "javax.net.ssl.trustStore", "./Resources/client.keystore" );
}

client.keystore 文件最初是随 SOAP 接口(interface)的示例客户端代码一起提供的。一旦服务切换到 REST,我就保留了这段代码和 client.keystore 文件,因为它似乎没有引起问题,即使 client.keystore 似乎没有提供给严格编写 RESTful 客户端的开发人员对于新服务。我今天向 Web 服务提供商提交了支持请求,询问是否可能需要更新 client.keystore。我的困难似乎并没有引起他们的注意,所以我想我可能找错了地方。

我不知道我在这里提供的信息是否足够让任何人给我一个完整的答案,但在这一点上,我很乐意只追求一个特定的 vector 。到目前为止,我似乎在兜圈子。最后,我不知道这是否重要,但我的应用程序在 Windows Server 2003 标准版上的 Glassfish 3.1.1 下运行。

最佳答案

参加网络安全虚拟速成类(class)后,我终于推测我的应用程序环境中的根证书需要更新。我找到了一个名为 InstallCert.java 的实用程序这将确定特定主机所需的根证书并将它们写入文件。我用它创建了这样一个文件,也称为 truststore,并将其重命名为“cacerts.jks”,这是 Glassfish (3.1.1) 为信任库使用的文件名。我将它复制到 Glassfish 环境中的两个 cacerts.jks 副本上(位于 /glassfish3/glassfish/lib/templates/glassfish3/glassfish/domains/domain1/config ), 重新启动 Glassfish 实例,一切正常。

帮助我解决这个问题的几个博客条目是 Updating the root certificates for Javaunable to find valid certification path to requested target .从我的角度来看,仍有几个谜团/问题:

  1. InstallCert.java 生成的信任库似乎包含许多根证书,这些根证书被我需要更新根证书的主机使用。这些是从哪里来的?它们是我当前安装的 Java 中已经找到的证书吗?如果是这样,它们在 InstallCert.java 代码的哪个位置写入输出文件?

  2. 如何预见和/或避免这一问题?由于根证书似乎主要通过开发工具和应用程序服务器进行分发,并且在大多数情况下是看不见和想不到的,有没有什么方法可以通知您的应用程序所依赖的证书即将过时?还是希望我们定期更新生产环境中使用的开发工具和应用服务器,使其不太可能被这种情况刺痛?

关于java - 如何更正 Java SSL REST 客户端中的 ValidatorException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19720644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com