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:
Comment analyser la date d'expiration du certificat, dans mon code le toString() a la date de sortie,mais il est difficile à analyser.
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?
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é?
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();
}
}
}