Comment vérifier la date D'expiration du certificat SSL par programme en Java

J'ai besoin d'extraire la date D'expiration du certificat SSL sur le site Web en Java, devrait supporter les deux certificat approuvé et auto-signé, tel que: 1.confiance https://github.com 2.auto-signé https://mms.nw.ru/

Je copie déjà du code comme:

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;
        }
    }
}

, Les questions sont:

  1. Comment analyser la date d'expiration du certificat, dans mon code le toString() a la date de sortie,mais il est difficile à analyser.

  2. Comment déterminer la chaîne de certificats, par exemple, le certificat github avec les chaînes 3, Comment ai-je su quel certificat pour obtenir la date d'expiration?

23
demandé sur Simon Wang 2012-10-19 07:36:50

2 réponses

Comment analyser la date d'expiration du certificat

Convertissez-le à un X509Certificate et appelez getNotAfter().

Comment déterminer la chaîne de certificats, par exemple, le certificat github avec des chaînes

Vous l'avez. C'est ce que l' Certificate[] tableau est, comme il est dit dans le Javadoc.

Comment ai-je su à quel certificat obtenir la date d'expiration?

Lire le Javadoc . "Le certificat du pair a d'abord suivi par toute autorité de certification".

Cependant, je ne sais pas pourquoi vous faites tout cela. Java devrait déjà tout faire pour vous.

Et jetez cette implémentation de TrustManager non sécurisée et incorrecte. La manière correcte de gérer les certificats auto-signés est de les importer dans le truststore client. Veuillez également jeter votre hostnameverifier non sécurisé, et utiliser celui par défaut, ou un sécurisé. Pourquoi utiliser HTTPS si vous ne voulez pas qu'il soit sécurisé?

20
répondu user207421 2012-10-19 03:45:58

Assurez-vous d'ajouter des lignes de début/fin au format PEM sinon java ne le comprend pas.

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

    }
}
-1
répondu Tapolo 2015-12-18 01:14:19