【发布时间】: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