使Java允许过期证书。

7

是否有任何命令行标志可以启用Java以允许过期证书?

目前,由于证书已过期,我会收到以下异常。

Caused by: java.security.cert.CertificateExpiredException: NotAfter: {PAST DATETIME}
at sun.security.x509.CertificateValidity.valid(CertificateValidity.java:274)
at sun.security.x509.X509CertImpl.checkValidity(X509CertImpl.java:629)
at sun.security.x509.X509CertImpl.checkValidity(X509CertImpl.java:602)
at org.apache.ws.security.validate.SignatureTrustValidator.validateCertificates(SignatureTrustValidator.java:103)

我尝试了以下命令行标志,但它不会忽略证书过期检查。
-Dcom.sun.net.ssl.checkRevocation=false

我们的应用程序在Tomcat下运行,路径为/myapplication。因此,我创建了另一个应用程序/ignorecertificate并部署在同一Tomcat的webapp文件夹中。根据这个问题的接受答案,我在/ignoreexpired应用程序的启动时运行以下代码。

// Create a trust manager that does not validate certificate chains
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) {
        }
    }
};

// Install the all-trusting trust manager
try {
    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new java.security.SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {
    e.printStackTrace();
}

由于两个应用程序都部署在同一个Tomcat中,我希望/myapplication忽略证书过期检查/异常(因为两个应用程序共享相同的Java实例)。但是它仍然不能正常工作。 我在另一个应用程序(/ignoreexpired)中运行此忽略代码,因为我不想对我的当前应用程序(/myapplication)进行任何更改。


程序员,你应该接受他的答案,这是一个相当不错和信息丰富的答案!我知道你可能只是忘记了考虑到你的声誉,哈哈。 - JGlass
1个回答

8
-Dcom.sun.net.ssl.checkRevocation=false

这个选项(加上一些额外的配置)允许在线检查证书颁发机构对证书的吊销状态。但这不是你要找的。

由于两个应用程序都部署在同一个Tomcat中,我希望/myapplication忽略证书过期检查/异常

应用程序在不同的JVM上下文中运行。在/ignoreexpired应用程序的TrustManager中进行更改将不会影响另一个应用程序。

您可以在JVM使用的信任存储中包含已过期的证书。我认为TrustoreManager不会明确地检查信任存储中明确包含的证书的有效期。使用keytool或GUI KeyStore explorer 创建一个JKS,插入证书(最终证书,而不是根证书),并通过全局在Tomcat中使用它。

-Djavax.net.ssl.trustStore=/path/to/truststore
-Djavax.net.ssl.trustStorePassword=truststorepassword

您还可以更新位于 jre/lib/security/cacerts 的默认JVM信任库。


2
哇,我完全不知道这个,我的经理/Java编码老板也不知道,但你是完全正确的。使用JDK8和-Djavax.net.debug=all进行测试,我可以看到过期证书被发现并且也被信任!谢谢! - JGlass
1
@JGlass,感谢您提供“-Djavax.net.debug=all”的部分。在这个新冠疫情期间,能够看到所有握手过程真是太好了 ;) - Ramsharan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接