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

Duende IdentityServer用ECDSA证书签令牌遇IDX10634错误的解决咨询

解决Duende IdentityServer使用ECDSA证书签名令牌时的IDX10634异常

问题原因

当调用builder.AddSigningCredential(cert, SecurityAlgorithms.EcdsaSha256)时,底层使用的X509SecurityKey无法被Microsoft.IdentityModel.Tokens的CryptoProviderFactory正确适配ES256算法,导致抛出"IDX10634"不支持异常。若直接提取ECDSA私钥创建ECDsaSecurityKey,则会丢失令牌头中的x5t字段(该字段由证书元数据生成)。

解决方案

方案1:手动构造包含x5t字段的签名凭证

从证书提取ECDSA私钥后,手动添加x5t头部声明,确保令牌头保留该字段:

using Microsoft.IdentityModel.Tokens;
using System.Security.Cryptography.X509Certificates;

// 加载ECDSA证书
var cert = new X509Certificate2("your-cert-path.pfx", "cert-password");

// 提取ECDSA私钥
var ecdsaPrivateKey = cert.GetECDsaPrivateKey() 
    ?? throw new InvalidOperationException("证书不包含有效ECDSA私钥");

// 创建ECDsaSecurityKey,设置KeyId为证书缩略图
var ecdsaKey = new ECDsaSecurityKey(ecdsaPrivateKey)
{
    KeyId = cert.Thumbprint
};

// 计算x5t值(Base64URL编码的证书SHA-1哈希)
var x5t = Base64UrlEncoder.Encode(cert.GetCertHash());

// 构造签名凭证并添加x5t头部
var signingCreds = new SigningCredentials(
    ecdsaKey, 
    IdentityServerConstants.ECDsaSigningAlgorithm.ES256)
{
    AdditionalHeaderClaims = new Dictionary<string, object>
    {
        { "x5t", x5t }
    }
};

// 添加到IdentityServer
builder.AddSigningCredential(signingCreds);

方案2:升级依赖包

旧版本的Microsoft.IdentityModel.Tokens或Duende.IdentityServer可能存在ECDSA支持的兼容性问题。升级到最新稳定版本(建议Microsoft.IdentityModel.Tokens 6.20+、Duende.IdentityServer 6.x+)后,可直接使用原有代码:

builder.AddSigningCredential(cert, SecurityAlgorithms.EcdsaSha256);

升级后,底层会自动识别证书中的ECDSA密钥,支持ES256算法的同时保留x5t字段。

说明

  • 方案1适用于无法升级依赖包的场景,完全手动控制令牌头内容;
  • 方案2为官方推荐方式,通过依赖升级解决兼容性问题,实现更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 16:57:27