提问者:小点点

使用XAdES-T时间戳响应(TSR)附加XML


对于一个项目,XML文件是动态生成的,一段时间后,这些XML文件需要使用XAdES-T协议进行签名,签名必须包含在XML文件中。

为此,我从XML文件生成一个时间戳查询(TSQ)。它是基于XML文件的SHA256哈希创建的。之后,我将TSQ发送给FreeTSA(时间戳权威)。响应由两个元素组成:

  • 响应字符串(string/base64编码)
  • 响应时间(整数/unix时间)

现在困难的部分来了。签名必须使用dsig: Signature包含在XML中。基于W3留档:

  • SignatureTimeStamp将时间戳封装在ds: SignatureValue元素上。
  • SignatureTimeStamp元素包含一个HashDataInfo元素,该元素引用[XMLDSIG]签名的ds: SignatureValue元素。也就是说,时间戳哈希计算的输入是ds:SignatureValueXML元素。

我尝试了以下XML:

<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <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></ds:DigestValue>
            </ds:Reference>
        </ds:SignedInfo>
        <ds:SignatureValue>
       MIIFUDADAgEAMIIFRwYJKoZIhvcNAQcCoIIFODCCBTQCAQMxDzANBglghkgBZQMEAgMFADCCAY4GCyqGSIb3DQEJEAEEoIIBfQSCAXkwggF1AgEBBgQqAwQBMDEwDQYJYIZIAWUDBAIBBQAEIHY4mbyU5g4mM3CRUjMSjILz19kk0jYmuoZSCI6hnXQqAgQAzfxZGA8yMDIxMDgyNTExMzcwN1oBAf8CCHdmnjv+m4i4oIIBEaSCAQ0wggEJMREwDwYDVQQKEwhGcmVlIFRTQTEMMAoGA1UECxMDVFNBMXYwdAYDVQQNE21UaGlzIGNlcnRpZmljYXRlIGRpZ2l0YWxseSBzaWducyBkb2N1bWVudHMgYW5kIHRpbWUgc3RhbXAgcmVxdWVzdHMgbWFkZSB1c2luZyB0aGUgZnJlZXRzYS5vcmcgb25saW5lIHNlcnZpY2VzMRgwFgYDVQQDEw93d3cuZnJlZXRzYS5vcmcxIjAgBgkqhkiG9w0BCQEWE2J1c2lsZXphc0BnbWFpbC5jb20xEjAQBgNVBAcTCVd1ZXJ6YnVyZzELMAkGA1UEBhMCREUxDzANBgNVBAgTBkJheWVybjGCA4owggOGAgEBMIGjMIGVMREwDwYDVQQKEwhGcmVlIFRTQTEQMA4GA1UECxMHUm9vdCBDQTEYMBYGA1UEAxMPd3d3LmZyZWV0c2Eub3JnMSIwIAYJKoZIhvcNAQkBFhNidXNpbGV6YXNAZ21haWwuY29tMRIwEAYDVQQHEwlXdWVyemJ1cmcxDzANBgNVBAgTBkJheWVybjELMAkGA1UEBhMCREUCCQDB6YYWDajpgjANBglghkgBZQMEAgMFAKCBuDAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTIxMDgyNTExMzcwN1owKwYLKoZIhvcNAQkQAgwxHDAaMBgwFgQUkW2j2GDsyoLjS8WdF5Pn6WiHXxQwTwYJKoZIhvcNAQkEMUIEQOATishRq9feRvKy8q5CwPKviUzDLCEu81s7MeGTCrx/mQtcOaGfuSpLefXVXOq1ckfsaxlvY5aZQkW3uaKTDkcwDQYJKoZIhvcNAQEBBQAEggIAjjHuobwvxwLKdnvRO6YAOWm0JuJ3AU5wXlgZUwYw9hMkQmGyXz+ky2+WvMa4k9OQji+zX4G9xGXzxQg7qLNYkMd+Cfd86eSMqLoTJEatijgDUwdxq0u5JbWUq8RpTjAQFm4mswzg3sbEvsU1y58LJPKRZ0WekKTbBAFjCm4FyH17aWiPh1JS96Tm1on+xhWaoMXJNAyLbguLrQB2TsNQFL19y2wjqCOuomfm4bN/jyeSazmvVH+l8ye1A5xejXx2Lv81w7W1zbrSi7v1/ywnq3utKeMdcqKgLC99jN0ErQkBIhCuP4JvGO5mW/CgQPb+qBWISPgAOBLaYi72204+zl0pTZdpKKNLJaMr6gJFkDIF+ZHmieE5yR9aiQ7SWYYLdEcq5tC8yZjgFJxxyEdxXpBqyp3PkMciBTEeUyRfBlnnP1O+Oe8unqLceGrH/1H4WniDJUXZvra/jLx3T3IdknGn1swHdNMrLETK2vPd646wZfsKTSOqjbzi5ljrS03FsElhxujcrwjGLOs1l/EyAIM0an1lroHnu5n2MH5KLMvPJqjLIqn0jEsxXk8JU+kpqUpcTaTKq24VbvqYO/WeyfD1t2t9ExhPgxAaBf6lm9R7AdbxpWJTl0rP4h3YMq/h5z2U2TYAYXQ3aiXQZR0VvUJbPI22thftdhsNDC0v+fU=
        </ds:SignatureValue>
    </ds:Signature>

但是状态(根据这个网站)总是“无效”。

将时间戳响应附加到XML文件的正确方法是什么?


共2个答案

匿名用户

我是一个用于创建和验证电子签名的开源项目的开发人员。

您的签名中的问题是您的签名包含一个ds:引用,而不是引用任何内容。它应该引用签名文件或分离文档中的一个元素。ds: DigestValue元素应该包含应用转换后引用内容的摘要。

对于一个简单的XMLDSig签名,您可以熟悉研究本规范。

有关电子签名的扩展信息,包括高级和合格的电子签名,您可以查看留档。该项目Java,但留档包含许多关于签名和可用格式以及创建它的方法的通用信息。

匿名用户

PHP使用Xade文档的最佳解决方案是:https://github.com/bseddon/xml-signer

为PHP提供XML文档的签名和验证,重点是支持符合XAdES规范的签名。

我已经用LTA和时间戳签署了一个xml。它非常简单且有据可查!

感谢@bseddon!