6

我想根据 CRL 验证客户端提供的 X509 证书,以查看它是否已被吊销。我已成功实例化 a 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. 怎么做到呢?

4

1 回答 1

11

javax.security.cert.X509Certificate已弃用。java.security.cert.Certificate[]通过session.getPeerCertificates();,然后将其传递给您的实现crl.isRevoked

也可以看看:

javax.security.cert 包中的类是为了与早期版本的 Java 安全套接字扩展 (JSSE) 兼容而存在的。新应用程序应改为使用位于 java.security.cert 中的标准 Java SE 证书类。

您可以转换java.security.cert.Certificatejava.security.cert.X509Certificate来源):

    CertificateFactory cf = CertificateFactory.getInstance("X.509");
    ByteArrayInputStream bais = new ByteArrayInputStream(certificate.getEncoded());
    X509Certificate x509 =  (X509Certificate) cf.generateCertificate(bais);
于 2014-07-06T21:48:52.123 回答