如何在 saml2-js 中指定私钥的密码?

How do I specify the passphrase for a private key in saml2-js?

我在 saml-passport 中看到了执行此操作的选项,但我已经使用 saml2-js 进行了设置。我的 key/cert 有一个必需的密码,否则我会收到错误的解密错误。是否可以设置此密码?

这是 SP 选项

var sp_options = {
  entity_id: "/startpoint",
  private_key: fs.readFileSync(`${dir}src/certs/key.pem`).toString(),
  certificate: fs.readFileSync(`${dir}src/certs/cert.pem`).toString(),
  assert_endpoint: '/assert',
  sign_get_request: true
}
var sp = new saml2.ServiceProvider(sp_options)

我希望在 private_key 键下有一个键 'passphrase' 但没有文档中指定的键。

通过查看该库中的代码,它看起来并不具备处理受密码保护的证书的逻辑。

一种选择是删除密码,方法是:

openssl rsa -in key.pem -out key_nopass.pem

系统将提示您再次输入密码。新创建的文件 key_nopass.pem 不需要密码。

您的 saml 模块似乎无法处理 crt/pem 的密码。

你可以在npm上搜索另一个可以处理它的saml模块,我暂时没有找到

您或许可以使用 openssl 包装器/加密包装器手动管理 pem 的解密,但我可能相当复杂。

否则,John Cruz 似乎是无代码解决方案的最佳选择。

如果您想手动完成,您的加密 PEM 包括:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,05E1DB4ACD187787

其中显示了您使用的加密算法,此处为:des-ede3-cbc,以及十六进制格式的密码 IV,此处为 05E1DB4ACD187787

然后你有你的base64加密数据:

2rtyxqlZg/ROAHQRnYyHDpkdk9rgYVhsNrGdBzEySzUG+LRwTU/Z+ihSTKK0f2yj
Zpn/qOsXwq4IS6XOb+Q8M5AAbE7t3jKI14YDAvDK/jQpBLk907oxFqeNte3Qvmrm
OjzHJS/P1JXef4dByhrjlrdL/pNV9ov5dM8cyVcxRUbW6cNapXoSrlXrmNPM....

使用节点加密模块,您现在可以处理解密:

const cipher = crypto.createDecipheriv('DES-EDE3-CBC', Buffer.from(secretKeyHex, "hex"), Buffer.from(ivHex, "hex"));
let c = cipher.update(encryptedPemBase64, 'base64','base64')
c += cipher.final('base64');

请注意,密钥必须具有特定长度,具体取决于所使用的算法

如果您的密钥是“静态”的,这很容易,如果您必须处理大量算法,则可能会很棘手