【问题标题】:Using a passphrase protected private key with crypto.createSign将密码保护的私钥与 crypto.createSign 一起使用
【发布时间】:2012-08-06 08:57:27
【问题描述】:

我正在尝试使用 node.js 加密 API 和受密码保护的私钥对消息进行签名和验证,这让我得到以下信息:

> var sig = crypto.createSign('RSA-SHA256').update('psst').sign(pk,'hex');
Enter PEM pass phrase:

此时节点刚刚锁定。我似乎找不到以编程方式传递密码的选项。

【问题讨论】:

  • 您使用的是什么版本的 Node 和 OpenSSL?我无法在使用 OpenSSL 0.9.8l 和最新版本的 Node (v0.8.16) 的 Mac 上重现此问题。
  • 我可以在 Mac 上使用 Node v0.10.18 和 OpenSSL 0.9.8y 2013 年 2 月 5 日重现

标签: node.js cryptography openssl


【解决方案1】:

更新:我在核心中修复了这个问题

我对此的修复只是landed in core它还没有正式发布,但是当它发布时你可以像这样使用它:

var sig = crypto.createSign('RSA-SHA256').update('psst').sign({
  key: pk,
  passphrase: 'password'
}, 'hex');

将在此版本发布后更新。在 v0.11.8 版本中发布。

原答案:

这里有一个可行的解决方案,你可以在应用启动时解密私钥,然后正常使用,例如:

var  childProcess = require('child_process'),
  crypto = require('crypto');

var pk;

var sign = function () {
  var sig = crypto.createSign('RSA-SHA256').update('psst').sign(pk,'hex');
  console.log(sig);
};

childProcess.exec('openssl rsa -in /path/to/private_key -passin pass:your_password', {},
    function (err, stdout, stderr) {
  if (err) throw err;
  pk = stdout; // Save in memory for later use
  sign();
});

【讨论】:

  • 它给了我这个错误:140735266955648:error:0906D06C:PEMroutines:PEM_read_bio:no start line:../deps/openssl/openssl/crypto/pem/pem_lib.c:703:Expecting:证书
  • 考虑将密码作为参数传递给脚本,或者将其设置为环境变量而不是硬编码
  • @pshah 不幸的是,我认为这是由于您的密钥文件中的错误,为了测试尝试使用ssh-keygen -t rsa 生成一个新文件。 @Plato 是正确的,有几种方法可以传入密码,你可以用... -passin env:var_name 指定一个环境变量,完整的细节在这里:openssl.org/docs/apps/openssl.html#PASS_PHRASE_ARGUMENTS
  • 我在尝试调用验证(而不是签名)时收到了提到的错误,但这似乎是一个不相关的问题。我确实验证了密钥,它没有错误。
  • @pshah 更新了答案,因为它现在已在核心中修复
猜你喜欢
  • 1970-01-01
  • 2011-11-25
  • 1970-01-01
  • 2014-08-24
  • 2016-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多