在 JavaScript 中为 SOAP 服务对 XML 进行签名和加密

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

我需要在 JavaScript 中创建一个逻辑,允许对通信 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>

如何了解每个标签的含义,或者如何在 JavaScript 中为这些标签生成相应的内容?

我试过这个

对于摘要值

function calculateDigest(xmlContent) {
    const hash = crypto.createHash('sha256');
    hash.update(xmlContent);
    return hash.digest('base64');
}

对于签名值


function signDigest(digest, privateKey) {
  const signer = crypto.createSign('RSA-SHA256');
  signer.update(digest);
  return signer.sign(privateKey, 'base64');
}

对于密钥标识符

function generateKeyIdentifier(certPem) {
  const certDer = Buffer.from(certPem.replace(/(-----(BEGIN|END) CERTIFICATE-----|\n)/g, ''), 'base64');
  return crypto.createHash('sha256').update(certDer).digest('base64');
}

它可以工作,但我不确定,因为外部服务器给了我一个 500 错误

javascript xml encryption soap digital-signature
1个回答
0
投票

很难详细说明,因为这完全取决于您的需求以及您需要使用的加密、摘要和转换算法。在过去的几个月里,我不得不自己处理 XML 加密和签名问题。对我最有用的资源如下:

xml-crypto:一个可以处理 XML 签名的 NPM 包。它支持许多算法,我目前正在使用它来签署我自己的文档。

xml-加密:提供 xmlenc 实现的 NPM 包。这是一个相当旧的库,我实际上并没有使用,但是浏览代码并了解它如何处理 XML 加密对于弄清楚如何实现我自己的加密功能非常有帮助。

node-forge:一个 NPM 包,是 NodeJS 中内置加密模块的替代品。如果你的功能可以用普通加密来实现,我会避免使用它,但它似乎确实有一些目前加密 API 不支持的功能,所以如果你遇到困难,值得看看它

xmlenc:W3C 的“XML 加密语法和处理版本 1.1”标准。本文档非常详细地描述了如何执行 XML 加密。这是确保加密互操作性必须遵循的标准。

xmldsig:W3C 的“XML 签名语法和处理版本 1.1”标准。与之前的资源相同,但用于 XML 签名。

soap:处理 SOAP 的 NPM 包。我没有将 SOAP 用于我自己的解决方案,因此我的理解有限,但我认为这是最流行的 SOAP 包。

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