X500DistinguishedName在带转义逗号的情况下不起作用

后端开发 2026-07-11

在 [Distinguished Names] 页面,微软提供了两个示例。其中一个是:

CN=Litware,OU=Docs, Adatum,DC=Fabrikam,DC=COM

但如果我试着使用这个值来构造 X500DistinguishedName,就会抛出异常:

new X500DistinguishedName("CN=Litware,OU=Docs\\, Adatum,DC=Fabrikam,DC=COM");

System.Security.Cryptography.CryptographicException: '该字符串包含无效的X500名称属性键、OID、值或分隔符。'

我尝试使用 X500DistinguishedNameFlags.DoNotUseQuotesX500DistinguishedNameFlags.UseCommas,但都无济于事。是否可以用这个类型解析这类字符串表示?我还遇到过类似的字符串,而且我无法更改它们。

解决方案

X500DistinguishedName 的字符串构造函数会把值传递给 CertStrToNameW API,该API使用引号来在属性值中嵌入逗号,无论你使用的是哪一种 X500DistinguishedNameFlags。如果你在.NET 7+,X500DistinguishedNameBuilder 可以接受未转义的原始值

你可以像下面这样对字符串进行预处理:

string FixCommas(string input)
{
    var rdns = Regex.Split(input, @"(?<!\\),");
    var result = rdns.Select(rdn =>
    {
        if (!rdn.Contains(@"\,")) return rdn;
        var eqIndex = rdn.IndexOf('=');
        var attrKey = rdn[..eqIndex].Trim();
        var attrVal = rdn[(eqIndex + 1)..].Trim().Replace(@"\,", ",");
        return $"{attrKey}=\"{attrVal}\"";
    });
    return string.Join(",", result);
}

var dn = new X500DistinguishedName(
    FixCommas(@"CN=Litware,OU=Docs\, Adatum,DC=Fabrikam,DC=COM"));
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章