2012-10-19 4 views
19

Ich brauche zu extrahieren Ablaufdatum von SSL-Zertifikat auf der Webseite in Java überprüfen soll, beide unterstützen vertraut und selbst signiertes Zertifikat, wie zum Beispiel: 1.trusted https://github.com 2 .self signierte https://mms.nw.ru/wie SSL-Zertifikat Ablaufdatum programmatisch in Java

ich bereits einige Code kopieren, wie:

import java.net.URL; 
import java.security.SecureRandom; 
import java.security.cert.Certificate; 
import java.security.cert.CertificateException; 
import java.security.cert.X509Certificate; 
import javax.net.ssl.HostnameVerifier; 
import javax.net.ssl.HttpsURLConnection; 
import javax.net.ssl.KeyManager; 
import javax.net.ssl.SSLContext; 
import javax.net.ssl.SSLSession; 
import javax.net.ssl.TrustManager; 
import javax.net.ssl.X509TrustManager; 

public class SSLTest { 

    public static void main(String [] args) throws Exception { 
     // configure the SSLContext with a TrustManager 
     SSLContext ctx = SSLContext.getInstance("TLS"); 
     ctx.init(new KeyManager[0], new TrustManager[] {new DefaultTrustManager()}, new SecureRandom()); 
     SSLContext.setDefault(ctx); 

     URL url = new URL("https://github.com");//https://mms.nw.ru 
     HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); 
     conn.setHostnameVerifier(new HostnameVerifier() { 
      @Override 
      public boolean verify(String arg0, SSLSession arg1) { 
       return true; 
      } 
     }); 
     System.out.println(conn.getResponseCode()); 
     Certificate[] certs = conn.getServerCertificates(); 
     for (Certificate cert :certs){ 
      System.out.println(cert.getType()); 
      System.out.println(cert); 
     } 

     conn.disconnect(); 
    } 

    private static class DefaultTrustManager implements X509TrustManager { 

     @Override 
     public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {} 

     @Override 
     public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {} 

     @Override 
     public X509Certificate[] getAcceptedIssuers() { 
      return null; 
     } 
    } 
} 

Die Fragen sind:

  1. Wie das Ablaufdatum aus dem Zertifikat zu analysieren, in meinem Code die toString() gab das Datum aus, aber es ist schwer zu analysieren.

  2. Wie kann ich die Zertifikatskette ermitteln, z. B. das GitHub-Zertifikat mit Ketten 3, woher weiß ich, von welchem ​​Zertifikat das Ablaufdatum stammt?

+0

Google ist hier auch Regie obwohl ich für .NET zu fragen, also werde ich nur hinzufügen [diesen Link] (http://forums.asp.net/post/4630222.aspx) zu einem C# Antworten. –

Antwort

17

Wie das Ablaufdatum aus dem Zertifikat

Guss es zu einem X509Certificate und rufen getNotAfter() zu analysieren.

Wie die Zertifikatskette, zum Beispiel des GitHub-Zertifikat mit Ketten

Sie es haben bestimmen. Das ist das Certificate[] Array, wie es in der Javadoc heißt.

Woher weiß ich, von welchem ​​Zertifikat das Ablaufdatum stammt?

Lesen Sie die Javadoc. "Dem Peer-eigenen Zertifikat folgten zuerst alle Zertifizierungsstellen".

Allerdings weiß ich nicht, warum Sie irgendetwas davon tun. Java sollte schon alles für Sie tun.

Und bitte werfen Sie diese unsichere und falsche TrustManager-Implementierung weg. Die richtige Methode zum Behandeln von selbstsignierten Zertifikaten besteht darin, sie in den Truststore des Clients zu importieren. Bitte wirf auch deinen unsicheren HostnameVerifier weg und verwende den Standardnamen oder einen sicheren. Warum sollten Sie überhaupt HTTPS verwenden, wenn Sie nicht sicher sein wollen?

+1

Meine Anwendung ist ein Überwachungstool mit einer Funktion zur Überwachung des SSL-Ablaufdatums, damit der Kunde benachrichtigt werden kann, wenn er bald abläuft. Also ist es mir egal, ob das HTTPS sucure ist, ich sorge mich nur, wenn es abläuft. Was meinst du mit "Java sollte schon alles für dich tun."? –

+0

@Grace Ich meinte, wenn das Zertifikat abgelaufen ist, wird eine 'SSLHandshakeException' ausgelöst.Es ist kaum zu glauben, dass ein einfacher Kalendereintrag den Zweck nicht erfüllen würde, ohne überhaupt Java-Code zu schreiben. – EJP

+0

danke für Ihre schnelle Antwort. Es ist in Ordnung für mich, von Certificate auf X509Certificate zu übertragen. Wie auch immer, unsere Programme zielen darauf ab, das Ablaufdatum eines Zertifikats automatisch zu überwachen und werden den Admin benachrichtigen, wenn es bald abläuft. Unsere Anwendung ist ein Überwachungssystem, genau wie Nagios usw. Das ist es. Du hast sehr geholfen :) –

0

Stellen Sie sicher, dass Sie Anfangs-/Endzeilen an das PEM-Format anhängen, sonst versteht java es nicht.

public class CertTest { 

    public static final String cert = "-----BEGIN CERTIFICATE-----\n<CERT_DATA>\n-----END CERTIFICATE-----"; 

    public static void main(String[] args){ 
     try { 
      X509Certificate myCert = (X509Certificate)CertificateFactory 
        .getInstance("X509") 
        .generateCertificate(
             // string encoded with default charset 
        new ByteArrayInputStream(cert.getBytes()) 
        ); 
      System.out.println(myCert.getNotAfter()); 

     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
} 
Verwandte Themen