我正在开发一个项目,使用 TypeScript 中的 xml-crypto 包来签署 XML 文档。我的目标是对 XML 进行签名并在同一签名中包含对 KeyInfo 元素的引用。
这是我到目前为止所做的:
我已成功生成 XML 数据的签名。
但是,我遇到了两个主要问题:
the following xpath cannot be signed because it was not found: //*[local-name(.)='KeyInfo']
这是我当前的实现:
private localElemName: string;
private xmlBody: any;
private xmlBuilder = new XMLBuilder({
attributeNamePrefix: '@_',
ignoreAttributes: false,
format: true,
})
createDigitalSignature(xmlObj: any){
this.xmlBody = this.xmlBuilder.build(xmlObj)
this.localElemName = this.getKey(xmlObj)
let sig = new SignedXml({ privateKey: fs.readFileSync(path.join(__dirname, "..", "..", "certificates_keys", "BANK0201.key")),
publicCert: fs.readFileSync(path.join(__dirname, "..", "..", "certificates_keys", "BANK0201_TRANSPORT_TEST.pem"))
});
sig.addReference({
xpath: `//*[local-name(.)='${this.localElemName}']`,
isEmptyUri: true,
transforms: ["http://www.w3.org/2000/09/xmldsig#enveloped-signature","http://www.w3.org/TR/2001/REC-xml-c14n-20010315"],
digestAlgorithm: "http://www.w3.org/2001/04/xmlenc#sha256",
});
sig.canonicalizationAlgorithm = 'http://www.w3.org/TR/2001/REC-xml-c14n-20010315'
sig.signatureAlgorithm = 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256'
sig.keyInfoAttributes = {
'Id': '_8401036a-cd29-4f5b-a48a-9ecf4d515d98'
}
sig.getKeyInfoContent({
prefix: 'ds'
})
sig.computeSignature(this.xmlBody, {
prefix: "ds",
location: { reference: `//*[local-name(.)='${this.localElemName}']`, action: "after" },
});
sig.addReference({
xpath: `//*[local-name(.)='KeyInfo']`,
uri: '#_8401036a-cd29-4f5b-a48a-9ecf4d515d98',
transforms: ["http://www.w3.org/TR/2001/REC-xml-c14n-20010315"],
digestAlgorithm: 'http://www.w3.org/2001/04/xmlenc#sha256',
})
sig.computeSignature(sig.getSignedXml(), {
prefix: "ds",
location: { reference: `//*[local-name(.)='${this.localElemName}']`, action: "after" },
});
const xmlSigned = sig.getSignedXml()
return xmlSigned
}
getKey(xmlObj: xmlObject){
const key = Object.keys(xmlObj.Document).pop()
return key
}
问题:
任何指导或建议将不胜感激!
我尝试使用 xml-crypto 包对 XML 文档进行签名,然后在签名中添加对 KeyInfo 元素的引用。我希望创建一个有效的签名,其中包含对 KeyInfo 的引用。
但是,在添加引用时,我遇到了 XPath 错误,指出找不到 KeyInfo 元素。此外,在添加引用后重新计算签名会导致相同的错误或导致将第二个不需要的签名附加到 XML。
根据这些问题和 PR 草案(于 2024 年 4 月 10 日左右创建):
如果没有对 xml-crypto 库进行额外的增强,这是不可能的。
顺便说一句。我知道这应该是评论,但我目前没有足够的声誉来添加评论。