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

使用C# SignedXml签名XML时证书组织名引号重复三次问题

解决C# SignedXml中X509SubjectName引号重复三次的问题

这个问题我之前也踩过坑,本质是双重转义搞的鬼:你的证书Subject里的组织名称带引号(比如O="BANK NAME"),而KeyInfoX509Data.AddSubjectName()方法会对传入的字符串再次进行XML转义,导致原有的引号被转义了两次,最终变成了三次引号的奇怪格式。

问题根源

当你获取certificate.Subject时,.NET已经把证书的X.500名称格式化为带转义的字符串(比如包含引号的属性值会显示为"BANK NAME")。而AddSubjectName()方法在处理这个字符串时,会把其中的"当作XML特殊字符再次转义成"——反映在XML文本里就是"""BANK NAME"""(因为"在XML中显示为")。

解决方案

核心思路是避免双重转义,直接传入符合RFC 2253标准的、不需要额外转义的主题名称。推荐用X500DistinguishedName类来处理,它能正确解析证书的原始名称格式:

// 从证书的SubjectName创建X500DistinguishedName实例
X500DistinguishedName dn = new X500DistinguishedName(certificate.SubjectName);

KeyInfoX509Data kiData = new KeyInfoX509Data(certificate);
// 使用GetName方法获取正确格式的主题名称,避免重复转义
kiData.AddSubjectName(dn.GetName(X500DistinguishedNameFlags.UseNewLines));

KeyInfo keyInfo = new KeyInfo();
keyInfo.AddClause(kiData);

如果上面的方法不适用,也可以手动处理Subject字符串,提前把引号转义成反斜杠加引号,让AddSubjectName()转义后得到正确的结果:

string correctedSubject = certificate.Subject.Replace("\"", "\\\"");
kiData.AddSubjectName(correctedSubject);

不过第一种方法更可靠,因为它直接基于证书的原始ASN.1数据解析,能适配各种复杂的X.500名称格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:33:21