对于一个项目,XML 文件是动态生成的。一段时间后,需要使用XAdES-T协议对这些 XML 文件进行签名。签名必须包含在 XML 文件中。
为此,我从 XML 文件生成时间戳查询 (TSQ)。它是基于 XML 文件的 SHA256 哈希创建的。之后,我将 TSQ 发送给 FreeTSA(时间戳管理局)。响应由两个元素组成:
- 响应字符串(字符串/base64 编码)
- 响应时间(整数/unix 时间)
现在,困难的部分来了。签名必须包含在 XML 中,使用dsig:Signature
. 基于W3文档:
- SignatureTimeStamp 封装了 ds:SignatureValue 元素上的时间戳。
- SignatureTimeStamp 元素包含一个引用 [XMLDSIG] 签名的 ds:SignatureValue 元素的 HashDataInfo 元素。也就是说,时间戳哈希计算的输入是 ds:SignatureValue XML 元素。
我尝试了以下 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 文件的正确方法是什么?