【问题标题】:Enable Java to permit expired certificate启用 Java 以允许过期证书
【发布时间】:2016-11-03 17:55:22
【问题描述】:

是否有任何命令行标志可以让 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

我们的应用程序在路径/myapplication 下的tomcat 中运行。所以我创建了另一个应用程序/ignorecertificate 并部署在同一个Tomcat 的webapp 文件夹中。根据question 中接受的答案,我在/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 忽略证书过期检查/异常(Bcoz 两个应用程序共享同一个 java 实例)。但它仍然无法正常工作。我在另一个应用程序(/ignoreexpired)中运行此忽略代码,因为我不想在当前应用程序中进行任何更改(/myapplication)。

【问题讨论】:

  • 编码员,你应该接受他的回答,这是一个非常好的和翔实的回答!我知道你可能只是忘了考虑你的名声,哈哈。

标签: java ssl ssl-certificate keystore


【解决方案1】:
-Dcom.sun.net.ssl.checkRevocation=false

此选项(带有一些附加配置)允许在线检查证书颁发者对证书的吊销状态。不是你要找的。​​p>

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

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

您可以将过期的证书包含在 JVM 使用的信任库中。我认为TrustoreManager 不会检查信任库中明确包含的证书的过期时间。使用keytool或GUIKeyStore explorer创建一个JKS,插入证书(最终证书,不是root)并通过在tomcat中全局使用

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

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

【讨论】:

  • 伙计,我完全不知道这一点,我的经理/Java 编码老板也不知道,但你是完全正确的。使用-Djavax.net.debug=all 使用JDK8 进行测试,我可以看到已找到过期证书并且也受信任!谢谢!
  • @JGlass 感谢您提供“-Djavax.net.debug=all”部分。很高兴在这些电晕期间看到所有的握手;)
猜你喜欢
  • 2016-05-31
  • 2011-08-03
  • 2023-03-24
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 2023-02-25
  • 2020-05-22
  • 2012-10-13
相关资源
最近更新 更多