Как программно проверить срок действия сертификата SSL в Java
Мне нужно извлечь дату истечения срока действия сертификата SSL на веб-сайт в Java, чтобы поддерживать оба
доверенный и самозаверяющий сертификат, например:
1.trusted
https://github.com
2.Self подписал
https://mms.nw.ru/
Я уже скопировал код как:
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;
}
}
}
Вопросы:
-
Как анализировать дату истечения срока действия сертификата, в моем коде команда toString() выводила дату, но ее трудно разобрать.
-
Как определить цепочку сертификатов, например сертификат github с цепочками 3, как я узнал, какой сертификат для получения даты истечения срока действия?
Ответы
Ответ 1
Как анализировать дату истечения срока действия сертификата из
Передайте его X509Certificate
и вызовите getNotAfter()
.
Как определить цепочку сертификатов, например, сертификат github с цепочками
У тебя это есть. Это массив Certificate[]
, как он говорит в Javadoc.
Как узнать, какой сертификат вы хотите получить?
Прочтите Javadoc. "Сначала сертификат для сверстников, за которым следуют любые органы сертификации".
Однако я не знаю, почему вы это делаете. Java уже должен сделать все для вас.
И, пожалуйста, выбросьте эту небезопасную и неправильную реализацию TrustManager. Правильный способ обработки самозаверяющих сертификатов - импортировать их в клиентскую сеть. Также удалите свой незащищенный HostnameVerifier и используйте стандартную или безопасную. Зачем использовать HTTPS вообще, если вы не хотите, чтобы он был безопасным?
Ответ 2
Убедитесь, что вы добавили строки Begin/End в формат PEM, иначе java не понимает его.
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();
}
}
}