web-dev-qa-db-fra.com

comment vérifier la date d'expiration du certificat SSL par programme dans Java

J'ai besoin d'extraire la date d'expiration du certificat SSL sur le site Web en Java, devrait prendre en charge à la fois les certificats de confiance et auto-signés, tels que: 1. approuvé 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 sorti la date, mais il est difficile d'analyser.

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

31
Simon Wang

Comment analyser la date d'expiration du certificat

Castez-le dans 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 le tableau Certificate[] Est, comme il est dit dans le Javadoc .

Comment savoir de quel certificat obtenir la date d'expiration?

Lisez le Javadoc . "Le propre certificat du pair suivi par les autorités de certification".

Mais je ne sais pas pourquoi tu fais ça. Java devrait déjà tout faire pour vous.

Et jetez cette implémentation de TrustManager non sécurisée et incorrecte. La bonne façon de gérer les certificats auto-signés consiste à les importer dans le magasin de clés de confiance du client. Veuillez également jeter votre HostnameVerifier non sécurisé et utiliser celui par défaut ou sécurisé. Pourquoi utiliser HTTPS si vous ne voulez pas qu'il soit sécurisé?

24
user207421

À la manière de Kotlin, cela devrait ressembler à ceci:

fun certInformation(aURL: String) {
    val destinationURL = URL(aURL)
    val conn = destinationURL.openConnection() as HttpsURLConnection
    conn.connect()
    val certs = conn.serverCertificates
    for (cert in certs) {
        println("Certificate is: $cert")
        if (cert is X509Certificate) {
            println(cert.issuerDN.name)
            println(cert.notAfter)
            println(cert.notBefore)
        }
    }
}
0
Munish Chandel