X500DistinguishedName在带转义逗号的情况下不起作用
在 [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.DoNotUseQuotes 和 X500DistinguishedNameFlags.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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。