jarsigner 默认签名算法失败

问题描述 投票:0回答:1

jarsigner 默认签名算法会定期更新为更强的算法。对于我们来说,使用本地证书,这曾经是 SHA1withDSA。现在,同一个证书是 SHA256withDSA。 SHA1withDSA 现在实际上因不安全而被禁用。

当我用

jarsigner -verify -verbose -certs xyz.jar
验证新的JAR文件时,结果与预期一致:

Digest algorithm: SHA-256
Signature algorithm: SHA256withDSA, 1024-bit key (weak)

但是,当我使用 openSSL 和

openssl cms -cmsout -inform DER -print -in LOCALSIG.DSA
验证相同的 JAR 文件时,它仍然报告 SHA1withDSA:

digestAlgorithms:
    algorithm: sha256 (2.16.840.1.101.3.4.2.1)
signature:
    algorithm: dsaWithSHA1 (1.2.840.10040.4.3)
sig_alg:
    algorithm: dsaWithSHA1 (1.2.840.10040.4.3)

openssl pkcs7 -inform der -print_certs -text -in LOCALSIG.DSA
类似:

Signature Algorithm: dsaWithSHA1

问题1:这两种工具怎么可能报告不同的签名算法?他们之前曾报告过相同的算法。其中一定有一个是错误的。也许 jarsigner 创建了一个不明确的格式?

我仔细检查这一点的原因是我使用了一个使用 Windows 加密 API 构建的自定义 JAR 验证器。它过去工作正常多年,但无法处理这个新的 JAR 文件。我调用的第一个加密 API 函数 (

CryptVerifyDetachedMessageSignature()
) 已经返回了一个相当无用且未记录的错误 (
50 = ERROR_NOT_SUPPORTED = "The request is not supported."
)。我想这是因为格式不明确。

问题2:有什么办法可以处理我的代码中这个奇怪的签名吗?或者我应该依靠从源头修复这个问题,即 JAR 文件?

或者当前的解决方法是显式指定

jarsigner -sigalg SHA1withDSA

我还应该提到,我们不使用原始的 Oracle jarsigner,而是使用 SAPMachine 中基于 OpenJDK IIRC 的 jarsigner。

jar digital-signature jarsigner jar-signing wincrypt
1个回答
0
投票

Meta:Q的这一部分并不是真正的编程或开发,但我需要格式化;如有需要会删除。

openssl cms -cmsout -inform DER -print -in LOCALSIG.DSA
仍然报告 SHA1withDSA:

digestAlgorithms:
    algorithm: sha256 (2.16.840.1.101.3.4.2.1)
signature:
    algorithm: dsaWithSHA1 (1.2.840.10040.4.3)
sig_alg:
    algorithm: dsaWithSHA1 (1.2.840.10040.4.3)

您没有注意标题。前两行几乎位于

d.signedData:
的正下方,用于对数据进行签名时使用的哈希值;后两对在下面

    certificates:
      d.certificate:

并且它们描述了证书中的签名,而不是数据上的签名。如果这是自签名证书,那么它的签名不影响安全,可以忽略;如果它是“真实”(CA 颁发的)证书,您应该从(或任何合适的)CA 获取新证书。

如果您在

signerInfos:
下进一步查看,您应该会看到
signatureAlgorithm:
,而 that 是数据上的签名。

openssl pkcs7 -inform der -print_certs -text -in LOCALSIG.DSA

类似

pkcs7 -print_certs -text
仅显示证书,不显示有关数据签名的任何信息;事实上,尽管名称如此,它是为“p7b/p7c”格式数据设计的,该数据只有“证书”和/或“CRL”,根本没有数据签名。请参阅我在更好的堆栈上的回答 至于您的实际问题,它可能是“自定义验证程序”,但由于您没有提供任何相关信息,我什至无法尝试提供帮助(无论如何我都可以在 MSCAPI/CNG 方面提供帮助,但这里有些人可以)。 FWIW,您可以查看 OpenSSL 是否认为签名有效 - 如果证书是自签名的或直接在根目录下:

openssl cms -in LOCALSIG.DSA -inform der -verify -content LOCALSIG.SF -CAfile ss_or_root.pem

如果证书处于中间状态,则“可能”完全验证,但更复杂;可能更好地解决
-CAfile imed.pem -partial_chain


© www.soinside.com 2019 - 2024. All rights reserved.