【问题标题】:BouncyCastle signature creation java.lang.NoSuchFieldError: xmss_SHA256phBouncyCastle 签名创建 java.lang.NoSuchFieldError: xmss_SHA256ph
【发布时间】:2020-07-06 07:42:18
【问题描述】:

我正在尝试创建如下所示的签名,但出现此错误:

java.lang.NoSuchFieldError: xmss_SHA256ph

我正在使用 bcprov-jdk15on 和 bcpkix-jdk15on 版本 1.64 和 Java 8。我尝试了各种签名算法,最新的是 SHA1WITHRSA。我也试过 SHA256WITHRSA 和 SHA256withECDSA。

你知道我为什么会收到这个错误吗?谢谢。

CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
ContentSigner sha1Signer = new JcaContentSignerBuilder(getSignatureAlgorithm()).build(key);
gen.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(new 
JcaDigestCalculatorProviderBuilder().build()).build(sha1Signer, cert));
gen.addCertificates(new JcaCertStore(chain));
CMSTypedDataInputStream msg = new CMSTypedDataInputStream(content);
CMSSignedData signedData = gen.generate(msg, false);
signatureBytes = signedData.getEncoded();

堆栈跟踪

java.lang.NoSuchFieldError: xmss_SHA256ph
at org.bouncycastle.operator.DefaultSignatureAlgorithmIdentifierFinder.<clinit>(Unknown Source) ~[bcpkix-jdk15on-1.64.jar:1.64.00.0]
at org.bouncycastle.operator.jcajce.JcaContentSignerBuilder.<init>(Unknown Source) ~[bcpkix-jdk15on-1.64.jar:1.64.00.0]
at com.trovare.document.pki.Signer.sign(Signer.java:162) ~[classes/:na]
at org.apache.pdfbox.pdfwriter.COSWriter.doWriteSignature(COSWriter.java:744) ~[pdfbox-2.0.19.jar:2.0.19]
at org.apache.pdfbox.pdfwriter.COSWriter.visitFromDocument(COSWriter.java:1150) ~[pdfbox-2.0.19.jar:2.0.19]
at org.apache.pdfbox.cos.COSDocument.accept(COSDocument.java:452) ~[pdfbox-2.0.19.jar:2.0.19]
at org.apache.pdfbox.pdfwriter.COSWriter.write(COSWriter.java:1386) ~[pdfbox-2.0.19.jar:2.0.19]
at org.apache.pdfbox.pdmodel.PDDocument.saveIncremental(PDDocument.java:1392) ~[pdfbox-2.0.19.jar:2.0.19]
at com.trovare.document.pdf.PdfDcoumentSigner.sign(PdfDcoumentSigner.java:167) ~[classes/:na]
at com.trovare.document.DocumentEncryptorApplication.run(DocumentEncryptorApplication.java:62) [classes/:na]
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:784) [spring-boot-2.2.5.RELEASE.jar:2.2.5.RELEASE]
at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:768) [spring-boot-2.2.5.RELEASE.jar:2.2.5.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:322) [spring-boot-2.2.5.RELEASE.jar:2.2.5.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) [spring-boot-2.2.5.RELEASE.jar:2.2.5.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) [spring-boot-2.2.5.RELEASE.jar:2.2.5.RELEASE]
at com.trovare.document.DocumentEncryptorApplication.main(DocumentEncryptorApplication.java:48) [classes/:na]

我使用 java keytool 为我测试的每个算法创建了一个新的密钥库和密钥。比如这样:

keytool -genkey -alias docsigner -keyalg RSA -keysize 2048 -sigalg SHA256withRSA  -validity 3650 -keystore keystore.jks

【问题讨论】:

  • 不能只选择签名算法,必须使用与密钥兼容的算法。看来您的关键是 XMSS,一种相当新的“后量子”算法。但这应该在 BC 1.57 或更高版本中仍然有效。什么是完整的堆栈跟踪?
  • 感谢您的回复。每次更改算法时,我都会使用 java keytool 命令创建一个新的密钥库和密钥。
  • @dave_thompson_085 附加信息是否为您提供了更多线索,说明原因可能是什么?谢谢。

标签: java digital-signature bouncycastle pki


【解决方案1】:

我遇到了这个问题,但对现有的“只使用旧版本”的答案不满意!

就我而言,我一直在管理以下依赖项:

  <dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.68</version>
  </dependency>
  <dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcpkix-jdk15on</artifactId>
    <version>1.68</version>
  </dependency>

经过一些代码检查并查看依赖层次结构后,我看到另一个不同步的 bouncycastle 依赖被拉入,即:

[INFO] +- org.springframework.security.extensions:spring-security-saml2-core:jar:1.0.10.RELEASE:compile
[INFO] |  +- com.narupley:not-going-to-be-commons-ssl:jar:0.3.20:compile
[INFO] |  |  +- org.bouncycastle:bcprov-ext-jdk15on:jar:1.60:compile

管理额外的依赖以与其他 bouncycastle 保持一致为我解决了这个问题,即我在我的 POM 中将以下块添加到 dependencyManagement:

  <dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-ext-jdk15on</artifactId>
    <version>1.68</version>
  </dependency>

【讨论】:

    【解决方案2】:

    因此,对于遇到此问题的其他人,我的问题是通过将 bouncycastle 的版本更改为 1.60 来解决的。

    我应该指出我尝试了以下版本:1.63、1.62 和 1.61,但没有一个有效。这就是我的 pom 现在的样子(或者它的一部分)

    <properties>
        <java.version>1.8</java.version>
        <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
        <bouncycastle.version>1.60</bouncycastle.version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk15on</artifactId>
            <version>${bouncycastle.version}</version>
        </dependency>
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcpkix-jdk15on</artifactId>
            <version>${bouncycastle.version}</version>
        </dependency>
        ...
    <dependencies>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-15
      • 2017-06-29
      • 1970-01-01
      相关资源
      最近更新 更多