【发布时间】:2012-11-28 12:03:50
【问题描述】:
我正在尝试使用 java Bouncy Castle 1.47 从 CMSSignedData 对象中提取签名者的 X509CertificateObject。 到目前为止,我只能提取一个 org.bouncycastle.asn1.x509.Certificate 对象。 如何从中获得 X509CertificateObject? 非常感谢!
public static X509CertificateObject extractSignersCert(CMSSignedData cmsSignedData)
throws Exception
{
SignerInformationStore signerInfoStore;
SignerInformation signerInfo;
Store certStore;
Collection certCollection;
X509CertificateHolder x509CertHolder;
X509Certificate cert;
X509CertificateObject certObj;
JcaX509CertificateConverter certConverter;
signerInfoStore = cmsSignedData.getSignerInfos();
signerInfo = (SignerInformation) signerInfoStore.getSigners().iterator().next();
certStore = cmsSignedData.getCertificates();
certCollection = certStore.getMatches(signerInfo.getSID());
x509CertHolder = (X509CertificateHolder) certCollection.iterator().next();
certConverter = new JcaX509CertificateConverter();
certConverter.setProvider("BC");
cert = certConverter.getCertificate(x509CertHolder);
certObj = (X509CertificateObject) cert;
return certObj;
}
【问题讨论】:
-
试试
X509CertificateObjectclass's constructor 它应该接受一个X509CertificateStructure对象(根据您的代码示例),您的cert变量会保留。 -
这也是我最初的想法。不幸的是,这实际上似乎是不可行的。更改了演示代码。查看类关系,您会发现 cert 不是,或者至少不再是 X509CertificateStructure 的子类。
-
我检查了this Bouncy Castle Maven artifact 附加的
sources.jar和javadoc.jar。对我来说,似乎定义了构造函数。我还没有运行您的代码,但可以检查并发布您使用的 exact Bouncy Castle 版本吗? -
我正在使用来自bouncycastle.org/latest_releases.html 的最新BC Jars,即bcprov-jdk15on-147.jar,我的JDK 是1.7
-
Class X509CertificateObject 在 BC 1.47 中定义了一个构造函数 X509CertificateObject(X509CertificateStructure c)。 (不幸的是)org.bouncycastle.asn1.x509.Certificate 只有 org.bouncycastle.asn1.ASN1Object 作为与 X509CertificateStructure 的共同祖先
标签: java x509certificate bouncycastle pkcs#7