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()));
}
我有一个使用 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()));
}