Я пытаюсь подключить серверы к централизованному серверу.Чтобы подтвердить их личность, я предпочитаю использовать ключи шифрования / подписи.Я бы предпочел использовать ED25519, если это возможно, но если я ошибаюсь в их возможностях для этого, пожалуйста, дайте мне знать.
Также обратите внимание, что это не SSL / SSH.Это просто общие данные, которые будут переданы приложению, которое также принимает клиентов (отсюда и необходимость проверки).Ключи послужат доказательством того, что сервер действительно является сервером, и предоставят ему необходимые права / доступ для других методов.
Я пробовал RSA и могу получить его частично работающим, но не могу его получитьзагрузить открытый ключ правильно.
Вот что у меня так далеко.Только зависимости являются ключами, которые может генерировать каждый.В этом тесте я использую ed25519 и RSA 4096-bit.
"use strict"
const fs = require("fs"),
crypto = require("crypto");
// Let's set up some key files that can be easily rotated for testing
const keys = [
{algorithm: 'ed25519', name: 'ed25519', passphrase: 'password', pem: false, ppk: false, pub: false, public: false, private: false},
{algorithm: 'ed25519', name: 'ed25519_2', passphrase: 'password', pem: false, ppk: false, pub: false, public: false, private: false},
{algorithm: 'rsa', name: 'rsa', passphrase: 'password', pem: false, ppk: false, pub: false, public: false, private: false},
];
// Select our key from the list above
const key = keys[2];
// Set a message to sign
const message = 'Hello world!';
// Load the files (that exist)
key.pem = (fs.existsSync("./" + key.name + ".pem")) ? fs.readFileSync("./" + key.name + ".pem") : false;
key.ppk = (fs.existsSync("./" + key.name + ".ppk")) ? fs.readFileSync("./" + key.name + ".ppk") : false;
key.pub = (fs.existsSync("./" + key.name + ".pub")) ? fs.readFileSync("./" + key.name + ".pub") : false;
// Verify what was loaded
console.log(key.pem.toString(), "\n\n", key.ppk.toString(), "\n\n", key.pub.toString(), "\n\n");
// At this point, we have our key data and messages. Let's continue
// Create the public/private key objecs for sign/verify
key.private = crypto.createPrivateKey({key: key.pem, passphrase: key.passphrase});
// key.public = crypto.createPublicKey(key.private);
key.public = crypto.createPublicKey({key: key.pub});
// Sign message with private key
const sign = crypto.createSign('RSA-SHA512');
sign.update(message);
const sig = sign.sign(key.private);
console.log('Signed!');
console.log(sig);
// Verify signature with public key
console.log('Verifying signature...');
const verify = crypto.createVerify('RSA-SHA512');
verify.update(message);
const verified = verify.verify(key.public, sig);
// Results?
console.log('Match:', verified);
Если я использую объект закрытого ключа для создания объекта открытого ключа, он работает.Если я использую открытый ключ, чтобы попытаться создать объект с открытым ключом, произойдет сбой.Очевидно, что мне нужно иметь открытый ключ на отдельном сервере для проверки без закрытого ключа, поэтому я в тупике.Это для ОГА.ED25519, даже не удается получить объект закрытого ключа.
Ошибка объекта открытого ключа RSA:
internal/crypto/keys.js:321
handle.init(data, format, type);
^
Error: error:0909006C:PEM routines:get_name:no start line
at Object.createPublicKey (internal/crypto/keys.js:321:10)
at Object.<anonymous> (C:\Users\...\Desktop\test_signing\exec.js:24:21)
at Module._compile (internal/modules/cjs/loader.js:868:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:879:10)
at Module.load (internal/modules/cjs/loader.js:731:32)
at Function.Module._load (internal/modules/cjs/loader.js:644:12)
at Function.Module.runMain (internal/modules/cjs/loader.js:931:10)
at internal/main/run_main_module.js:17:11 {
library: 'PEM routines',
function: 'get_name',
reason: 'no start line',
code: 'ERR_OSSL_PEM_NO_START_LINE'
}
Ошибка объекта закрытого ключа ED25519:
internal/crypto/keys.js:329
handle.init(data, format, type, passphrase);
^
Error: error:0909006C:PEM routines:get_name:no start line
at Object.createPrivateKey (internal/crypto/keys.js:329:10)
at Object.<anonymous> (C:\Users\...\Desktop\test_signing\exec.js:30:22)
at Module._compile (internal/modules/cjs/loader.js:868:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:879:10)
at Module.load (internal/modules/cjs/loader.js:731:32)
at Function.Module._load (internal/modules/cjs/loader.js:644:12)
at Function.Module.runMain (internal/modules/cjs/loader.js:931:10)
at internal/main/run_main_module.js:17:11 {
library: 'PEM routines',
function: 'get_name',
reason: 'no start line',
code: 'ERR_OSSL_PEM_NO_START_LINE'
}
Ошибкапо той же причине, но я понятия не имею, что это такое.Любая помощь будет принята с благодарностью !!!