javax.security.cert.X509Certificate和java.security.cert.X509Certificate之间的不兼容性问题

9

我希望能够通过校验证书撤销列表(CRL)来验证客户端提供的X509证书,从而判断它是否已被吊销。

我已经成功实例化了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个回答

13

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

另请参见:

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

您可以将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);

这个选项(我曾经考虑过)的问题是,后来我需要使用X509Certificate方法,所以它对我来说还不够好。 - user2891462
但是Certificate是抽象类 - 我敢打赌cert [0]X509Certificate类的实例。只需检查并转换即可。 - MGorgon
@user2891462 如果没有,你可以执行像这样实现的转换 X509Certificate[] convertCertificates(Certificate[] certsIn) 方法:https://groups.google.com/forum/#!topic/android-developers/HCiHwBKOsrI - MGorgon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接