使用Azure Key Vault Managed HSM证书签名代码遇问题求助
解决Azure Managed HSM中EV证书代码签名的问题
先排查权限与配置问题(解决"Not Found"报错)
Managed HSM和普通Azure Key Vault的权限模型完全不同,仅分配Managed HSM Crypto User角色可能不够,需要确保以下几点:
- 给服务主体/应用分配的角色范围必须覆盖目标Managed HSM实例(或具体的证书/密钥资源),而非仅资源组
- 确保服务主体拥有密钥级的签名权限:
Microsoft.KeyVault/managedHsm/keys/sign/action(代码签名本质是调用证书私钥签名) - 确保服务主体拥有证书读取权限:
Microsoft.KeyVault/managedHsm/certificates/get/action(用于获取证书元数据) - 验证证书名称和HSM域名:Managed HSM的证书访问路径是
https://<hsm-name>.managedhsm.azure.net/certificates/<cert-name>,注意域名是.managedhsm.azure.net而非普通AKV的.vault.azure.net,且证书名称区分大小写
替代AzureSignTool的可用方案
方案1:使用SignTool + Azure AD令牌
SignTool原生支持通过Azure AD令牌访问Managed HSM的证书,步骤如下:
- 获取针对Managed HSM的Azure AD访问令牌:
az account get-access-token --resource "https://<your-hsm-name>.managedhsm.azure.net/" --query accessToken -o tsv - 执行代码签名:
signtool sign /fd SHA256 /a /f "https://<your-hsm-name>.managedhsm.azure.net/certificates/<cert-name>" /u "<获取到的访问令牌>" /t "http://timestamp.digicert.com" <待签名文件.exe>
方案2:Azure CLI密钥签名 + SignTool附加签名
直接调用Managed HSM的密钥进行哈希签名,再用SignTool完成标准代码签名格式封装:
- 下载证书公钥到本地证书存储(仅需公钥,私钥留在HSM):
az keyvault certificate download --name <cert-name> --hsm-name <your-hsm-name> --file cert.pfx --password "" certutil -addstore MY cert.pfx - 对文件哈希进行签名:
az keyvault key sign --name <cert-name> --hsm-name <your-hsm-name> --algorithm RSASSA-PSS --digest SHA256 --input-file <待签名文件.exe> --output-file signature.bin - 附加签名到文件:
signtool sign /fd SHA256 /a /s MY /n "<证书主题名称>" /t "http://timestamp.digicert.com" /dg signature.bin <待签名文件.exe>
方案3:使用HashiCorp Vault(适用于已有Vault环境)
配置HashiCorp Vault将Azure Managed HSM作为密钥后端,利用Vault的代码签名插件完成签名,适合需要统一密钥管理的场景。
内容的提问来源于stack exchange,提问作者Niels Harremoes
相关产品推荐
相关产品推荐

