12

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

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

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

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

在我的场景中,webservice 证书是一个自签名证书,所以无论如何我都必须将它添加到信任库中,即使证书过期,客户端也能继续正常工作。

现在我的问题是这是否适用于所有场景 - 我的程序只是一个运行本地 JRE 的命令行程序。

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

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

4

2 回答 2

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);
        } 
于 2015-07-10T16:39:00.180 回答
1

回答您的问题:“如果我将自签名证书添加到信任库,证书过期后是否仍受信任 - 还是会引发异常?”

它仍然是受信任的(至少在 java 的 cacerts 信任存储中)。请参阅https://softwareengineering.stackexchange.com/a/308538

于 2018-06-07T23:28:29.950 回答