Jarsigner: 证书链未找到

28

我已经将证书导入到私有的~/.keystore文件中:

keytool -list
Enter keystore password:

Keystore type: JKS
Keystore provider: SUN

Your keystore contains 1 entry

mylyn-mantis, Jul 15, 2010, trustedCertEntry

我正在尝试使用它对jar文件进行签名,但是出现了“未找到证书链”的错误。

jarsigner -verbose  /home/robert/file.jar mylyn-mantis
jarsigner: Certificate chain not found for: mylyn-mantis.  mylyn-mantis must reference a valid KeyStore key entry containing a private key and corresponding public key certificate chain.

我该如何解决这个问题?

6个回答

16

看起来你的密钥库只包含一个证书(公钥),你需要一个完整的密钥条目,包括私钥和完整的证书链,才能签署任何内容。


1
谢谢。我从CA收到了这个证书。我该如何生成与之相匹配的私钥? - Robert Munteanu
3
这必须事先完成:您必须生成一个密钥对,带有自签名证书,然后向您的CA请求证书签名。 - Maurice Perry
10
当我在使用keytool时不小心忘记添加别名时,这个问题出现了。 - erdomester
我遇到了相反的问题,你能帮我一下吗?我以为-keygen应该生成公钥和私钥,但根据这个问题http://stackoverflow.com/questions/19186643/keytool-for-android-generating-only-privatekey看起来好像不是这样。你有什么想法? - Tommy Nicholas
@Tommy,一个私钥条目总是有一个证书链。 - Maurice Perry
显示剩余2条评论

5

简短回答

使用别名密钥来替代密钥库,如下所示:

jarsigner -verbose -keystore [Your signature storage path] -signedjar [signed filename] [unsigned filename] [Your alias key]

更多详情

以下是解决此错误的最简单方法:

  1. 进入bin文件夹...它可能位于以下路径中之一:

C:\Users[您的计算机名称]\jdk\bin

或者这个路径:

C:\Program Files\Java\jre1.8.0_77\bin

  1. 为了避免由环境变量配置引起的问题,请将空包(用于签名)和密钥库(签名的私钥)都复制到 JDK 的bin目录下。

  2. 运行此命令获取您的别名密钥:

    keytool -keystore [您的密钥库] -list -v

  3. 最后运行此命令:

    jarsigner -verbose -keystore [您的签名存储路径] -signedjar [签名文件名] [未签名文件名] [您的别名密钥]


3

我遇到了同样的问题。我有由CA颁发的.p12文件,并试图签署jar文件。然而,我一直收到错误消息:

jarsigner: Certificate chain not found for:

基本上,我是从控制台复制别名的名称。它有一个错误字符“问号”(?),导致出现此错误。相反,我将keytool的输出重定向到文本文件中,然后从那里复制别名。

  1. 输入以下命令:

    keytool -list -v -storetype pkcs12 -keystore "mycertificate.p12" > cert.txt

(这非常重要。始终将输出重定向到txt文件中。不要从控制台输出中复制。它可能包含错误字符)

  1. 查找证书中的别名名称。打开cert.txt并复制字符串,就像在“别名名称:”前面提到的那样。

假设此字符串为“我的别名,a.p.’s my ca limited id”

  1. 使用jarsigner:

    jarsigner -storetype pkcs12 -keystore "mycertificate.p12" myjarfile.jar "我的别名,a.p.’s my ca limited id"


2

我曾经遇到过这个错误,但是原因不同。当你向CA发送CSR时,它将使用你生成的特定私钥和特定别名来发出请求。当你收到证书时,你必须使用相同的别名导入证书,否则两个证书将无法连接在一起。

如果你操作正确,在使用keytool -list -v命令时,你会看到一个带有别名名称的单个条目,类型为

Entry type: PrivateKeyEntry
Certificate chain length: 3

对于“entry”这个词,如果使用不当,则会有两个条目。

Entry type: PrivateKeyEntry
Certificate chain length: 1

并且

Entry type: trustedCertEntry

您对使用相同的别名名称的评论对我的问题至关重要 - 幸运的是,没有花费太多时间就找到了这个宝石。 - Bryan

0
我遇到了这个错误是因为我使用了 Jenkins 的“证书”凭据。Jenkins 凭据配置对话框有一个叫做“描述”的文本框,其帮助说它是描述凭据的自由注释。事实上,Jenkins 流水线块“withCredentials”使用“描述”文本框来填充根据“aliasVariable”属性命名的环境变量。
withCredentials([certificate(
    credentialsId:    my_credentials,
    keystoreVariable: 'MY_KEYSTORE',
    aliasVariable:    'MY_ALIAS', // Set value in Description textbox
    passwordVariable: 'MY_PASSWORD')]) {
       bat 'mvn clean deploy -Dmy.keystore=%MY_KEYSTORE% -Dmy.alias=%MY_ALIAS% -Dmy.password=\"%MY_PASSWORD%\"'
}

在 Jenkins 文档 中没有提到这一点。


0

mylyn-mantis 应该是您生成签名密钥时使用的实际别名名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接