Несовместимость между javax.security.cert.X509Certificate и java.security.cert.X509Certificate

Я хочу проверить сертификат X509, представленный клиентом, по CRL, чтобы увидеть, был ли он отозван. Я успешно создал java.security.cert.X509CRL, но у меня проблемы с получением сертификата сеанса:

try {
    SSLSocket s = (SSLSocket) serverSocket.accept();
    s.setSoTimeout(TIMEOUT_RW * 1000);
    s.startHandshake();
    SSLSession session = s.getSession();
    X509Certificate[] cert = session.getPeerCertificateChain();
    if (crl.isRevoked(cert[0])) {
        System.err.println("Attempted to stablish connection using revoked certificate");
    } else {
        ...
    }
} catch (Exception ex) {
    System.err.println("Something went wrong");
}

SSLSession принадлежит к javax.net.ssl пакет, и его метод getPeerCertificateChain() возвращает javax.security.cert.X509Certificate[], который не может быть преобразован в java.security.cert.X509Certificate[] что мне нужно кормить java.security.cert.X509CRL, Как это можно сделать?

1 ответ

Решение

javax.security.cert.X509Certificate устарела. Получить java.security.cert.Certificate[] от session.getPeerCertificates();, а затем передать его вашему crl.isRevoked реализация.

Смотрите также:

Классы в пакете javax.security.cert существуют для совместимости с более ранними версиями Java Secure Sockets Extension (JSSE). Новые приложения должны вместо этого использовать стандартные классы сертификатов Java SE, расположенные в java.security.cert.

Вы можете конвертировать java.security.cert.Certificate в java.security.cert.X509Certificate ( источник):

    CertificateFactory cf = CertificateFactory.getInstance("X.509");
    ByteArrayInputStream bais = new ByteArrayInputStream(certificate.getEncoded());
    X509Certificate x509 =  (X509Certificate) cf.generateCertificate(bais);
Другие вопросы по тегам