bg-tutorials

Как сгенерировать CSR в Node.js

В этом руководстве показано как создать CSR для приложения Node.js. В Node.js нет встроенного инструмента для создания CSR, поэтому вы создаёте приватный ключ и запрос на подпись сертификата с помощью OpenSSL на машине, которая будет запускать Node, отправляете CSR в свой удостоверяющий центр, а затем загружаете выданный сертификат в приложение с помощью fs.readFileSync() и https.createServer().

Приведённые ниже шаги работают на любой операционной системе, в которой есть OpenSSL, а это охватывает все современные дистрибутивы Linux, macOS и Windows (через официальные бинарные файлы OpenSSL или Git Bash). Современный OpenSSL по умолчанию подписывает запросы с использованием SHA-256, поэтому добавлять флаг дайджеста не нужно.

Шаг 1: Убедитесь, что OpenSSL установлен

Проверьте, доступен ли OpenSSL на машине, которая будет запускать ваше приложение Node.js:

openssl version

Вы должны увидеть строку вроде OpenSSL 3.0.x или новее. Если команда не найдена, установите его для вашей платформы:

  • Debian, Ubuntu: sudo apt update && sudo apt install openssl
  • RHEL, AlmaLinux, Rocky Linux, Amazon Linux: sudo dnf install openssl (или sudo yum install openssl в более старых версиях)
  • macOS: OpenSSL (LibreSSL в некоторых версиях, OpenSSL 3, если установлен через Homebrew) уже присутствует в Терминале. Чтобы установить оригинальную сборку: brew install openssl@3.
  • Windows: установите официальные бинарные файлы OpenSSL, либо используйте Git Bash, в котором OpenSSL уже предустановлен.

Шаг 2: Создание приватного ключа и CSR

Создайте ключ и CSR на той машине, которая будет запускать Node.js. Приватный ключ создаётся рядом с CSR и должен оставаться на этой же машине. Выполнение этих команд где-то в другом месте с последующим копированием ключа сводит на нет саму суть наличия приватного ключа.

Выполните следующую команду. Она создаёт 2048-битный приватный ключ RSA и соответствующий CSR за один шаг, с указанием субъекта и альтернативных имён субъекта (SAN) прямо в команде, чтобы OpenSSL не останавливался с вопросами:

openssl req -new -newkey rsa:2048 -nodes 
-keyout yourdomain.key 
-out yourdomain.csr 
-subj "/C=US/ST=YourState/L=YourCity/O=YourCompany/CN=yourdomain.com" 
-addext "subjectAltName=DNS:yourdomain.com,DNS:www.yourdomain.com"

Что означает каждая часть:

  • -newkey rsa:2048 создаёт новый 2048-битный ключ RSA. 2048 бит — это текущий минимум, принимаемый публичными CA; вы можете использовать rsa:4096 для более крупного ключа, или переключиться на ECDSA (см. ниже).
  • -nodes оставляет приватный ключ незашифрованным, чтобы Node.js мог прочитать его при запуске без запроса парольной фразы. Модуль https в Node действительно поддерживает опцию passphrase для зашифрованного ключа, но парольную фразу всё равно нужно откуда-то брать на этой же машине (файл конфигурации, переменная окружения или менеджер секретов).
  • -keyout и -out задают имена файлов приватного ключа и CSR.
  • -subj задаёт субъект сертификата. Укажите здесь реальное название вашей компании, штат и город, а не заглушки. CN (Common Name) — это ваш основной домен.
  • -addext «subjectAltName=…» перечисляет все имена хостов, которые должен покрывать сертификат. Публичные CA проверяют по списку SAN, поэтому включите сюда и Common Name. Флаг -addext требует OpenSSL версии 1.1.1 или новее, который есть в любой современной ОС.

Замените yourdomain.com на ваш фактический домен везде по тексту. Чтобы охватить дополнительные имена хостов, добавьте их в список SAN через запятую, например DNS:api.yourdomain.com. Для wildcard-сертификата включите как wildcard, так и голый домен: DNS:*.yourdomain.com,DNS:yourdomain.com.

Если вы предпочитаете ключ ECDSA (меньше и быстрее, с широко поддерживаемой кривой P-256), создайте ключ и CSR следующим образом:

openssl req -new -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 -pkeyopt ec_param_enc:named_curve -nodes 
-keyout yourdomain.key 
-out yourdomain.csr 
-subj "/C=US/ST=YourState/L=YourCity/O=YourCompany/CN=yourdomain.com" 
-addext "subjectAltName=DNS:yourdomain.com,DNS:www.yourdomain.com"

Интерактивный режим (без -subj)

Если вы предпочитаете, чтобы OpenSSL запрашивал у вас каждое поле, уберите флаг -subj:

openssl req -new -newkey rsa:2048 -nodes 
-keyout yourdomain.key -out yourdomain.csr 
-addext "subjectAltName=DNS:yourdomain.com,DNS:www.yourdomain.com"

OpenSSL запросит следующие данные:

  • Country Name (C): двухбуквенный код страны ISO вашей организации (например, US).
  • State or Province Name (S): полное название штата или региона, в котором зарегистрирована ваша компания (например, California). Не сокращайте.
  • Locality Name (L): город, в котором зарегистрирован ваш бизнес (например, San Jose).
  • Organization Name (O): юридическое название вашей компании (например, GPI Holding LLC). Для сертификата DV (Domain Validated) оставьте поле пустым и нажмите Enter.
  • Organizational Unit Name (OU): устарело с сентября 2022 года и игнорируется публичными CA. Оставьте пустым.
  • Common Name (CN): полное доменное имя (FQDN), которое вы защищаете, например yourdomain.com. Для wildcard используйте *.yourdomain.com.
  • Email Address: необязательно. Оставьте пустым.
  • A challenge password: устарело. Оставьте пустым.

