【问题标题】:jarsigner "Only one alias can be specified" 3jarsigner "只能指定一个别名" 3
【发布时间】:2015-11-19 19:26:08
【问题描述】:

我仔细阅读了1333541987480894282405 和其他一些问题。他们指出,最可能的原因是嵌入空间。另一个答案是可能的证书问题。我以this tutorial 为指导。

我有一个真实的证书,而不是一个自我证书,就像在问题中一样。我也在使用最新的 JDK,1.8.0-60(64 位)。我卸载了所有其他 JDK。

电脑:

OS: Windows 7 64-bit
JDK Path: "C:\Program Files\Java\jdk1.8.0_60"

我尝试了几种技术来消除空间问题。从管理员命令提示符:

  1. mklink /D C:\Documents\JDK "C:\Program Files\Java\jdk1.8.0_60"
  2. mklink /J C:\Documents\JDK1 "C:\Program Files\Java\jdk1.8.0_60"
  3. mkdir C:\Documents\JDK2(后跟)复制“C:\Program 文件\Java\jdk1.8.0_60" C:\Documents\JDK2

命令行:

jarsigner.exe –keypass <key password> -keystore C:\SoftDev\JavaWorkspaces\myproject\Versions\Current64\mykeystore.keystore –storepass <store password> -tsa http://timestamp.comodoca.com/rfc3161 -digestalg SHA2 C:\SoftDev\JavaWorkspaces\myproject\Versions\Current64\build\bin\myproject.jar 31843016-4ab3-11e5-9ba9-0015170bee96

我通过查看证书详细信息验证了我的证书使用算法 SHA-2 (SHA-256)。当我将证书导出到 PFX 文件时,我尝试了复选框 1(包括路径中的所有证书)和框 3(扩展属性)的排列。我最初选择导出私钥。

我与密钥颁发者交谈,他们认为别名应该是 39 个字符,但是我重新检查了发出该别名的命令,并且在反复尝试后,我得到了 37 个字符。

keytool.exe -importkeystore -srckeystore "C:\Documents\Signing\mypfx.pfx" -srcstoretype pkcs12 -destkeystore C:\SoftDev\JavaWorkspaces\myproject\Versions\Current64\mykeystore.keystore -deststoretype JKS

