0

0

C#如何使用SignedXml类签名XML文档

月夜之吻

月夜之吻

发布时间:2026-01-07 09:33:08

|

959人浏览过

|

来源于php中文网

原创

SignedXml.ComputeSignature() 仅计算签名不自动插入,需手动调用 GetXml() 获取 Signature 节点并用 ImportNode 和 AppendChild 添加到文档;默认算法为不安全的 RSA-SHA1,应显式设为 RSA-SHA256;签名 XML 片段需用 Uri="#id" 和 XmlDsigEnvelopedSignatureTransform;验证失败多因变换不一致、空白处理差异或密钥不匹配。

c#如何使用signedxml类签名xml文档

为什么 SignedXml.ComputeSignature() 签名后 GetXml() 拿不到 节点?

因为 SignedXml.ComputeSignature() 只执行签名计算,不自动把生成的 插入原始文档。必须手动调用 SignedXml.GetXml() 获取签名节点,再用 Document.ImportNode()Document.DocumentElement.AppendChild() 显式追加。

常见错误是直接保存原始 XmlDocument,结果 XML 里完全没签名内容。

  • 必须用 doc.ImportNode(signatureNode, true) 导入节点(否则跨文档操作会抛 System.ArgumentException
  • SignedXml.Signature.Id 默认为 null,如果后续要引用该签名(如 Reference URI="#id"),需提前设值
  • 签名前确保文档已格式化(PreserveWhitespace = false),否则空白差异会导致验证失败

如何指定签名算法和摘要方法?

SignedXml 默认使用 http://www.w3.org/2000/09/xmldsig#rsa-sha1(SHA-1 + RSA),但 SHA-1 已不安全。必须显式设置更安全的组合:

signedXml.SignedInfo.SignatureMethod = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256";
signedXml.SignedInfo.DigestMethod = "http://www.w3.org/2001/04/xmlenc#sha256";

注意:DigestMethod 影响所有 Reference 的摘要计算;SignatureMethod 仅影响最终签名值生成。两者必须与密钥类型匹配(RSA 密钥不能配 ECDSA 算法)。

  • SHA-256 是当前推荐的最小安全基线,避免使用 SHA1MD5
  • .NET Framework 4.7.2+ 和 .NET Core 2.1+ 支持 sha384/sha512,但需确认下游系统兼容性
  • 若用证书私钥签名,从 X509Certificate2.PrivateKey 获取时,需确保证书含私钥且未标记为“不可导出”

如何对 XML 片段(而非整个文档)签名?

Reference.Uri 指向带 Id 属性的元素,例如签名 ...

Procys
Procys

AI驱动的发票数据处理

下载
var reference = new Reference { Uri = "#payload" };
reference.AddTransform(new XmlDsigEnvelopedSignatureTransform());
signedXml.AddReference(reference);

关键点在于:XmlDsigEnvelopedSignatureTransform 必须添加,否则签名时会把 自身也纳入摘要计算,导致验证永远失败。

  • Uri 值必须以 # 开头,且目标元素必须有 Id 属性(不是 id 或其他名称)
  • 若目标元素在命名空间中,Id 属性需声明为 xml:id 并注册 XmlNamespaceManager,否则 SignedXml 找不到它
  • 避免对动态生成的节点签名——节点未加入文档树前,GetIdElement() 内部查找会返回 null

验证签名时常见的 CryptographicException 原因

验证失败抛 CryptographicException 通常不是算法错,而是上下文不一致:

  • 签名时用了 EnvelopedSignature 变换,验证时没加 —— 验证代码也得调用 reference.AddTransform(new XmlDsigEnvelopedSignatureTransform())
  • XML 文档加载时 XmlDocument.PreserveWhitespace = true,签名和验证两端空白处理不一致
  • 证书公钥与签名所用私钥不匹配(例如用了证书链中的中间证书而非签名证书本身)
  • .NET 运行时版本差异:旧版默认用 SHA-1,新版可能拒绝弱算法,需在 app.config 中启用兼容模式(不推荐,应改代码)

最稳妥的验证方式是用 SignedXml.CheckSignature(certificate.PublicKey.Key) 显式传入公钥,绕过证书链验证逻辑。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

231

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

435

2024.03.01

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1861

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2084

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

959

2024.11.28

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

394

2023.08.14

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

303

2023.11.09

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

396

2023.11.14

C++ 高性能计算与并行编程
C++ 高性能计算与并行编程

本专题专注于 C++ 在高性能计算(HPC)与并行编程中的应用,涵盖多线程、并发数据处理、OpenMP、MPI、GPU加速等技术。通过实际案例,帮助开发者掌握 如何利用 C++ 进行大规模数据计算和并行处理,提高程序的执行效率,适应高性能计算与数据密集型应用场景。

5

2026.01.08

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
HTML5/CSS3/JavaScript/ES6入门课程
HTML5/CSS3/JavaScript/ES6入门课程

共102课时 | 6.6万人学习

前端基础到实战(HTML5+CSS3+ES6+NPM)
前端基础到实战(HTML5+CSS3+ES6+NPM)

共162课时 | 18.6万人学习

第二十二期_前端开发
第二十二期_前端开发

共119课时 | 12.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号