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

使用Azure HSM密钥库签名Jar包时遇InvalidKeyException错误求助

问题描述

我拿到了一枚适用于HSM的代码签名证书,已经创建了支持该证书的Azure高级版密钥库。创建证书签名请求(CSR)时的配置如下:

  • 类型:非集成CA颁发的证书
  • 内容类型:PKCS11
  • 可导出私钥:否
  • 密钥类型:RSA-HSM
  • 密钥大小:4096

GlobalSign已接受该请求,提供了signing.cer、intermediate1.cer和intermediate2.cer文件。

我尝试用jarsigner签名Jar包,已配置好资源ID、密钥等信息,执行的命令如下:

jarsigner -keystore NONE -storetype AzureKeyVault -verbose -storepass "" -tsa http://timestamp.globalsign.com/tsa/r6advanced1 -providerName AzureKeyVault -providerClass com.azure.security.keyvault.jca.KeyVaultJcaProvider -J--module-path="C:\Java_Jar_Signing_26\azure-security-keyvault-jca-2.8.1.jar" -J--add-modules="com.azure.security.keyvault.jca" -J"-Dazure.keyvault.uri=https://my.vault.azure.net/" -J"-Dazure.keyvault.tenant-id=<TENANTID>" -J"-Dazure.keyvault.client-id=<<CLIENTID>>" -J"-Dazure.keyvault.client-secret=<SECRET>" -signedjar "signed.jar" "unsigned.jar" "mycertalias"

执行后得到如下错误输出:

Apr 02, 2026 12:08:05 PM com.azure.security.keyvault.jca.implementation.KeyVaultClient <init>
INFO: Using Azure Key Vault: https://my.vault.azure.net/
Apr 02, 2026 12:08:05 PM com.azure.security.keyvault.jca.implementation.utils.AccessTokenUtil getAccessToken
INFO: Getting access token using client ID / client secret
Apr 02, 2026 12:08:06 PM com.azure.security.keyvault.jca.implementation.KeyVaultClient getKey
INFO: Getting key for alias: mycertalias
Apr 02, 2026 12:08:06 PM com.azure.security.keyvault.jca.implementation.KeyVaultClient getCertificate
INFO: Getting certificate for alias: mycertalias
Apr 02, 2026 12:08:06 PM com.azure.security.keyvault.jca.implementation.KeyVaultClient <init>
INFO: Using Azure Key Vault: https://my.vault.azure.net/
Apr 02, 2026 12:08:06 PM com.azure.security.keyvault.jca.implementation.utils.AccessTokenUtil getAccessToken
INFO: Getting access token using client ID / client secret
Apr 02, 2026 12:08:06 PM com.azure.security.keyvault.jca.implementation.KeyVaultClient getKey
INFO: Getting key for alias: mycertalias
Apr 02, 2026 12:08:06 PM com.azure.security.keyvault.jca.implementation.KeyVaultClient getCertificate
INFO: Getting certificate for alias: mycertalias
Apr 02, 2026 12:08:06 PM com.azure.security.keyvault.jca.implementation.KeyVaultClient <init>
INFO: Using Azure Key Vault: https://my.vault.azure.net/
Apr 02, 2026 12:08:06 PM com.azure.security.keyvault.jca.implementation.utils.AccessTokenUtil getAccessToken
INFO: Getting access token using client ID / client secret
Apr 02, 2026 12:08:07 PM com.azure.security.keyvault.jca.implementation.KeyVaultClient getKey
INFO: Getting key for alias: mycertalias
Apr 02, 2026 12:08:07 PM com.azure.security.keyvault.jca.implementation.KeyVaultClient getCertificate
INFO: Getting certificate for alias: mycertalias
requesting a signature timestamp
TSA location: http://timestamp.globalsign.com/tsa/r6advanced1
   adding: META-INF/MANIFEST.MF
jarsigner: unable to sign jar: java.security.InvalidKeyException: No installed provider supports this key: com.azure.security.keyvault.jca.implementation.KeyVaultPrivateKey

我已查看过相关问题,但对方进程比我更深入。另外,我已经吊销并重新颁发证书,确认不是PEM格式,但问题依旧。

解决方案

1. 调整JCA提供者注册优先级

KeyVaultPrivateKey必须由Azure Key Vault JCA提供者处理,但jarsigner可能未正确识别它。修改JDK安全配置文件,将Azure JCA提供者加入安全列表,并确保优先级高于默认RSA提供者:
找到JAVA_HOME/lib/security/java.security(或JAVA_HOME/conf/security/java.security,依JDK版本而定),添加一行:

security.provider.N=com.azure.security.keyvault.jca.KeyVaultJcaProvider

将N替换为一个数字,比如放在SunRsaSign之前,确保Azure提供者优先加载。

2. 升级Azure JCA Provider版本

你当前使用的azure-security-keyvault-jca-2.8.1.jar可能对RSA-HSM密钥的签名支持存在兼容问题。尝试升级到最新稳定版本,新版本通常会修复这类HSM相关的bug。

3. 导入完整证书链到Key Vault

GlobalSign提供的三个证书需要组成完整链导入Key Vault,不能仅导入签名证书。可以通过Azure CLI操作:

# 导入第一个中间证书
az keyvault certificate import --vault-name myVault --name mycert-intermediate1 --file intermediate1.cer
# 导入第二个中间证书
az keyvault certificate import --vault-name myVault --name mycert-intermediate2 --file intermediate2.cer
# 导入签名证书并关联证书链
az keyvault certificate import --vault-name myVault --name mycertalias --file signing.cer --certificate-policy '{"issuerParameters":{"name":"Unknown"},"keyProperties":{"exportable":false,"kty":"RSA-HSM","keySize":4096},"secretProperties":{"contentType":"application/x-pkcs12"},"x509CertificateProperties":{"subject":"CN=你的证书主题"}}'

也可以在Azure门户手动导入,确保证书指纹与密钥的kid正确关联。

4. 修正jarsigner命令参数

检查JVM参数是否正确传递,可添加调试参数排查加载问题:

jarsigner -keystore NONE -storetype AzureKeyVault -verbose -storepass "" -tsa http://timestamp.globalsign.com/tsa/r6advanced1 -providerClass com.azure.security.keyvault.jca.KeyVaultJcaProvider -J--module-path="C:\Java_Jar_Signing_26\azure-security-keyvault-jca-2.8.1.jar" -J--add-modules="com.azure.security.keyvault.jca" -J"-Dazure.keyvault.uri=https://my.vault.azure.net/" -J"-Dazure.keyvault.tenant-id=<TENANTID>" -J"-Dazure.keyvault.client-id=<CLIENTID>" -J"-Dazure.keyvault.client-secret=<SECRET>" -J-Djava.security.debug=provider -signedjar "signed.jar" "unsigned.jar" "mycertalias"

重点确认--module-path指向的Jar路径正确,有空格必须用引号包裹。

5. 检查Azure AD应用权限

确保访问Key Vault的Azure AD应用(对应你的client-id)拥有Key Vault Crypto User角色,该角色允许对HSM密钥执行签名操作。在Azure门户的Key Vault访问控制(IAM)中添加该角色即可。

6. 备用方案:自定义签名工具结合jarsigner

如果上述方法都无效,可使用Azure Key Vault Keys SDK编写简单签名工具,先完成签名逻辑,再用jarsigner将签名信息写入Jar包。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 12:23:13