2016-07-01 33 views
4

Gibt es irgendwelche Befehlszeilen-Flag (s), um Java zu erlauben, abgelaufene Zertifikate zuzulassen?Java aktivieren, um abgelaufenes Zertifikat zuzulassen

Im Moment bekomme ich die folgende Ausnahme, da das Zertifikat abgelaufen ist.

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) 

Ich habe die folgende Befehlszeile-Flag versucht, die nicht Certificate Expiration Kontrolle unter Pfad

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

Unsere Anwendung läuft in tomcat /myapplication nicht ignorieren. Also habe ich eine andere Anwendung erstellt /ignorecertificate und im selben Tomcat-Webapp-Ordner bereitgestellt. Gemäß der akzeptierten Antwort in diesem question, führe ich den folgenden Code beim Start von /ignoreexpired Anwendung.

// 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(); 
} 

Da beide Anwendungen in gleichen tomcat eingesetzt wurden, erwartet I /myapplication Zertifikat Ablaufprüfung/Ausnahme zu ignorieren (Bcoz beide Anwendungen die gleiche Java-Instanz gemeinsam nutzen). Aber es funktioniert immer noch nicht. Ich führe diesen Ignoriercode in einer anderen Anwendung aus (/ignoreexpired). Ich möchte in meiner aktuellen Anwendung keine Änderungen vornehmen (/myapplication).

Antwort

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

Diese Option (mit einigen zusätzlichen config) ermöglicht es den Zertifikatsaussteller auf dem Sperrstatus des Zertifikats Online-Check. Nicht was du suchst.

Da beide Anwendungen in gleichen tomcat eingesetzt wurden, erwartete I/myapplication Zertifikat Ablaufkontrolle/Ausnahme

Anwendungen in verschiedenen JVM-Kontext ausführen zu ignorieren. Änderungen in TrustManager von /ignoreexpired Anwendung wird nicht die andere beeinflussen.

Sie können das abgelaufene Zertifikat in den von JVM verwendeten Truststore aufnehmen. Ich denke, die TrustoreManager wird Ablauf auf Zertifikaten nicht überprüfen, die ausdrücklich im Trust Store enthalten sind. Erstellen Sie eine JKS mit keytool oder GUI KeyStore explorer, legen Sie das Zertifikat (das endgültige Zertifikat, nicht die Wurzel) und verwenden Sie es global in tomcat durch

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

können Sie aktualisieren auch die Standard-JVM-Vertrauens bei jre/lib/security/cacerts