首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在RSASSA中使用JarSigner

在RSASSA中使用JarSigner
EN

Stack Overflow用户
提问于 2020-10-02 13:11:30
回答 1查看 751关注 0票数 8

我试图用JarSigner用PKCS#11来签名一个JAR文件。为了指定签名算法,JarSigner使用了sigalg标志。JDK 14 JarSigner文档没有指定显式支持哪个sigalgs。我已经测试过JarSigner接受“RSASSA”作为一个有效的算法。JarSigner不接受(如SunPKCS11 Crypto )通常支持的"SHA256withRSASSA-PSS“或类似的RSASSA变种。当尝试使用sigalg“RSASSA PSS”签名时,JarSigner返回。

jarsigner: unable to sign jar: java.security.SignatureException: Parameters required for RSASSA-PSS signature

此异常意味着不设置PSS参数。我把这个问题追溯到了JarSigner

我是不是遗漏了什么?如果是,我如何才能签署一个JAR文件?如果不是,这是窃听器吗?毕竟,JarSigner显然接受RSASSA作为一个有效的sigalg。或者,这是JarSigner和SunPKCS11实现之间的不兼容吗?毕竟,在这种情况下,SunPKCS11可能只是使用硬编码的PSS param值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-06 01:47:59

看来这还不受支持。我可以使用jarsigner命令行工具和这样的代码再现这种行为:

代码语言:javascript
复制
import jdk.security.jarsigner.JarSigner;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.security.*;
import java.security.cert.CertPath;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.util.Arrays;
import java.util.zip.ZipFile;

class JarSignerDemo {
  public static void main(String[] args) throws IOException, CertificateException, NoSuchAlgorithmException, KeyStoreException, UnrecoverableKeyException {
    char[] password = "changeit".toCharArray();
    KeyStore keyStore = KeyStore.getInstance(new File("keystore.jks"), password);
    PrivateKey privateKey = (PrivateKey) keyStore.getKey("mykey", password);
    CertPath certPath = CertificateFactory.getInstance("X.509").generateCertPath(Arrays.asList(keyStore.getCertificateChain("mykey")));
    JarSigner jarSigner = new JarSigner.Builder(privateKey, certPath)
      .digestAlgorithm("SHA-256")
      .signatureAlgorithm("RSASSA-PSS")
      .build();
    try (
      ZipFile jarFile = new ZipFile("my.jar");
      FileOutputStream signedJarFile = new FileOutputStream("my-signed.jar")
    )
    {
      jarSigner.sign(jarFile, signedJarFile);
    }
  }
}
代码语言:javascript
复制
Exception in thread "main" jdk.security.jarsigner.JarSignerException: Error creating signature
    at jdk.jartool/jdk.security.jarsigner.JarSigner.sign(JarSigner.java:573)
    at JarSignerDemo.main(scratch_3.java:28)
Caused by: java.security.SignatureException: Parameters required for RSASSA-PSS signatures
    at java.base/sun.security.rsa.RSAPSSSignature.ensureInit(RSAPSSSignature.java:295)
    at java.base/sun.security.rsa.RSAPSSSignature.engineUpdate(RSAPSSSignature.java:346)
    at java.base/java.security.Signature$Delegate.engineUpdate(Signature.java:1393)
    at java.base/java.security.Signature.update(Signature.java:902)
    at java.base/java.security.Signature.update(Signature.java:871)
    at jdk.jartool/jdk.security.jarsigner.JarSigner.sign0(JarSigner.java:841)
    at jdk.jartool/jdk.security.jarsigner.JarSigner.sign(JarSigner.java:562)
    ... 1 more

看起来JDK-8245274是要将这个特性添加到Java16中。我不是百分之百肯定,但它看起来像你的问题。你可能想看它。

更新:稍微偏离主题,但看起来您可以使用BouncyCastle与RSASSA进行签名。不过,我不确定这是否是你的另一个选择。也许你只是想换一种钥匙类型。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64174607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档