Шаг 3: Найдите и защитите свои файлы

Выведите список содержимого текущей директории, чтобы убедиться, что оба файла созданы:

ls

Вы должны увидеть два новых файла:

  • yourdomain.key: ваш приватный ключ. Храните его на сервере, делайте надёжные резервные копии и никогда никому не отправляйте, включая удостоверяющий центр. Тот, кто владеет ключом, может выдавать себя за ваш сайт.
  • yourdomain.csr: ваш запрос на подпись сертификата. Это файл, который вы отправляете поставщику SSL.

В Linux или macOS сразу установите строгие права доступа на приватный ключ, чтобы только пользователь, запускающий Node.js, мог его прочитать:

chmod 600 yourdomain.key

Если Node.js работает под выделенной учётной записью службы (например, node или www-data), также назначьте владельца, чтобы процесс мог прочитать ключ:

sudo chown node:node yourdomain.key

Шаг 4: Проверьте CSR (необязательно, но рекомендуется)

Перед отправкой проверьте, что CSR содержит правильный субъект и SAN, а также что его подпись действительна. Это декодирует запрос локально с помощью OpenSSL:

openssl req -noout -text -verify -in yourdomain.csr

Убедитесь, что строка Subject показывает ваши данные, что X509v3 Subject Alternative Name перечисляет все ожидаемые имена хостов, и что проверка подписи выводит verify OK. Алгоритм подписи должен быть sha256WithRSAEncryption (или ecdsa-with-SHA256 для ключа ECDSA). Если вы не хотите пользоваться командной строкой, вставьте CSR в наш онлайн-инструмент декодер CSR, чтобы прочитать те же поля в браузере.

Шаг 5: Отправьте свой CSR

Чтобы скопировать CSR для вашего заказа, выведите его содержимое:

cat yourdomain.csr

Вы увидите блок текста, подобный этому:

-----BEGIN CERTIFICATE REQUEST-----
MIIBozCB... (a long string of characters)
-----END CERTIFICATE REQUEST-----

Скопируйте весь блок, включая строки ——BEGIN CERTIFICATE REQUEST—— и ——END CERTIFICATE REQUEST—— (у каждого маркера по пять дефисов с каждой стороны). Весь этот блок и есть ваш CSR. Вставьте его в форму заказа при покупке и держите соответствующий приватный ключ на сервере.

Если вы не хотите пользоваться командной строкой, вы также можете сформировать запрос с помощью нашего онлайн-инструмента CSR Generator. Обратите внимание, что он создаёт приватный ключ прямо в вашем браузере, поэтому сохраните этот ключ самостоятельно и перенесите его на сервер Node.js.

Что происходит после выдачи сертификата удостоверяющим центром

После того как CA проверит CSR и выдаст сертификат, вы, как правило, получите сертификат сервера (файл .crt, названный по имени вашего домена) плюс один или несколько промежуточных сертификатов, иногда объединённых в файл .ca-bundle. Node.js загружает их в JavaScript: объедините сертификат сервера и промежуточные сертификаты в один файл fullchain.crt, затем прочитайте его с помощью fs.readFileSync() и передайте в https.createServer():

const https = require('https');
const fs = require('fs');

const options = {
  key: fs.readFileSync('/path/to/yourdomain.key'),
  cert: fs.readFileSync('/path/to/fullchain.crt'),
  minVersion: 'TLSv1.2'
};

https.createServer(options, (req, res) => {
  res.writeHead(200);
  res.end('Welcome to a Node.js HTTPS servern');
}).listen(443);

Именно такую схему с полной цепочкой используют большинство продакшн-настроек. Полное пошаговое руководство (включая пример с модулями ES, альтернативный подход с массивом ca: и пример с Express) описано в нашем руководстве по установке SSL для Node.js.

Примечание о продакшн-развёртываниях. В 2026 году большинство приложений Node.js, обрабатывающих публичный трафик, работают за обратным прокси или облачным балансировщиком нагрузки (NGINX, HAProxy, Caddy, AWS ALB, Cloudflare, Fastly), который терминирует TLS на границе сети и передаёт обычный HTTP или HTTP/2 на Node через локальный порт с высоким номером. В этой схеме сертификат (и CSR, который вы создали выше) находится на прокси или балансировщике нагрузки, а не на самом процессе Node. Терминирование TLS непосредственно в Node.js вполне подходит для разработки, внутренних сервисов и небольших развёртываний; для публичного продакшн-приложения терминирование TLS на границе сети — более распространённая схема.

Сэкономьте 10% на SSL-сертификатах при заказе сегодня!

Быстрая выдача, надежное шифрование, 99,99% доверия к браузеру, специализированная поддержка и 25-дневная гарантия возврата денег. Код купона: SAVE10

Детальное изображение дракона в полете
Написано

Опытный автор контента, специализирующийся на SSL-сертификатах. Превращает сложные темы кибербезопасности в понятный, увлекательный контент. Вносите свой вклад в повышение уровня цифровой безопасности с помощью впечатляющих рассказов.