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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 10:33:12