Я столкнулся с рассолом, у пользователя есть пара ключей public
и private
, сгенерированная с помощью crypto
из node.js v11.11.0.
Ключ private
Пароль защищен.Я распространяю public
и использую его для шифрования шифровальных ключей для шифрования AES (гибридный режим).
Закрытый ключ можно использовать из командной строки (openssl в Linux) просто отлично.Но с node.js я получаю ошибки bad decrypt
и EVP DecryptFinal
.
Пара генерируется так:
crypto.generateKeyPair('rsa', {
modulusLength: 4096,
publicKeyEncoding: {
type: 'spki',
format: 'pem'
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'pem',
cipher: 'aes-256-cbc',
passphrase: rand_pass
}
}, (err, pub, priv) => {
if (err) {
console.dir(err);
return callback({ status: 500,
success: false,
message: err });
}
else {
let key_file = crypto.createHash('sha256').update(id).digest('hex');
let dir = global.keys;
let pub_file = dir + key_file + '.pub';
let prv_file = dir + key_file + '.priv';
fs.writeFileSync(pub_file, pub);
fs.writeFileSync(prv_file, priv);
models.User.activate(id, pub_file, prv_file, function(reply) {
return res.status(201).json(reply);
});
}
});
Тогда как, когда я читаю закрытый ключ, я получаю:
-----BEGIN ENCRYPTED PRIVATE KEY-----
Из командной строки (и с помощью ключевой фразы) я получаю:
RSA key ok
writing RSA key
-----BEGIN RSA PRIVATE KEY-----
Однако загрузка ключа private
из node.jsпревращается в проблему.Используя метод crypto.createPrivateKey(key)
Я не могу загрузить закрытый ключ:
var meta = query.meta;
var key_pem = fs.readFileSync(query.private_key, "ascii");
if (key_pem === undefined) {
return res.status(500).json({message: "internal error" });
}
var priv_key = crypto.createPrivateKey(key_pem, 'pem', 'pkcs8', rand_pass);
Ошибка всегда одна и та же, хотя я пробовал с различными вариантами кодирования (ключ) и параметры идентичны.
Кто-нибудь успешно использовал закрытые ключи с защитой паролем в Node.JS, не используя child_process
, а только собственный метод?