如何在 TypeScript 中使用 xml-crypto 在 XML 签名中添加对 KeyInfo 的引用?

问题描述 投票:0回答:1

我正在开发一个项目,使用 TypeScript 中的 xml-crypto 包来签署 XML 文档。我的目标是对 XML 进行签名并在同一签名中包含对 KeyInfo 元素的引用。

这是我到目前为止所做的:

我已成功生成 XML 数据的签名。

但是,我遇到了两个主要问题:

  1. 使用 XPath 添加密钥信息引用:当我尝试使用 XPath 添加对 KeyInfo 元素的引用时,收到以下错误:
    the following xpath cannot be signed because it was not found: //*[local-name(.)='KeyInfo']
  2. 重新计算签名:我尝试先计算签名,然后添加对 KeyInfo 元素的引用,要么导致上述错误,要么将第二个签名附加到已签名的 XML 中,这不是期望的结果

这是我当前的实现:

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
    }

问题:

  1. 如何正确添加对 KeyInfo 元素的引用而不会遇到 XPath 错误?
  2. 是否有正确的方法来重新计算签名以包含对 KeyInfo 的引用而不附加第二个签名?

任何指导或建议将不胜感激!

我尝试使用 xml-crypto 包对 XML 文档进行签名,然后在签名中添加对 KeyInfo 元素的引用。我希望创建一个有效的签名,其中包含对 KeyInfo 的引用。

但是,在添加引用时,我遇到了 XPath 错误,指出找不到 KeyInfo 元素。此外,在添加引用后重新计算签名会导致相同的错误或导致将第二个不需要的签名附加到 XML。

typescript xml xpath xml-signature xml-crypto
1个回答
0
投票

根据这些问题和 PR 草案(于 2024 年 4 月 10 日左右创建):

  1. https://github.com/node-saml/xml-crypto/issues/463
  2. https://github.com/node-saml/xml-crypto/pull/464

如果没有对 xml-crypto 库进行额外的增强,这是不可能的。

顺便说一句。我知道这应该是评论,但我目前没有足够的声誉来添加评论。

© www.soinside.com 2019 - 2024. All rights reserved.