utiliza propietario permitida opcion listar introduzca formato ejemplo crear contraseña claves certificados almacén almacen java ssl https httpclient ssl-certificate

java - propietario - keytool listar certificados



cómo verificar la fecha de caducidad del certificado SSL programáticamente en Java (2)

Necesito extraer la fecha de vencimiento del certificado SSL en el sitio web en Java, debería admitir certificados de confianza y autofirmados, como por ejemplo: https://github.com https://github.com 2. https://mms.nw .ru /

Ya copio un código como:

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

Las preguntas son:

  1. Cómo analizar la fecha de caducidad del certificado; en mi código, toString () produjo la fecha, pero es difícil de analizar.

  2. Cómo determinar la cadena de certificados, por ejemplo, el certificado github con cadenas 3, ¿cómo sé de qué certificado obtener la fecha de vencimiento?


Cómo analizar la fecha de vencimiento del certificado

X509Certificate un X509Certificate y llama a getNotAfter() .

Cómo determinar la cadena de certificados, por ejemplo, el certificado github con cadenas

Tu lo tienes. Eso es lo que es la matriz Certificate[] , como dice en el Javadoc .

¿Cómo sé de qué certificado obtener la fecha de vencimiento?

Lee el Javadoc . "El propio certificado del homólogo primero fue seguido por las autoridades de certificación".

Sin embargo, no sé por qué estás haciendo algo de esto. Java ya debería hacerlo todo por ti.

Y desecha esa implementación insegura e incorrecta de TrustManager. La forma correcta de manejar certificados autofirmados es importarlos al almacén de confianza del cliente. También deseche su inseguro HostnameVerifier, y use el predeterminado, o uno seguro. ¿Por qué usar HTTPS en absoluto si no desea que sea seguro?


Asegúrese de anexar las líneas Begin / End al formato PEM, de lo contrario java no lo entenderá.

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