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-сертификатах. Превращает сложные темы кибербезопасности в понятный, увлекательный контент. Вносите свой вклад в повышение уровня цифровой безопасности с помощью впечатляющих рассказов.

Avatar of Sergiu Rosca
Technical Review by Sergiu Rosca

Sergiu Rosca is the core web developer behind SSL Dragon. He manages the technical infrastructure, platform performance, and backend integrations that keep the site running smoothly and securely. At SSL Dragon, Sergiu shares practical insights on web development, site optimization, and technical troubleshooting.

All SSL Dragon installation guides are tested on live server environments and undergo a strict peer-review process to ensure your infrastructure remains secure. Read our full Editorial Policy.