Подтвердить что ты не робот

Как получить цепочку сертификатов сервера, а затем проверить ее правильность и надежность в Java

Мне нужно создать соединение Https с удаленным сервером, затем получить и проверить сертификат.

Я установил тон соединения:

try {  
    url = new URL(this.SERVER_URL);  
    HttpURLConnection con = (HttpURLConnection) url.openConnection();   
    HttpsURLConnection secured = (HttpsURLConnection) con;  
    secured.connect(); 
}  

Но, кажется, getServerCertificateChain() метод undefined по типу HttpsURLConnection.

Итак, как мне получить цепочку сертификатов сервера? Я понимаю, что getServerCertificateChain() должен возвращать массив объектов X509Certificate и что у этого класса есть методы, которые я могу использовать для опроса сертификата.

Мне нужно проверить, что:

  • сертификат действителен и доверен,
  • проверить точку распространения списка отзыва сертификатов на серийный номер сертификата
  • убедитесь, что он не истек, и
  • убедитесь, что URL-адрес сертификата совпадает с другим (который я уже получил).

Я потерян и буду очень благодарен за любую помощь!

4b9b3361

Ответ 1

Вы хотите getServerCertificates, а не getServerCertificateChain. Здесь есть хороший код .


ИЗМЕНИТЬ

Добавлен код примера. Хорошая отправная точка для вас. Не забудьте посмотреть Javadocs на HttpsURLConnection и X509Certificate.

import java.net.URL;
import java.security.cert.Certificate;
import java.security.cert.CertificateExpiredException;
import java.security.cert.X509Certificate;

import javax.net.ssl.HttpsURLConnection;

public class TestSecuredConnection {

    /**
     * @param args
     */
    public static void main(String[] args) {
        TestSecuredConnection tester = new TestSecuredConnection();
        try {
            tester.testConnectionTo("https://www.google.com");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public TestSecuredConnection() {
        super();
    }

    public void testConnectionTo(String aURL) throws Exception {
        URL destinationURL = new URL(aURL);
        HttpsURLConnection conn = (HttpsURLConnection) destinationURL
                .openConnection();
        conn.connect();
        Certificate[] certs = conn.getServerCertificates();
        for (Certificate cert : certs) {
            System.out.println("Certificate is: " + cert);
            if(cert instanceof X509Certificate) {
                try {
                    ( (X509Certificate) cert).checkValidity();
                    System.out.println("Certificate is active for current date");
                } catch(CertificateExpiredException cee) {
                    System.out.println("Certificate is expired");
                }
            }
        }
    }
}

Ответ 3

Этот пример кода, упомянутый Kirby и arulraj.net, был удален из Apache CXF в 2011 году и не поддерживал OCSP. Проект Apache PDFBox "воскресил" этот код и добавил поддержку OCSP и другие функции, отсутствующие в исходном коде, например, проверка подписи CRL. Начиная с версии 2.0.13 улучшенный исходный код доступен в подпроекте examples в классе CertificateVerifier. Он также доступен в Интернете с небольшими улучшениями.

Код не претендует быть совершенным и еще не проверяет, доверен ли root. Разработка отслеживается в выпуске JIRA PDFBOX-3017.