Несовместимость между 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
реализация.
Смотрите также:
http://docs.oracle.com/javase/7/docs/api/javax/net/ssl/SSLSession.html
http://docs.oracle.com/javase/7/docs/api/javax/net/ssl/SSLSession.html
Классы в пакете 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);