在调用 Web 服务时信任过期的自签名证书

2022-09-04 04:46:54

有一个受证书保护的 Web 服务。在调用它的客户端代码中,证书的 CA 必须存在于信任库中(JRE_path\lib\security\cacerts) - 如果不是,您将在客户端上获得 PKIX 异常。

如果证书已过期,会发生什么情况 - 客户端代码失败。

但是,可以通过将证书直接添加到信任库来绕过此问题 - 信任过期的证书

即,如果信任库中存在证书本身而不是 CA,则即使证书已过期,一切正常。

在我的场景中,Web服务证书是自签名的,因此无论如何我都必须将其添加到信任库,即使证书已过期,客户端仍会继续正常工作。

现在我的问题是,这在所有情况下都有效 - 我的程序只是一个运行本地JRE的命令行程序。

如果有一个应用程序调用Web服务,并且该应用程序正在Websphere,JBoss,WebLogic,Tomcat,Glassfish等上运行,并且自签名证书被添加到该环境的信任库中,我是否可以仍然假设它将继续工作(不给出过期的错误)?

我假设它会起作用 - 因为这些应用程序服务器也会像任何程序一样使用JRE - 或者我错过了什么?


答案 1

您可以通过以下代码绕过所有证书

try {
            TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
                public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                    return null;
                }

                public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {
                }

                public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {
                }
            } };
            SSLContext sc = SSLContext.getInstance("SSL");
            sc.init(null, trustAllCerts, new java.security.SecureRandom());

            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
            HostnameVerifier allHostsValid = new HostnameVerifier() {
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            };
            SSLContext.setDefault(sc);
            HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
            LOGGER.debug("All Certificates Have Been Trusted Successfully.");
        } catch (KeyManagementException ex) {
            LOGGER.error("Error:",ex);
        } catch (NoSuchAlgorithmException ex) {
            LOGGER.error("Error:",ex);
        } 

答案 2

回答您的问题:“如果我将自签名证书添加到信任存储区,该证书在过期后是否仍受信任 - 或者它会引发异常?

它仍然会被信任(至少在java的cacerts信任存储中)。查看 https://softwareengineering.stackexchange.com/a/308538


推荐