0

0

XML上传的数字签名验证 服务器端如何校验文件来源

幻夢星雲

幻夢星雲

发布时间:2026-02-07 08:03:09

|

619人浏览过

|

来源于php中文网

原创

XML签名验证前须先确认签名是否内嵌:若为enveloped需检查节点存在且ID属性(如Id)已注册;detached则需单独加载签名文件;验证后还需校验证书链、时间戳及防重放。

xml上传的数字签名验证 服务器端如何校验文件来源

XML签名验证前先确认签名是否内嵌在文档中

XML数字签名(XMLDSig)常见两种形式:一种是签名信息直接嵌入原始XML(enveloped signature),另一种是签名与XML分离(detached signature)。服务器端校验前必须先判断结构——否则 javax.xml.crypto.dsig.XMLSignature(Java)或 xmlsec1(命令行)会因找不到 节点而报 NullPointerExceptionSignature not found

  • 检查XML是否含 子树,且该节点在文档内(非外部引用)
  • 若签名在独立文件中(如 invoice.xml + invoice.xml.sig),需用 detached 模式加载,不能直接解析原XML
  • 注意命名空间前缀可能不是 ds(如 dsigxades),但URI必须匹配标准:http://www.w3.org/2000/09/xmldsig#

Java中用Apache Santuario验证enveloped签名要绕过默认ID解析陷阱

Java原生 XMLSignatureId 属性识别不敏感,默认只认 id 小写属性。而实际XML常使用 Id(首字母大写)或自定义属性名(如 xml:id)。若签名引用了 ,但验证时找不到该节点,就会失败。

  • 必须显式注册 IdAttribute:调用 signature.getElement().setIdAttribute("Id", true)
  • 若用 org.apache.santuario:xmlsec,推荐用 XMLSignatureInput 手动绑定被签名节点,避免依赖自动ID查找
  • 验证前务必调用 signature.validate(validateContext) 并检查返回的 boolean,不要只捕获异常——部分无效签名会静默通过
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(inputStream));
NodeList sigNodes = doc.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature");
if (sigNodes.getLength() == 0) throw new IllegalArgumentException("No Signature found");
XMLSignature signature = new XMLSignature((Element) sigNodes.item(0), "");
signature.getElement().setIdAttribute("Id", true); // 关键:声明Id属性可被引用
boolean isValid = signature.validate(new DOMValidateContext(publicKey, doc.getDocumentElement()));

Python用lxml和xmlsec命令行验证时证书链必须完整

仅提供签名者公钥(public.pem)不足以验证可信来源——服务器需确认该公钥所属证书是否由可信CA签发,且未被吊销。常见错误是只校验签名数学有效性,却忽略证书信任链。

SkyReels
SkyReels

SkyReels是全球首个融合3D引擎与生成式AI的AI视频创作平台

下载
  • xmlsec1 --verify --pubkey-pem public.pem document.xml 时,若证书含中间CA,必须把整个链拼成单个PEM(根CA在最后)
  • Python中用 lxml.etree.XMLSchema 配合 xmlsec 绑定,需提前调用 xmlsec.add_id_attribute 注册ID字段,否则 Reference URI="#abc" 解析失败
  • 若XML含 ,应提取其中 并用 openssl verify -CAfile ca-bundle.crt 单独验证其有效性,而非仅信签名中的证书

验证通过后仍需检查签名时间与业务时效性

XML签名本身不防重放——攻击者可截获一份有效签名的XML,反复提交。服务器端不能只看签名是否有效,必须结合业务上下文做二次判断。

  • 上游找 确保签名覆盖了整个文档(防篡改)
  • 若XML含 ,检查其中是否有 TimestampSigningTime,并与服务器当前时间比对(允许±5分钟误差)
  • 对高频接口,建议在验证后立即记录 digest(SignatureValue + CanonicalizedXML) 到Redis,TTL设为10分钟,防止重复提交

最易被忽略的是:签名验证成功 ≠ 文件来源可信。证书是否在吊销列表(CRL)里、是否超出有效期、是否被用于未授权用途(如用加密证书做签名),这些都得查。别让 isValid == true 成为唯一判断依据。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java中boolean的用法
java中boolean的用法

在Java中,boolean是一种基本数据类型,它只有两个可能的值:true和false。boolean类型经常用于条件测试,比如进行比较或者检查某个条件是否满足。想了解更多java中boolean的相关内容,可以阅读本专题下面的文章。

354

2023.11.13

java boolean类型
java boolean类型

本专题整合了java中boolean类型相关教程,阅读专题下面的文章了解更多详细内容。

34

2025.11.30

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

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

1915

2024.04.01

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

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

2098

2024.08.01

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

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

1103

2024.11.28

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1287

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

275

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2200

2025.12.29

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

2

2026.02.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.4万人学习

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

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