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:
Cómo analizar la fecha de caducidad del certificado; en mi código, toString () produjo la fecha, pero es difícil de analizar.
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();
}
}
}