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

如何将XAdES-T时间戳响应(TSR)正确附加到已签名XML文件中

XAdES-T 时间戳嵌入XML签名的正确实现方式

核心问题说明

你当前的签名结构仅包含基础XMLDSIG节点,既未按照XAdES规范加入扩展属性节点,也存在时间戳请求输入错误、基础签名字段缺失的问题,是验证失败的核心原因。

正确实现步骤

1. 先完成合法的基础XMLDSIG签名

  • 补全<ds:Reference>节点下的<ds:DigestValue>值:对原始XML做enveloped-signature转换、exc-c14n规范化后计算SHA256哈希,base64编码后填入
  • 确保<ds:SignatureValue>值为对<ds:SignedInfo>节点做exc-c14n规范化后,用私钥做RSA-SHA256签名的结果,禁止混入时间戳相关内容
  • 给<ds:SignatureValue>添加唯一ID属性,示例:<ds:SignatureValue Id="sig-val-001">

2. 生成符合要求的时间戳请求

不要直接用原始XML的哈希生成TSQ,正确的输入生成逻辑:

  • 对已经生成的、带ID属性的<ds:SignatureValue>完整元素,使用和签名一致的exc-c14n算法做规范化处理
  • 对规范化后的字节流计算SHA256哈希,用该哈希生成TSQ请求提交给时间戳机构
  • 仅使用机构返回的base64编码的完整TSR响应内容,Unix时间戳格式的返回值无需使用

3. 构造XAdES扩展节点嵌入签名

需要先声明XAdES命名空间,在<ds:Signature>节点内追加<ds:Object>节点,存放XAdES合规属性,完整结构示例如下:

<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
              xmlns:xades="http://uri.etsi.org/01903/v1.3.2#">
    <ds:SignedInfo>
        <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
        <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
        <ds:Reference>
            <ds:Transforms>
                <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
            </ds:Transforms>
            <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
            <ds:DigestValue>【此处填原始XML的哈希base64值】</ds:DigestValue>
        </ds:Reference>
        <!-- 新增XAdES SignedProperties引用,必须加否则签名不合法 -->
        <ds:Reference Type="http://uri.etsi.org/01903/v1.3.2#SignedProperties"
                      URI="#signed-props-001">
            <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
            <ds:DigestValue>【此处填SignedProperties节点的哈希base64值】</ds:DigestValue>
        </ds:Reference>
    </ds:SignedInfo>
    <ds:SignatureValue Id="sig-val-001">【此处填基础签名的结果base64值】</ds:SignatureValue>
    <ds:KeyInfo>
        <!-- 此处填签名证书相关内容,可选但建议补充 -->
    </ds:KeyInfo>
    <ds:Object>
        <xades:QualifyingProperties Target="#sig-val-001">
            <xades:SignedProperties Id="signed-props-001">
                <!-- 此处可补充签名时间、签名者身份等XAdES基础属性 -->
                <xades:SignedSignatureProperties>
                    <xades:SigningTime>【格式示例:2024-05-20T12:34:56Z】</xades:SigningTime>
                </xades:SignedSignatureProperties>
            </xades:SignedProperties>
            <xades:UnsignedProperties>
                <xades:UnsignedSignatureProperties>
                    <xades:SignatureTimeStamp Id="ts-001">
                        <xades:HashDataInfo URI="#sig-val-001">
                            <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                        </xades:HashDataInfo>
                        <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
                        <xades:EncapsulatedTimeStamp>【此处填FreeTSA返回的base64格式TSR内容】</xades:EncapsulatedTimeStamp>
                    </xades:SignatureTimeStamp>
                </xades:UnsignedSignatureProperties>
            </xades:UnsignedProperties>
        </xades:QualifyingProperties>
    </ds:Object>
</ds:Signature>

常见验证失败排查点

  • 基础签名的SignedInfo节点必须包含对SignedProperties的Reference引用,否则XAdES签名会被判定为无效
  • 所有哈希计算的输入必须是对应节点经过exc-c14n规范化后的字节流,不能直接用原始文本计算哈希
  • 时间戳必须封装在EncapsulatedTimeStamp节点内,禁止直接写入时间字符串

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 06:18:04