【问题标题】:Verifying a PKCS#7 Signature with BouncyCastle in Scala在 Scala 中使用 BouncyCastle 验证 PKCS#7 签名
【发布时间】:2016-08-05 16:38:25
【问题描述】:

我需要使用 BouncyCastle(版本 1.54)在 Scala 中验证分离的 PKCS#7 签名。签名的数据不包含在 PKCS#7 签名中。

PKCS#7 签名使用单个证书执行。

我根据BouncyCastle的Javadoc写了一个简单的函数来验证签名:

      def verify(data: File): Boolean = {
        val signedData = new CMSSignedData(new CMSProcessableFile(data), Base64.decode(this.value))
        val certStore = signedData.getCertificates
        val signers = signedData.getSignerInfos.getSigners
        val signer = signers.iterator.next
        val certs = certStore.getMatches(signer.getSID)
        val cert = certs.iterator.next.asInstanceOf[X509CertificateHolder]
        signer.verify(new JcaSimpleSignerInfoVerifierBuilder().setProvider("BC").build(cert))
      }

当我编译代码时,我得到以下错误:

[error] LogVerifier.scala:26: type mismatch;
[error]  found   : org.bouncycastle.cms.SignerId
[error]  required: org.bouncycastle.util.Selector[?0]
[error]     val certs = certStore.getMatches(signer.getSID)

你能帮我解决这个编译问题吗?

提前致谢!

【问题讨论】:

  • 事实上,我认为我的问题与我使用Java类型实现具有泛型类型的Java接口的事实有关。我可能会在这个方向上重新表述我的问题,因为它与 PKCS#7 签名无关(即使这是我想要做的)。

标签: scala compiler-errors bouncycastle pkcs#7


【解决方案1】:

问题是CMSSignedData.getCertificates返回一个无类型的Store

https://www.bouncycastle.org/docs/pkixdocs1.5on/org/bouncycastle/cms/CMSSignedData.html#getCertificates()

public org.bouncycastle.util.Store getCertificates()

Scala 编译器将其解释为Store[_],它是存在类型Store[?0] forSome { type ?0 } 的简写(参见this 问题的答案),即Store 被参数化为某种特定的任意类型,而不是Any.

此外,SignerId 扩展了一个无类型的 Selector

现在,以下代码会导致类型不匹配,因为 certStore (Store[_]) 和 signer.getSID (Selector[_]) 的类型参数值不兼容。

val certs = certStore.getMatches(signer.getSID)

要解决此问题,将certStore 显式转换为Store[X509CertificateHolder] 并将signerId 转换为Selector[X509CertificateHolder] 应该会有所帮助(未经测试):

val certStore = signedData.getCertificates.
  asInstanceOf[Store[X509CertificateHolder]]

val certs = certStore.getMatches(
  signer.getSID.asInstanceOf[Selector[X509CertificateHolder]])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 2020-03-05
    • 2018-05-03
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多