【问题标题】:SignerID cast to X509CertSelector in BouncyCastle library在 BouncyCastle 库中将 SignerID 转换为 X509CertSelector
【发布时间】:2012-05-09 13:29:07
【问题描述】:

我正在尝试验证特定消息是否使用来自我自己的信任锚识别的实体证书的有效签名进行签名。我正在这样做:

public static boolean isValid(CMSSignedData signedData, X509Certificate rootCert) throws Exception
{
    CertStore certsAndCRLs = signedData.getCertificatesAndCRLs("Collection", "BC");
    SignerInformationStore signers = signedData.getSignerInfos();
    Iterator it = signers.getSigners().iterator();

    if (it.hasNext()){
        SignerInformation signer = (SignerInformation)it.next();

        X509CertSelector signerConstraints = signer.getSID();

        PKIXCertPathBuilderResult result = buildPath(rootCert, signerID, certsAndCRLs);

        return signer.verify(result.getPublicKey(), "BC");
    }
    return false;
}

但是这一行给了我一个编译错误:

X509CertSelector signerConstraints = signer.getSID();

因为它无法从 SignerId 转换为 X509CertSelector。我尝试使用显式转换:

X509CertSelector signerConstraints = (CertSelector) signer.getSID();

还有:

X509CertSelector signerConstraints = (X509CertSelector) signer.getSID();

没有结果。我怎样才能做到这一点?谢谢

PS:请注意,这段代码是从 David Hook 的“Beginning Cryptography with Java”中提取的,但它不能编译。

【问题讨论】:

  • 您能给我们提供 API 版本的 Bouncy Castle 吗?当 Dave 在 BC 邮件列表上巡视时,您肯定会从他那里得到答案?

标签: java security x509certificate bouncycastle x509


【解决方案1】:

我昨天解决了自己的问题。我认为那是什么 相对于作为我项目的外部存档包含的 .jar。现在,我正在使用 这些:

bcprov-jdk16-145.jar
bcmail-jdk16-145.jar

代替:

bcprov-jdk15on-147.jar
bcmail-jdk15on-147.jar

也许旧版本不支持这种隐式转换。

编辑:大卫胡克在http://bouncy-castle.1462172.n4.nabble.com/Problem-with-SignerID-and-X509CertSelector-td4620461.html的回答

使用 org.bouncycastle.cert.selector.jcajce.JcaX509CertSelectorConverter - 不幸的是,“使用 Java 开始加密”中的代码现在已经过时了。我想我得把文字处理器拿出来 再次。

问候,

大卫

【讨论】:

  • Fran,-145 的版本实际上比-147 的版本低。 16 和 15 仅与 Java 运行时的非商业版本号有关。所以这个答案现在可能是正确的,但意味着你将无法升级。请发布大卫的答案。
  • @owlstead 这实际上是为我的主人的一个主题做一些功课,所以我可以在没有未来维护想法的情况下完成它。无论如何,我会编辑我自己的答案,为你提供大卫的答案。
【解决方案2】:

在 1.52 上使用 BouncyCastle bcmail-jdk15 我成功地做到了这一点:

X509CertificateHolderSelector x509CertificateHolderSelector = new X509CertificateHolderSelector(info.getSID().getSubjectKeyIdentifier());
X509CertSelector certSelector = new JcaX509CertSelectorConverter().getCertSelector(x509CertificateHolderSelector);
@SuppressWarnings("unchecked")
Collection<X509Certificate> certCollection = (Collection<X509Certificate>) certs.getCertificates(certSelector);

【讨论】:

    猜你喜欢
    • 2015-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    相关资源
    最近更新 更多