启用Java以允许过期的证书

The*_*der 5 java ssl keystore ssl-certificate

是否有任何命令行标志使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)
Run Code Online (Sandbox Code Playgroud)

我尝试了以下命令行标志,它不会忽略证书过期检查

-Dcom.sun.net.ssl.checkRevocation=false
Run Code Online (Sandbox Code Playgroud)

我们的应用程序在路径下的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();
}
Run Code Online (Sandbox Code Playgroud)

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

ped*_*ofb 6

-Dcom.sun.net.ssl.checkRevocation=false
Run Code Online (Sandbox Code Playgroud)

此选项(带有一些额外的配置)允许在证书的撤销状态下在线检查证书颁发者.不是你想要的.

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

应用程序在不同的JVM上下文中运行 在变化TrustManager/ignoreexpired应用程序不会影响另外一个.

您可以在JVM使用的信任库中包含过期的证书.我认为TrustoreManager不会检查明确包含在信任库中的证书的到期日期.使用keytool或GUI KeyStore资源管理器创建JKS ,插入证书(最终证书,而不是根证书)并在tomcat中全局使用它

-Djavax.net.ssl.trustStore=/path/to/truststore
-Djavax.net.ssl.trustStorePassword=truststorepassword
Run Code Online (Sandbox Code Playgroud)

您还可以在以下位置更新默认JVM信任库 jre/lib/security/cacerts

  • 伙计,我完全不知道这一点,我的经理/Java 编码老板也不知道,但你是完全正确的。使用 JDK8 和“-Djavax.net.debug=all”进行测试,我可以看到过期的证书已找到并且也受信任!谢谢! (2认同)