使用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
相关产品推荐
相关产品推荐

