Сервис развивается: тестируем формат, собираем идеи, улучшаем сервис. Есть идеи?

Написать
Войти
Дайджесты
Иллюстрация к статье: Релиз Node.js 26.7.0: подгрузка ключей через STORE-загрузчики и обновление корневых сертификатов

Релиз Node.js 26.7.0: подгрузка ключей через STORE-загрузчики и обновление корневых сертификатов

Версия Node.js 26.7.0 получила возможность подгружать приватные ключи через внешние OpenSSL STORE-лоадеры в модуле crypto без экспорта в память процесса. Разбор обновленной базы корневых сертификатов NSS 3.12, доработок Web Storage API и практического конфигурирования HSM-токенов бэкенда.

Релиз Node.js 26.7.0: подгрузка ключей через STORE-загрузчики и обновление корневых сертификатов

Команда разработчиков Node.js официально представила очередной релиз текущей ветки — Node.js v26.7.0 (Current). Выпуск содержит важные обновления в области информационной безопасности бэкенда, расширяет возможности интеграции с аппаратными HSM-модулями через OpenSSL, обновляет список доверенных сертификатов и приносит очередные оптимизации в встроенный JavaScript-движок V8.

Хотя текущие выпуски ветки Current служат площадкой для обкатки новых возможностей перед включением в LTS, нововведения в модуле node:crypto представляют прямой интерес для корпоративных систем с повышенными требованиями к защите ключей.

Интеграция OpenSSL STORE API в модуль crypto

Главной технической новинкой Node.js 26.7.0 стала реализация поддержки внешних загрузчиков ключей OpenSSL STORE (PR #63949, автор Filip Skokan).

В традиционных серверных приложениях закрытые ключи TLS и шифрования либо считываются из файлов на диске (PEM/DER-форматы), либо передаются через переменные окружения. В строго защищённых банковских и корпоративных контурах такой подход недопустим: приватные ключи хранятся внутри аппаратных модулей безопасности (HSM), защищённых токенов PKCS#11 или системных хранилищ ключей операционной системы.

Благодаря интеграции OpenSSL STORE API методы crypto.createPrivateKey() и crypto.createPublicKey() в Node.js 26.7.0 научились принимать специальные URI-указатели вместо сырых данных ключа:

import { createPrivateKey, createSign } from 'node:crypto';

// Загрузка приватного ключа напрямую из внешнего HSM-хранилища OpenSSL STORE
const privateKey = createPrivateKey({
  key: 'store:pkcs11:token=HardwareToken;object=rsa-signing-key',
  format: 'pem'
});

// Создание цифровой подписи без экспорта самого ключа в оперативную память Node.js
const signer = createSign('SHA256');
signer.update('Данные для транзакции');
const signature = signer.sign(privateKey);

При таком вызове байты закрытого ключа никогда не попадают в адресное пространство процесса Node.js и не могут быть вычитаны из оперативной памяти при дампах процесса или уязвимостях типа buffer overflow. Криптографические операции подписи и расшифровки делегируются непосредственно защищённому модулю.

Обновление базы корневых сертификатов NSS 3.12

В релиз Node.js 26.7.0 включена свежая версия базы доверенных корневых сертификатов Mozilla Network Security Services (NSS 3.12).

Автоматическая актуализация цепочек доверия сертификатов гарантирует безопасную работу клиента fetch() и модуля node:https. В рамках этого обновления:

  • Удалены скомпрометированные и истёкшие корневые центры сертификации (CA);
  • Добавлены новые доверенные сертификаты промежуточных центров;
  • Усилены требования к длине ключей и алгоритмам подписи для TLS-соединений.

Для сервисов, совершающих внешние вызовы к публичным API, своевременное обновление сертификатов предотвращает внезапные ошибки вида UNABLE_TO_VERIFY_LEAF_SIGNATURE.

Доработки Web Storage API и среды выполнения

Помимо криптографического модуля, версия 26.7.0 получила ряд важных улучшений в серверном окружении:

  • Стабилизация Web Storage: Доработана встроенная реализация localStorage и sessionStorage для CLI-скриптов и автономных модулей, приводящая поведение хранилища в соответствие со спецификациями WHATWG.
  • Обновление движка V8: Включены патчи сборщика мусора и JIT-компилятора V8, ускоряющие операции распределения памяти при активном создании короткоживущих объектов.
  • Оптимизация потоков (Streams): Метод Readable.fromWeb() получил сокращённые накладные расходы при трансформации веб-потоков в нативные Node.js Streams.

Сравнение подходов к управлению ключами

ПараметрТрадиционный подход (PEM-файлы)OpenSSL STORE API (Node.js 26.7.0)
Место хранения ключаФайловая система / переменные окруженияАппаратный HSM / токен PKCS#11 / ОС
Доступ к памяти процессаКлюч вычитывается в RAM Node.jsКлюч физически не попадает в RAM
Защита от утечек при дампахУязвим (утечка RAM раскрывает ключ)Абсолютная защита (операции на HSM)
Ротация ключейТребует перезапуска или re-read файловПрозрачна на стороне внешнего STORE

Практическое пошаговое руководство по конфигурированию STORE API

Для подключения аппаратного ключа PKCS#11 через OpenSSL STORE в Node.js 26.7.0 выполните следующие действия:

  1. Убедитесь, что в операционной системе установлен модуль openssl с поддержкой pkcs11-engine или provider-pkcs11.
  2. Задайте путь к конфигурации OpenSSL через переменную окружения OPENSSL_CONF=/etc/ssl/openssl.cnf.
  3. Убедитесь, что в файле openssl.cnf зарегистрирован ваш провайдер HSM.
  4. В коде Node.js передайте валидный store: URI в метод crypto.createPrivateKey(), указав маркер формата.
  5. Протестируйте вызов метода подписи signer.sign(), проверив отсутствие обращений к локальным PEM-файлам в логах системных вызовов strace.

Совместимость с FIPS 140-3 и инфраструктурные нюансы

Для организаций, соблюдающих стандарты защиты данных FIPS 140-3, поддержка OpenSSL STORE упрощает сертифицирование Node.js-сервисов. Поскольку криптографические операции вычисляются во внешнем аппаратно защищённом контуре, сам сервер приложений Node.js освобождается от необходимости хранения мастер-ключей в зашифрованных swap-файлах.

При этом разработчикам следует учитывать, что при недоступности внешнего HSM-устройства вызов createPrivateKey с store: URI сгенерирует синхронную исключительную ситуацию ERR_CRYPTO_CUSTOM_ENGINE_ERROR. В продакшен-коде рекомендуется оборачивать инициализацию ключей в конструкции try/catch с реализацией механизмов повторных попыток (retry policy).

Рекомендации по обновлению

Разработчикам бэкенд-сервисов рекомендуется протестировать сборки приложений на Node.js 26.7.0 в staging-окружениях. Особое внимание следует обратить на тесты TLS-соединений с внешними ресурсами и проверить работу вызовов node:crypto, если в проекте используются кастомные провайдеры безопасности.