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

ZATCA电子发票SignedProperties签名属性哈希验证失败求助(已遵循缩进规则仍报错)

ZATCA电子发票SignedProperties签名属性哈希验证失败求助(已遵循缩进规则仍报错)

我之前在对接ZATCA电子发票签名的时候,完完全全碰到过和你一样的坑!当时对着社区的缩进要求改了N遍,还是报signed-properties-hashing这个错误,折腾了大半天终于找到几个容易被忽略的关键点,分享给你:

  • 严格遵守节点顺序与命名空间前缀:ZATCA对SignedProperties的结构要求极其严格,首先必须统一使用xades:作为节点前缀,不能自定义缩写;其次内部子节点的顺序绝对不能乱——必须按照SigningTime → SigningCertificate → SignaturePolicyIdentifier的顺序排列,哪怕内容完全正确,顺序错了哈希也会直接不匹配。我当时就是把SignaturePolicyIdentifier提前了,调完顺序就解决了一半问题。

  • 拒绝手动修改XML,用工具生成+规范化:手动调整缩进很容易引入隐形坑,比如混用工制表符和空格、用了CRLF换行(ZATCA要求必须是LF)、甚至不小心输入了全角空格。正确的做法是用专业XML库(比如Java的JAXB、Python的lxml)生成SignedProperties片段,再用ZATCA指定的XML规范化算法(通常是http://www.w3.org/TR/2001/REC-xml-c14n-20010315)对该节点做规范化处理,哈希必须基于规范化后的纯文本计算,不能用带格式的原始XML。

  • 确认哈希计算的节点范围:要确保签名代码只针对<xades:SignedProperties Id="xadesSignedProperties">整个节点(包括它本身的Id属性)计算哈希,既不能包含父节点的其他内容,也不能漏掉子节点的任何部分。我当时就是不小心把外层的<xades:UnsignedProperties>也包含进计算范围了,导致哈希完全偏离预期。

  • 检查属性细节:大小写与引号:注意错误提示里的id='xadesSignedProperties',ZATCA要求属性名是大写的Id(不是小写id),而且属性值的引号类型要统一(要么全用单引号,要么全用双引号,不能混着来)。我之前手滑写成了小写id,虽然XML解析没问题,但哈希验证直接失败。

给你个正确的SignedProperties结构参考,你可以对照检查:

<xades:SignedProperties Id="xadesSignedProperties">
  <xades:SignedSignatureProperties>
    <xades:SigningTime>2024-05-20T12:34:56Z</xades:SigningTime>
    <xades:SigningCertificate>
      <xades:Cert>
        <xades:CertDigest>
          <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc-sha256"/>
          <ds:DigestValue>abc123...</ds:DigestValue>
        </xades:CertDigest>
        <xades:IssuerSerial>
          <ds:X509IssuerName>CN=Your-Certificate-Issuer</ds:X509IssuerName>
          <ds:X509SerialNumber>123456789</ds:X509SerialNumber>
        </xades:IssuerSerial>
      </xades:Cert>
    </xades:SigningCertificate>
    <xades:SignaturePolicyIdentifier>
      <xades:SignaturePolicyId>
        <xades:SigPolicyId>
          <xades:Identifier>urn:zatca:electronic-invoice:policy:1.0</xades:Identifier>
          <xades:Description>ZATCA E-Invoice Signature Policy</xades:Description>
        </xades:SigPolicyId>
        <xades:SigPolicyHash>
          <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc-sha256"/>
          <ds:DigestValue>def456...</ds:DigestValue>
        </xades:SigPolicyHash>
      </xades:SignaturePolicyId>
    </xades:SignaturePolicyIdentifier>
  </xades:SignedSignatureProperties>
</xades:SignedProperties>

如果还是拿不准,可以把规范化后的SignedProperties文本复制出来,用SHA256工具计算哈希,和签名中的对应值对比:如果不一致,说明规范化或节点范围有问题;如果一致,那就是签名时哈希值的写入位置出错了。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 07:24:33