NodeJS生成用于签名和验证消息的有效PEM密钥

Jos*_*eak 8 ssl pem node.js

语境

来自Node v10.9.0的TLS / SSL上的NodeJS文档(2018-AUG)

https://nodejs.org/api/tls.html#tls_tls_ssl_concepts

openssl genrsa -out ryans-key.pem 2048
Run Code Online (Sandbox Code Playgroud)

将产生:

-----BEGIN RSA PRIVATE KEY-----
base64 encoded magic here...
-----END RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

然后,我可以成功地使用Sign该类对消息进行加密签名:

https://nodejs.org/api/crypto.html#crypto_class_sign

const crypto = require('crypto');
const sign = crypto.createSign('RSA-SHA256');

sign.update('some data to sign');

const privateKey = `Insert magic value from above`;
console.log(sign.sign(privateKey, 'base64'));
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法,但均未成功:

const crypto = require('crypto');
const dhke = crypto.createDiffieHellman(2048);
dhke.generateKeys();
const private_pem = `-----BEGIN RSA PRIVATE KEY-----
${dhke.getPrivateKey('base64')}
-----END RSA PRIVATE KEY-----`;
console.log(private_pem);

const sign = crypto.createSign('RSA-SHA256');
sign.update('some data to sign');

const signature = sign.sign(private_pem, 'base64');
console.log(signature);
Run Code Online (Sandbox Code Playgroud)

出现以下错误:

Error: error:0D07207B:asn1 encoding routines:ASN1_get_object:header too long
    at Sign.sign (internal/crypto/sig.js:84:26)
...
Run Code Online (Sandbox Code Playgroud)

问题

如何使用cryptoNodeJS中的库来实现openssl正在执行的命令行工具(或另一个NPM模块)来创建类所需的有效PEM格式的公用/专用密钥对Sign

类似的未解决问题

由于JacobTDC 接受了答案NodeJS v10.12.0添加了此功能,因此,这是开始完成工作解决方案的步骤。

const crypto = require('crypto'); const sign = crypto.createSign('RSA-SHA256');

sign.update('some data to sign');

// $ openssl genrsa -out ryans-key.pem 2048 
// const privateKey = `Insert magic value from above`;

const { generateKeyPairSync } = require('crypto'); 
const { publicKey, privateKey } = generateKeyPairSync('rsa', 
{   modulusLength: 2048,  // the length of your key in bits   
    publicKeyEncoding: {
      type: 'spki',       // recommended to be 'spki' by the Node.js docs
      format: 'pem'   
    },   
    privateKeyEncoding: {
      type: 'pkcs8',      // recommended to be 'pkcs8' by the Node.js docs
      format: 'pem',
      //cipher: 'aes-256-cbc',   // *optional*
      //passphrase: 'top secret' // *optional*   
  } 
}); 
console.log(privateKey); 
console.log(sign.sign(privateKey, 'base64'));
Run Code Online (Sandbox Code Playgroud)

Jac*_*TDC 7

从Node.js v10.12.0开始,您可以使用crypto.generateKeyPaircrypto.generateKeyPairSync

我从下面的Node.js文档中提供了一个示例(添加了注释):

const { generateKeyPairSync } = require('crypto');
const { publicKey, privateKey } = generateKeyPairSync('rsa', {
  modulusLength: 4096,  // the length of your key in bits
  publicKeyEncoding: {
    type: 'spki',       // recommended to be 'spki' by the Node.js docs
    format: 'pem'
  },
  privateKeyEncoding: {
    type: 'pkcs8',      // recommended to be 'pkcs8' by the Node.js docs
    format: 'pem',
    cipher: 'aes-256-cbc',   // *optional*
    passphrase: 'top secret' // *optional*
  }
});
Run Code Online (Sandbox Code Playgroud)

  • 尝试使用生成的证书时:“错误:错误:0909006C:PEM例程:get_name:无起始行”,但两者都有起始行和结束行。 (2认同)