我使用提到的各种排列输入了上面指定的所有可执行文件(单独在上面列举的各种目录中并指定了完整路径。我尝试指定带引号和不带引号的所有文件名。

KSoftware 给我回了信:

我认为问题在于您以某种方式为 jarsigner.exe 指定了太多参数,或者其中一个参数以某种方式无效。我对 Java 和 Jarsigner 的了解有限,但我确实注意到您使用的别名似乎与我以前见过的格式不同(它似乎太短了几个字符)。您是否从第 4 步得到了那个别名字符串,那是整个字符串吗?

当我对命令执行 -help 时,参数将教程与 tee 匹配并且有意义。 我无法解释别名长度和格式差异。 有人告诉我使用 JDK 的“绝对最新版本”,我就是(1.8.0-60)。我提到了这个版本,他们对此表示同意。 步骤 3 和 4 显示相同的别名。也许当时编写本教程的人从 JDK 的一个版本中获得了别名 le-e76649fec-3a2f-4cda-8a6e-441c224481b,该版本以不同的方式计算别名,只是教程没有更新。 Comodo 是一家大公司,所以如果教程页面来自他们或 KSoftware 最近没有进行过练习,那么教程页面可能会被他们忽略。不过,从我收集到的信息来看,这些步骤似乎是合理的。

更新

根据我与 EJP 的对话,this question 似乎适合签名者的链问题。

来自 Comodo/KSoftware 的回应: 正如我在评论中提到的,@Omikron 在最初的问题上是正确的。错误是从 KSoftware.net 的网站复制/粘贴。

还有 2 个其他问题。 2. Oracle/Java 工具链不支持 SHA-256 (SHA2) 只支持 SHA1。

  1. 即使您在订单上注明 SHA-128 (SHA-1),Comodo 也会发出 SHA-256。他们对我说他们将停止/停止发布 SHA-128。

签名者的链错误是由 SHA2 引起的。这是他们对我的回应:

我理解您的犹豫,但我向您保证,这些天我已经处理了很多“链未验证”问题,这都与 SHA-256 移动有关。不过,我可以解决这个问题,只需按照我发送的那些说明进行操作,我们就会让你摆脱困境......我仍然有点困惑为什么 Jarsigner 不让你在命令行上传递该密码,但这就是在这一点上或多或少是次要的。我们仍然可以让您几乎立即签署 JAR 文件,并从不同的根重新发布。

FWIW,迁移到 SHA-256 和所需的新 RSA 根对 Java 来说是一团糟,因为它们在添加受信任的根方面非常、非常缓慢。这一举措已经为人所知几年了,最近一次JDK 版本是第一个解决这个问题的版本,甚至它也没有很好地解决这个问题。目前最好的选择是使用已识别的较旧的受信任根(在 2020 年之前仍然有效)。

我正在处理多个问题以使我的 jar 签名。

最后更新 我收到了来自 Comodo 的新密钥,并且没有问题地签署了我的 jar。

误解:我的原始证书和新证书都是 SHA-256。区别在于 CA。原来的是“COMODO RSA Code Signing CA”,而新的是“COMODO SHA-256 Code Signing CA”。两者的详细视图显示完全相同的算法。问题确实是 KSOftware 所说的。 RSA CA 还没有更新他们的立场。

【问题讨论】:

  • 尝试将别名放在引号中。尝试不使用 tsa 和 sigalg 参数。尝试将其简化为可行的情况。我同意可能存在嵌入空间:别名之前的某些内容被视为别名。
  • 进度:jarsigner.exe 不希望我指定 –storepass。我输入了类似(减去双引号)–storepass mypassword 之类的内容。该工具似乎不需要、不需要或不喜欢 -keypass 参数。别名周围的引号没有区别。我被要求输入密码,然后我收到警告:“jar 签名。警告:签名者的证书未经验证。”这是什么意思?
  • 这意味着您需要将签名者的证书链导入您的密钥库文件,使用-trustcacerts。它将与签署的证书一起提供。您通常不会在单个密钥上设置密码,例如 JSSE 除了您自己手动编码之外,无法处理它们。
  • 问题出在其他问题上,keytool -import -trustcacerts -alias root -file "path-to-crt.cer" -keystore "path-to-jks.jks",产生“Certificate already存在于别名 下的密钥库中,这是有道理的,因为我已经将证书添加到了密钥库文件中。
  • 是的,那是你的证书,但我说的是签名者的链。

标签: java code-signing keystore keytool jarsigner


【解决方案1】:

命令行中“keypass”和“storepass”前面的字符都是“en dashes”(ASCII码0x96,见https://en.wikipedia.org/wiki/Dash)。它们应该是“hyphen-minus”(ASCII 代码 0x2D)。

这可以通过在十六进制编辑器中查看字符串来检查(如HxD):

由于错误的字符,“-keypass”没有被 jarsigner 识别为参数,这会弄乱整个命令,从而导致奇怪的错误消息。

类似问题:Certificate chain not found, but keystore contains private key

【讨论】:

  • 附录:2 个其他问题。 1) SHA2 不是受支持的哈希算法。我需要使用 SHA1。 2) 我收到了一封来自 KSoftware/Comodo 的电子邮件,他们说“签名者的证书链”错误是 Comodo 以 SHA-256 而不是所需的 SHA-128 颁发密钥的结果。 Oracle 更新工具链的速度很慢。 Comodo 不得不重新发布代码。
  • @SarahWeinberger 关于第 1 点):-digestalg SHA256 本来是正确的,我没有看到。 SHA256 是自 Java7 以来的默认值,顺便说一句。
  • 这是一个很好的捕捉,并考虑将代码粘贴到文本编辑器中。 FWIW,我将第 5 步的代码复制并粘贴到 certhelp.ksoftware.net/support/solutions/articles/… 并看到了问题。似乎原始代码在某些时候看到了 Microsoft Word,因为 Word 会做这种事情。
  • @OImikron 我刚刚尝试了“-digestalg SHA256”并看到“jarsigner 错误:java.security.NoSuchAlgorithmException:SHA256 MessageDigest 不可用”。去掉摘要参数仍然会产生警告(实际上是错误):“签名者的证书链未经验证。”
  • @SarahWeinberger 哎呀,-digestalg SHA-256
猜你喜欢
  • 2012-10-31
  • 2012-02-03
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
  • 1970-01-01
  • 2014-08-07
  • 2011-04-16
  • 1970-01-01
相关资源
最近更新 更多