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

XML验证报错:MaintenanceDeliveryConfirmationResponse校验失败

问题描述

我有一份XML文件始终无法通过验证,每次执行校验都会返回错误,错误信息参考截图:
XML verification error

待校验的文件完整代码如下:

<?xml version="1.0" encoding="utf-8"?>
<MaintenanceDeliveryConfirmationResponse
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<OwnerId>31</OwnerId>
<ConfirmationDate>2022-06-20</ConfirmationDate>
<Code></Code>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /><SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" /><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"><InclusiveNamespaces PrefixList="ds saml2 saml2p xenc" xmlns="http://www.w3.org/2001/10/xml-exc-c14n#" /></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
<DigestValue></DigestValue>
</Reference>
</SignedInfo>
<SignatureValue></SignatureValue>
<KeyInfo>
<X509Data>
<X509Certificate></X509Certificate>
</X509Data>
</KeyInfo>
</Signature>
</MaintenanceDeliveryConfirmationResponse>
验证失败原因定位
  • 根节点缺失目标命名空间声明:当前根节点MaintenanceDeliveryConfirmationResponse及其直属子节点OwnerId、ConfirmationDate、Code都没有绑定任何命名空间,和校验用XSD Schema定义的目标命名空间不匹配,会直接触发结构校验错误。
  • 引用的命名空间前缀未绑定:InclusiveNamespaces节点的PrefixList属性中声明了ds、saml2、saml2p、xenc四个前缀,但整个XML文档中从未声明这些前缀对应的命名空间,违反XML命名空间规范。
  • 必填节点为空值:Code、DigestValue、SignatureValue、X509Certificate节点都是空标签,只要XSD中定义这些节点为必填项、或要求内容符合特定格式(比如签名值、证书要求为合法Base64编码),空值就会触发校验失败。
  • 签名结构无效:当前XML中的XMLDsig签名块所有有效值都为空,既没有计算生成的内容摘要,也没有实际签名结果和对应公钥证书,若校验规则包含签名有效性检查,必然无法通过。
修复方案
  • 补全命名空间声明:
    1. 按照对接接口的XSD要求,给根节点添加对应的默认命名空间声明,替换示例中的占位符为实际业务命名空间即可:
    <MaintenanceDeliveryConfirmationResponse
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     xmlns="替换为业务接口要求的目标命名空间">
    
    1. 处理前缀绑定问题:如果签名场景确实需要兼容SAML、XENC相关命名空间,在根节点补全对应前缀的命名空间声明;如果不需要用到这些前缀,直接把PrefixList属性里多余的ds saml2 saml2p xenc值删掉,只保留文档实际使用的前缀。
  • 填充业务字段内容:按照接口规则给Code节点填入符合要求的合法状态码,禁止留空。
  • 生成合法的XML数字签名:
    1. 按照选定的规范化规则(此处为独占XML规范化c14n)处理待签名的XML内容
    2. 用SHA256算法计算待签名内容的摘要,将Base64编码后的摘要值填入DigestValue节点
    3. 使用对接要求的RSA私钥对摘要做签名,将Base64编码后的签名结果填入SignatureValue节点
    4. 把签名对应的X509公钥证书去掉头尾BEGIN/END标记、删除所有换行后,填入X509Certificate节点
  • 完成上述修改后,先做XML基础格式校验,再用对接方提供的XSD做结构校验,最后验证签名有效性即可通过校验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 14:54:38