java - 在 Java 中通过 Bouncy CaSTLe 验证 pkcs7 SignedData

标签 java c# validation pkcs#7

我正在研究用 Java 实现 C# SignedCms 功能。

我有一个pkcs7 SignedData(参见我的附件:https://www.dropbox.com/s/yivani7dvh98wpa/SignedData.bin?dl=0),它可以在C#中验证:

    //signed data is loaded from my attached file.
    bool VerifyPKCS7(byte[] signedData)
    {
        try
        {
            SignedCms signedCms = new SignedCms();
            signedCms.Decode(signedData);

            signedCms.CheckSignature(true);

            return true;
        }
        catch
        {

        }

        return false;
    }

但无法使用 Java 中的 Bouncy CaSTLe 库(bcprov-jdk15on-153.jar、bcpkix-jdk15on-153.jar)进行验证:

  //encapSigData is loaded from my attached file.      
  CMSSignedDataParser     sp = new CMSSignedDataParser(new JcaDigestCalculatorProviderBuilder().setProvider("BC").build(), encapSigData);

  sp.getSignedContent().drain();

  Store                   certStore = sp.getCertificates();
  SignerInformationStore  signers = sp.getSignerInfos();

  Collection              c = signers.getSigners();
  Iterator                it = c.iterator();

  while (it.hasNext())
  {
      SignerInformation   signer = (SignerInformation)it.next();
      Collection          certCollection = certStore.getMatches(signer.getSID());

      Iterator        certIt = certCollection.iterator();
      X509CertificateHolder cert = (X509CertificateHolder)certIt.next();

      System.out.println("verify returns: " + signer.verify(new JcaSimpleSignerInfoVerifierBuilder().setProvider("BC").build(cert)));
  }

我在第一行代码(CMSSignedDataParser 构造函数)处遇到异常:

java.lang.ClassCastException: org.bouncycastle.asn1.DERSequenceParser cannot be cast to org.bouncycastle.asn1.ASN1OctetStringParser
at org.bouncycastle.cms.CMSSignedDataParser.<init>(Unknown Source)
at org.bouncycastle.cms.CMSSignedDataParser.<init>(Unknown Source)
at org.bouncycastle.cms.CMSSignedDataParser.<init>(Unknown Source)

经过一番分析,我发现SignedDatacontentInfocontent是一个Sequence。 bouncycaSTLe 似乎无法接受序列作为内容

如何使用 Java 中的 bouncycaSTLe 验证此 SignedData

最佳答案

这里的问题是,与常规 CMS 消息不同,这实际上是 PKCS7 消息。 Bouncy CaSTLe 中的 bcpkix API 现已添加对这些的支持。

您可以在最新的测试版中找到它:http://www.bouncycastle.org/betas 154b12 或更高版本。

关于java - 在 Java 中通过 Bouncy CaSTLe 验证 pkcs7 SignedData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34197756/

相关文章:

java - Spring集成SFTP - 不会重新下载本地删除的文件

c# - 在局域网中搜索WCF服务?

c# - 为动态创建的按钮禁用 "cause validation"

validation - [CFWS]和[FWS]在此ABNF中是什么意思?

c# - Validator.TryValidateProperty 不工作

Java.util.logger 每天新文件

java arraylist 对象的总和

java - ConstraintValidatorContext 定义自定义错误消息

java - 如何在 Eclipse IDE 中执行 shell 脚本?

c# - Azure - 将 .NET Web 应用程序与 azure sql 数据库连接