You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用jsign和AWS KMS签名Jar文件时遇权限错误求助

解决Jsign + Amazon KMS签名JAR文件时的AccessDeniedException问题

你已经成功用Jsign结合Amazon KMS完成Windows exe/dll文件签名,但签名JAR时触发了权限拒绝错误,以下是排查和修正方案:

问题复现

你使用的调整后命令:

# ADJUSTED FOR KMS
jarsigner -J-cp -J/path/to/jsign-7.1.jar -J--add-modules -Jjava.sql \
           -providerClass net.jsign.jca.JsignJcaProvider \
           -providerArg us-east-1 \
           -keystore NONE \
           -storetype AWS \
           -storepass "<ACCESS_KEY>|<SECRET_ACCESS_KEY>" \
           -keypass "<ACCESS_KEY>|<SECRET_ACCESS_KEY>" \
           -certchain /path/to/full-chain.pem  \
           /path/to/my_jar_file.jar "<my-kms-alias>"

执行后报错:

loadProviderByClass: net.jsign.jca.JsignJcaProvider
jarsigner error: java.lang.RuntimeException: java.security.KeyStoreException: java.io.IOException: AccessDeniedException: null
java.lang.RuntimeException: java.security.KeyStoreException: java.io.IOException: AccessDeniedException: null
    at net.jsign.jca.JsignJcaProvider$JsignJcaKeyStore.engineAliases(JsignJcaProvider.java:145)
    at java.base/java.security.KeyStore.aliases(KeyStore.java:1286)
    at jdk.jartool/sun.security.tools.jarsigner.Main.loadKeyStore(Main.java:2240)
    at jdk.jartool/sun.security.tools.jarsigner.Main.run(Main.java:305)
    at jdk.jartool/sun.security.tools.jarsigner.Main.main(Main.java:138)
Caused by: java.security.KeyStoreException: java.io.IOException: AccessDeniedException: null
    at net.jsign.jca.AmazonSigningService.aliases(AmazonSigningService.java:154)
    at net.jsign.jca.SigningServiceKeyStore.engineAliases(SigningServiceKeyStore.java:54)
    at java.base/java.security.KeyStore.aliases(KeyStore.java:1286)
    at net.jsign.jca.JsignJcaProvider$JsignJcaKeyStore.engineAliases(JsignJcaProvider.java:143)
    ... 4 more
Caused by: java.io.IOException: AccessDeniedException: null
    at net.jsign.jca.RESTClient.query(RESTClient.java:190)
    at net.jsign.jca.RESTClient.post(RESTClient.java:78)
    at net.jsign.jca.AmazonSigningService.query(AmazonSigningService.java:235)
    at net.jsign.jca.AmazonSigningService.aliases(AmazonSigningService.java:148)
    ... 7 more

排查与修正步骤

1. 补充KMS必要权限

错误发生在获取KMS别名的阶段(AmazonSigningService.aliases调用失败),说明你的IAM身份(用户/角色)缺少以下权限:

  • kms:ListAliases:用于枚举KMS密钥别名
  • kms:Sign:用于执行签名操作

给对应的IAM身份添加如下策略(替换占位符为你的实际信息):

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kms:ListAliases",
                "kms:Sign"
            ],
            "Resource": "arn:aws:kms:us-east-1:你的AWS账号ID:alias/你的KMS别名"
        }
    ]
}

如果是在AWS托管服务(如EC2、EKS)上执行,优先使用IAM角色而非硬编码AccessKey,避免凭证泄露且无需手动指定-storepass。

2. 简化Jarsigner命令参数

Jsign的KMS Provider不需要同时指定-storepass和-keypass,仅需-storepass传递凭证即可,删除冗余的-keypass参数:

# 修正后的命令
jarsigner -J-cp -J/path/to/jsign-7.1.jar -J--add-modules -Jjava.sql \
           -providerClass net.jsign.jca.JsignJcaProvider \
           -providerArg us-east-1 \
           -keystore NONE \
           -storetype AWS \
           -storepass "<ACCESS_KEY>|<SECRET_ACCESS_KEY>" \
           -certchain /path/to/full-chain.pem  \
           /path/to/my_jar_file.jar "<my-kms-alias>"

3. 验证KMS别名与区域匹配

确认:

  • <my-kms-alias>是KMS密钥的正确别名(注意前缀alias/是否需要,部分场景下需完整写alias/你的别名)
  • KMS密钥所在区域与-providerArg指定的us-east-1完全一致

用AWS CLI快速验证别名存在性:

aws kms list-aliases --region us-east-1 --query "Aliases[?AliasName=='alias/你的别名']"

4. 检查Java与Jsign版本兼容性

Jsign 7.1建议搭配Java 8或11使用,若使用更高版本Java,尝试去掉-J--add-modules -Jjava.sql参数,避免模块路径冲突。

内容的提问来源于stack exchange,提问作者tresf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 08:04:58