我需要在 NodeJS 中创建一个逻辑,允许对通信 SOAP 进行签名和加密 XML。
在标签标头中,其内容中应包含哪些值
<soap:Header>
<wsse:Security>
<ds:DigestValue>
<ds:Signature>
<ds:SignedInfo>
<ds:Reference>
<ds:DigestValue>...</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:KeyInfo>
<wsse:SecurityTokenReference>
<wsse:KeyIdentifier>...</wsse:KeyIdentifier>
</wsse:SecurityTokenReference>
</ds:KeyInfo>
<ds:SignatureValue>...</ds:SignatureValue>
</ds:Signature>
</wsse:Security>
</soap:Header>
如何了解每个标签的含义或者如何在 NodeJS 中为这些标签生成相应的内容?
我试过这个
对于
DigestValue
:
function calculateDigest(xmlContent) {
const hash = crypto.createHash('sha256');
hash.update(xmlContent);
return hash.digest('base64');
}
对于
SignatureValue
:
function signDigest(digest, privateKey) {
const signer = crypto.createSign('RSA-SHA256');
signer.update(digest);
return signer.sign(privateKey, 'base64');
}
对于
KeyIdentifier
:
function generateKeyIdentifier(certPem) {
const certDer = Buffer.from(certPem.replace(/(-----(BEGIN|END) CERTIFICATE-----|\n)/g, ''), 'base64');
return crypto.createHash('sha256').update(certDer).digest('base64');
}
它可以工作,但我不确定,因为外部服务器给了我一个 500 错误
很难详细说明,因为这完全取决于您的需求以及您需要使用的加密、摘要和转换算法。在过去的几个月里,我不得不自己处理 XML 加密和签名问题。对我最有用的资源如下:
xmlenc:W3C 的“XML 加密语法和处理版本 1.1”标准。本文档非常详细地描述了如何执行 XML 加密。这是确保加密互操作性必须遵循的标准。
xmldsig:W3C 的“XML 签名语法和处理版本 1.1”标准。与之前的资源相同,但用于 XML 签名。
xml-crypto:一个可以处理 XML 签名的 NPM 包。它支持许多算法,我目前正在使用它来签署我自己的文档。
xml-加密:提供 xmlenc 实现的 NPM 包。这是一个相当旧的库,我实际上并没有使用,但是浏览代码并了解它如何处理 XML 加密对于弄清楚如何实现我自己的加密功能非常有帮助。
node-forge:一个 NPM 包,是 NodeJS 中内置加密模块的替代品。如果你的功能可以用普通加密来实现,我会避免使用它,但它似乎确实有一些目前加密 API 不支持的功能,所以如果你遇到困难,值得看看它
soap:处理 SOAP 的 NPM 包。我没有将 SOAP 用于我自己的解决方案,因此我的理解有限,但我认为这是最流行的 SOAP 包。