Конвертация PEM RSA ключей в формат JWK

Статья о том как сконвертировать PEM RSA ключи в формат JWK (JSON Web Key).

Для начала установим Node.js, выполнив следующие действия в консоли:

curl -sL https://deb.nodesource.com/setup_13.x | sudo -E bash -
sudo apt-get install -y nodejs

В этом примере я выбрал версию 13.x, т.к. она полностью подходит для этого примера и является самой свежей на момент написания этого руководства.

nodejs -v

Вывод последней команды должен содержать примерно следующее:

v13.7.0

Чтобы использовать функционал генерации ключей нужно установить rsa-pem-to-jwk:

npm install rsa-pem-to-jwk

Так же код можно скопировать из репозитория в виде архива, или, если в системе установлен git, просто склонировав репозиторий:

git clone https://github.com/OADA/rsa-pem-to-jwk.git

Я выбрал директорию для установки /home/username/workspace/rsa-pem-to-jwk

Установим нужные модули и зависимости:

cd /home/username/workspace/rsa-pem-to-jwk
npm install

Далее переходим в директорию установки rsa-pem-to-jwk (куда был склонирован репозиторий или распакован загруженный архив). И выполняем команду:

cd /home/username/workspace/rsa-pem-to-jwk
npm test

В выводе не должно быть ошибок:

Если всё в порядке можно прервать выполнение Ctrl + C

Опционально. Иногда следует установить дополнительное расширение Mocha:

npm install -g mocha --save-dev

Для начала коныертации следует сгенерировать тестовый сертификат:

ssh-keygen -m PEM -t rsa -b 4096 -C "youremail@example.com"

В процессе генерации пропустим ввод пароля, оставив поле пустым. Путь к файлу можно указать любой, но желательно указать путь директории которую мы выбрали для тестирования функционала (/home/username/workspace/rsa-pem-to-jwk). Позже ключ можно просто скопировать в указанную директорию.

Теперь можно создать файл для конвертации ключа в формат JWK:

touch convert.js

Добавим в файл следующие строки:

var fs = require('fs');
var rsaPemToJwk = require('rsa-pem-to-jwk');
var pem = fs.readFileSync('id_rsa');
var jwk = rsaPemToJwk(pem, {use: 'sig'}, 'private');
console.log(JSON.stringify(jwk, null, 4));

Небольшое пояснение по коду.

  • В нём мы подключаем модули файловой системы и модуль конвертации, который установили ранее.
  • Далее передаём путь до ключа «id_rsa» (если ключ находится в директории выполнения скрипта, он относительный).
  • Ниже в строке указывается тип ключа «private«, не сложно догадаться, что он может быть «public«, всё зависит от того какой ключ мы конвертируем.
  • В последней строке выводим результат на экран.

Копируем ключ в директорию /home/username/workspace/rsa-pem-to-jwk, если он ещё не там, и запускаем конвертацию:

node convert.js

В результате получаем JSON массив такого вида:

{
     "kty": "RSA",
     "use": "sig",
     "n": "...",
     "p": "...",
     "q": "...",
     "dp": "...",
     "dq": "...",
     "qi": "..."
 }

Ключ сконвертирован!

Полезное

Пусть к модулям Node.js определяется так:

npm root -g

Тест можно запустить командой:

npx mocha

или

npx mocha <args>

Не помешает установить набор инструментов для сборки:

sudo apt-get install gcc g++ make

Обновить npm:

sudo npm install -g npm

Инструкции по теме:

Добавить комментарий