org.bouncycastle.tls.crypto.TlsCertificate getSubject() 和其他 getter

org.bouncycastle.tls.crypto.TlsCertificate getSubject() and other getters

我有一个使用 bouncycastle(版本 1.66)连接到 https 服务器的客户端

tlsClientProtocol.connect(new DefaultTlsClient(new BcTlsCrypto(new SecureRandom())) {

                @Override
                public TlsAuthentication getAuthentication() throws IOException {
                    return new ServerOnlyTlsAuthentication() {
                        @Override
                        public void notifyServerCertificate(TlsServerCertificate tsc) throws IOException {
                                 // validate srvCert here. here is the problem
                                 TlsCertificate srvCert = tsc.getCertificate().getCertificateAt(0);
                        }
                    };
                }
            });

"srvCert" 是 org.bouncycastle.tls.crypto.TlsCertificate 的实例, 我如何将它转换为 org.bouncycastle.asn1.x509.Certificate 就像旧版本的 BouncyCastle 或如何获得“NotBefore”、“NotAfter”、“Subject” “……等等

PS:我暂时不关心issuer chain,我只想打印出end certificate的所有细节,另外BcTlsCertificate是就像接口 TlsCertificate.

一样无用

BouncyCastle 文档没有帮助,我是这个库的新手,互联网上的示例很旧(如果我没记错的话,在 1.6 的更改之前)

编辑:需要说明的是,接口 org.bouncycastle.tls.crypto.TlsCertificate 没有我需要的方法,这个 class 有: org.bouncycastle.asn1.x509.Certificate。但是在上一个版本中,方法签名被更改为给你无用的class。

BouncyCastle 有很多 getInstance(Object) 方法,可让您在合理的情况下将一个对象转换为另一个对象。要查找支持哪些转换,最简单的方法是查看源代码。

在您的情况下,如果 tlsCertificate 包含您的 org.bouncycastle.tls.crypto.TlsCertificate 实例,您可以获得 org.bouncycastle.asn1.x509.Certificate

final Certificate certificate = Certificate.getInstance(tlsCertificate.getEncoded());

然而,与其将 TlsCertificate 转换为 ASN.1 结构表示,我宁愿将其转换为 JCE 的 java.security.cert.X509Certificate:

final X509Certificate x509Certificate;
if (tlsCertificate instanceof JcaTlsCertificate) {
    x509Certificate = ((JcaTlsCertificate) tlsCertificate).getX509Certificate();
} else {
    final CertificateFactory factory = CertificateFactory.getInstance("X.509");
    x509Certificate = (X509Certificate) factory.generateCertificate(new ByteArrayInputStream(tlsCertificate.getEncoded()));
}