使用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
相关产品推荐
相关产品推荐

