如何为Duende Identity Server v7使用RSA密钥?遇加密异常求助
解决Duende Identity Server v7配置Azure Key Vault RSA密钥时的加密异常
错误原因分析
异常System.Security.Cryptography.CryptographicException: Unknown error (0xc100000d)的核心原因是用于签名的密钥没有私钥或私钥不可访问:
- 第一种密钥配置方式中,通过
KeyClient.GetKey()获取的KeyVaultKey仅包含公钥参数(Modulus和Exponent),无有效私钥,无法完成JWT签名操作。 - 第二种证书配置方式中,
certificate.Cer仅提取了证书的公钥部分,缺少私钥,导致签名失败。
正确解决方案
方案1:直接集成Azure Key Vault密钥(官方推荐)
Duende Identity Server提供了官方Azure Key Vault集成扩展,无需手动转换密钥,私钥将保留在Key Vault中通过API调用完成签名:
首先安装对应NuGet包:
Install-Package Duende.IdentityServer.AzureKeyVault
配置代码示例:
string keyVaultUrl = Configuration.GetValue<string>("AzureSettings:KeyVaultUrl"); string keyName = Configuration.GetSection("IdentityServer:Key")["Name"]; var client = new KeyClient(new Uri(keyVaultUrl), new DefaultAzureCredential()); var key = await client.GetKeyAsync(keyName); identityServiceBuild.AddAzureKeyVault(key.Value, client);
方案2:使用Azure Key Vault中带私钥的证书
若需使用证书,必须获取包含私钥的完整证书实例,而非仅提取公钥部分:
string keyVaultUrl = Configuration.GetValue<string>("AzureSettings:KeyVaultUrl"); var certClient = new CertificateClient(new Uri(keyVaultUrl), new DefaultAzureCredential()); // 直接通过证书客户端加载带私钥的证书 identityServiceBuild.AddSigningCredential(certClient, "duendeidentityserverv7");
也可手动处理证书与私钥的关联:
string keyVaultUrl = Configuration.GetValue<string>("AzureSettings:KeyVaultUrl"); var certClient = new CertificateClient(new Uri(keyVaultUrl), new DefaultAzureCredential()); var keyClient = new KeyClient(new Uri(keyVaultUrl), new DefaultAzureCredential()); var certWithPolicy = await certClient.GetCertificateAsync("duendeidentityserverv7"); var key = await keyClient.GetKeyAsync(certWithPolicy.KeyId); // 创建包含私钥的X509证书实例 var rsa = key.Value.Key.ToRSA(); var certBytes = certWithPolicy.Cer; var cert = new X509Certificate2(certBytes); cert = cert.CopyWithPrivateKey(rsa); identityServiceBuild.AddSigningCredential(cert);
关键注意事项
- 确保Azure托管标识(或服务主体)拥有Azure Key Vault的Key Sign(密钥场景)或Certificate Sign(证书场景)权限。
- 禁止手动提取公钥创建
RsaSecurityKey,此类操作会丢失私钥的有效访问路径。 - 使用官方集成扩展可避免手动处理密钥转换的各类错误。
内容的提问来源于stack exchange,提问作者Andrew Duffy
相关产品推荐
相关产品推荐

