Spec-Zone.ru › Node.js 24 LTS

TLS (SSL)

Стабильность: 2 — Стабильный

Исходный код: lib/tls.js

Модуль node:tls предоставляет реализацию протоколов Transport Layer Security (TLS) и Secure Socket Layer (SSL), построенную на основе OpenSSL. Доступ к модулю можно получить следующим образом:

Модули JavaScript
import tls from 'node:tls';
CommonJS
const tls = require('node:tls');

Определение того, что поддержка crypto недоступна

Node.js может быть собран без поддержки модуля node:crypto. В таких случаях попытка import из tls или вызов require('node:tls') приведёт к выбрасыванию ошибки.

При использовании CommonJS выброшенную ошибку можно перехватить с помощью try/catch:

let tls;
try {
  tls = require('node:tls');
} catch (err) {
  console.error('tls support is disabled!');
} copy

При использовании лексического ключевого слова ESM import ошибку можно перехватить, только если обработчик для process.on('uncaughtException') зарегистрирован до любой попытки загрузить модуль (например, с помощью модуля предварительной загрузки).

При использовании ESM, если код может выполняться в сборке Node.js, в которой поддержка crypto не включена, рассмотрите возможность использования функции import() вместо лексического ключевого слова import:

let tls;
try {
  tls = await import('node:tls');
} catch (err) {
  console.error('tls support is disabled!');
} copy

Понятия TLS/SSL

TLS/SSL — это набор протоколов, использующих инфраструктуру открытых ключей (PKI) для обеспечения безопасной связи между клиентом и сервером. В большинстве распространённых случаев у каждого сервера должен быть закрытый ключ.

Закрытые ключи можно генерировать разными способами. В примере ниже показано, как с помощью интерфейса командной строки OpenSSL сгенерировать закрытый ключ RSA длиной 2048 бит:

openssl genrsa -out ryans-key.pem 2048 copy

Для работы с TLS/SSL все серверы (и некоторые клиенты) должны иметь сертификат. Сертификаты — это открытые ключи, соответствующие закрытому ключу и имеющие цифровую подпись центра сертификации либо владельца закрытого ключа (такие сертификаты называют «самоподписанными»). Первый шаг к получению сертификата — создание файла запроса на подпись сертификата (CSR).

Для генерации CSR для закрытого ключа можно использовать интерфейс командной строки OpenSSL:

openssl req -new -sha256 -key ryans-key.pem -out ryans-csr.pem copy

После создания файла CSR его можно отправить в центр сертификации для подписания или использовать для создания самоподписанного сертификата.

В примере ниже показано, как создать самоподписанный сертификат с помощью интерфейса командной строки OpenSSL:

openssl x509 -req -in ryans-csr.pem -signkey ryans-key.pem -out ryans-cert.pem copy

После создания сертификата его можно использовать для создания файла .pfx или .p12:

openssl pkcs12 -export -in ryans-cert.pem -inkey ryans-key.pem \
      -certfile ca-cert.pem -out ryans.pfx copy

Где:

  • in: подписанный сертификат
  • inkey: соответствующий закрытый ключ
  • certfile: объединение сертификатов всех центров сертификации (CA) в один файл, например cat ca1-cert.pem ca2-cert.pem > ca-cert.pem

Совершенная прямая секретность

Термин прямая секретность или совершенная прямая секретность обозначает свойство методов согласования ключей (то есть обмена ключами). Это означает, что ключи сервера и клиента используются для согласования новых временных ключей, предназначенных исключительно для текущего сеанса связи. На практике это означает, что даже если закрытый ключ сервера будет скомпрометирован, злоумышленники смогут расшифровать передаваемые данные только в том случае, если им удастся получить пару ключей, сгенерированную специально для этого сеанса.

Совершенная прямая секретность достигается случайной генерацией пары ключей для согласования ключей при каждом TLS/SSL-рукопожатии (в отличие от использования одного и того же ключа для всех сеансов). Методы, реализующие этот механизм, называются эфемерными.

В настоящее время для обеспечения совершенной прямой секретности широко применяются два метода (обратите внимание на букву «E», добавленную к традиционным сокращениям):

  • ECDHE: эфемерная версия протокола согласования ключей Диффи — Хеллмана на эллиптических кривых.
  • DHE: эфемерная версия протокола согласования ключей Диффи — Хеллмана.

Совершенная прямая секретность с использованием ECDHE включена по умолчанию. При создании TLS-сервера параметр ecdhCurve можно использовать, чтобы настроить список поддерживаемых кривых ECDH. Подробнее см. в разделе tls.createServer().

DHE отключён по умолчанию, но его можно включить вместе с ECDHE, установив параметр dhparam в значение 'auto'. Также поддерживаются пользовательские параметры DHE, однако вместо них рекомендуется использовать автоматически выбираемые известные параметры.

До TLSv1.2 совершенная прямая секретность была необязательной. Начиная с TLSv1.3 всегда используется (EC)DHE (за исключением соединений только с PSK).

ALPN и SNI

ALPN (расширение согласования протокола прикладного уровня) и SNI (индикация имени сервера) — это расширения TLS-рукопожатия:

  • ALPN: позволяет использовать один TLS-сервер для нескольких протоколов (HTTP, HTTP/2)
  • SNI: позволяет использовать один TLS-сервер для нескольких имён узлов с разными сертификатами.

Предварительно распределённые ключи

Поддержка TLS-PSK доступна как альтернатива обычной аутентификации на основе сертификатов. Для аутентификации TLS-соединения вместо сертификатов используется предварительно распределённый ключ, что обеспечивает взаимную аутентификацию. TLS-PSK и инфраструктура открытых ключей не являются взаимоисключающими. Клиенты и серверы могут поддерживать оба варианта и выбирать один из них на обычном этапе согласования шифров.

TLS-PSK — подходящий вариант только в случаях, когда есть возможность безопасно передать ключ каждой подключающейся машине. Поэтому он не заменяет инфраструктуру открытых ключей (PKI) в большинстве сценариев использования TLS. Реализация TLS-PSK в OpenSSL в последние годы обнаруживала множество уязвимостей, главным образом потому, что её использует лишь небольшая часть приложений. Перед переходом на шифры PSK рассмотрите все альтернативные решения. При создании PSK крайне важно использовать достаточную энтропию, как описано в RFC 4086. Получение общего секрета из пароля или других источников с низкой энтропией небезопасно.

Шифры PSK отключены по умолчанию, поэтому для использования TLS-PSK необходимо явно указать набор шифров с помощью параметра ciphers. Список доступных шифров можно получить с помощью openssl ciphers -v 'PSK'. Все шифры TLS 1.3 подходят для PSK; их можно получить с помощью openssl ciphers -v -s -tls1_3 -psk. При подключении клиента следует передать пользовательский checkServerIdentity, поскольку значение по умолчанию не сработает при отсутствии сертификата.

Согласно RFC 4279, должна поддерживаться длина идентификаторов PSK до 128 байт и длина PSK до 64 байт. Начиная с OpenSSL 1.1.0 максимальный размер идентификатора составляет 128 байт, а максимальная длина PSK — 256 байт.

Текущая реализация не поддерживает асинхронные обратные вызовы PSK из-за ограничений базового API OpenSSL.

Для использования TLS-PSK клиент и сервер должны указать параметр pskCallback — функцию, возвращающую используемый PSK (который должен быть совместим с дайджестом выбранного шифра).

Сначала она будет вызвана на клиенте:

  • hint <string> необязательное сообщение, отправляемое сервером, чтобы помочь клиенту выбрать идентификатор для согласования. Всегда null при использовании TLS 1.3.
  • Возвращает: <Object> в формате { psk: <Buffer|TypedArray|DataView>, identity: <string> } или null.

Затем — на сервере:

  • socket <tls.TLSSocket> экземпляр сокета сервера, эквивалентный this.
  • identity <string> параметр идентификатора, отправленный клиентом.
  • Возвращает: <Buffer> | <TypedArray> | <DataView> PSK (или null).

Возвращаемое значение null останавливает процесс согласования и отправляет другой стороне сообщение оповещения unknown_psk_identity. Если сервер хочет скрыть тот факт, что идентификатор PSK неизвестен, обратный вызов должен предоставить случайные данные в качестве psk, чтобы соединение завершилось ошибкой decrypt_error до завершения согласования.

Защита от атак с повторным согласованием, инициированным клиентом

Протокол TLS позволяет клиентам повторно согласовывать некоторые параметры TLS-сеанса. К сожалению, повторное согласование сеанса требует непропорционально больших ресурсов сервера, что делает его потенциальным вектором атак типа «отказ в обслуживании».

Для снижения риска повторное согласование ограничено тремя запросами каждые десять минут. Когда этот порог превышен, для экземпляра tls.TLSSocket генерируется событие 'error'. Ограничения можно настроить:

  • tls.CLIENT_RENEG_LIMIT <number> задаёт количество запросов на повторное согласование. По умолчанию: 3.
  • tls.CLIENT_RENEG_WINDOW <number> задаёт длительность интервала повторного согласования в секундах. По умолчанию: 600 (10 минут).

Не следует изменять ограничения повторного согласования по умолчанию без полного понимания последствий и рисков.

TLSv1.3 не поддерживает повторное согласование.

Возобновление сеанса

Установка TLS-сеанса может занимать относительно много времени. Процесс можно ускорить, сохранив состояние сеанса и повторно используя его позднее. Существует несколько механизмов для этого; ниже они перечислены от самого старого к самому новому (и предпочтительному).

Идентификаторы сеансов

Серверы генерируют уникальный идентификатор для новых подключений и отправляют его клиенту. Клиенты и серверы сохраняют состояние сеанса. При повторном подключении клиенты отправляют идентификатор сохранённого состояния сеанса, и если сервер также хранит состояние для этого идентификатора, он может согласиться использовать его. В противном случае сервер создаст новый сеанс. Подробнее см. в RFC 2246, стр. 23 и 30.

Большинство веб-браузеров поддерживают возобновление с помощью идентификаторов сеансов при выполнении HTTPS-запросов.

В Node.js клиенты ожидают событие 'session', чтобы получить данные сеанса, а затем передают эти данные параметру session последующего вызова tls.connect() для повторного использования сеанса. Серверы должны реализовать обработчики событий 'newSession' и 'resumeSession', чтобы сохранять и восстанавливать данные сеанса, используя идентификатор сеанса в качестве ключа поиска для повторного использования сеансов. Чтобы повторно использовать сеансы между балансировщиками нагрузки или рабочими процессами кластера, серверы должны использовать общий кэш сеансов (например, Redis) в обработчиках сеансов.

Билеты сеансов

Серверы шифруют всё состояние сеанса и отправляют его клиенту в виде «билета». При повторном подключении это состояние отправляется серверу при установлении соединения. Такой механизм избавляет от необходимости хранить кэш сеансов на сервере. Если по какой-либо причине сервер не использует билет (например, не удаётся его расшифровать или он слишком старый), сервер создаёт новый сеанс и отправляет новый билет. Подробнее см. в RFC 5077.

Поддержка возобновления с помощью билетов сеансов становится всё более распространённой в веб-браузерах при выполнении HTTPS-запросов.

В Node.js для возобновления с помощью билетов сеансов клиенты используют те же API, что и для возобновления с помощью идентификаторов сеансов. Для отладки: если tls.TLSSocket.getTLSTicket() возвращает значение, данные сеанса содержат билет; в противном случае они содержат состояние сеанса на стороне клиента.

При использовании TLSv1.3 следует учитывать, что сервер может отправить несколько билетов, в результате чего будет сгенерировано несколько событий 'session'. Подробнее см. в разделе 'session'.

Для использования билетов сеансов отдельным процессом сервера не требуется специальная реализация. Чтобы использовать билеты сеансов после перезапуска сервера или между балансировщиками нагрузки, все серверы должны иметь одинаковые ключи билетов. Внутри используются три ключа длиной 16 байт, но API tls для удобства предоставляет их в виде одного буфера длиной 48 байт.

Ключи билетов можно получить, вызвав server.getTicketKeys() для одного экземпляра сервера, а затем распределить их, но разумнее безопасно сгенерировать 48 байт криптографически стойких случайных данных и задать их с помощью параметра ticketKeys метода tls.createServer(). Ключи следует регулярно менять; ключи сервера можно сбросить с помощью server.setTicketKeys().

Ключи билетов сеансов — это криптографические ключи, и их необходимо хранить безопасно. В TLS 1.2 и более ранних версиях при их компрометации можно расшифровать все сеансы, в которых использовались зашифрованные этими ключами билеты. Не следует хранить их на диске; их нужно регулярно менять.

Если клиенты сообщают о поддержке билетов, сервер отправит их. Сервер может отключить билеты, передав require('node:constants').SSL_OP_NO_TICKET в secureOptions.

Срок действия истекает как у идентификаторов сеансов, так и у билетов сеансов, после чего сервер создаёт новые сеансы. Срок действия можно настроить с помощью параметра sessionTimeout метода tls.createServer().

При использовании любого из этих механизмов, если возобновить сеанс не удаётся, сервер создаёт новый сеанс. Поскольку неудачная попытка возобновления не приводит к сбою TLS/HTTPS-соединения, легко не заметить неоправданно низкую производительность TLS. Чтобы проверить, возобновляют ли серверы сеансы, можно использовать интерфейс командной строки OpenSSL. Используйте параметр -reconnect команды openssl s_client, например:

openssl s_client -connect localhost:443 -reconnect copy

Изучите отладочный вывод. В первой строке подключения должно быть указано «New», например:

New, TLSv1.2, Cipher is ECDHE-RSA-AES128-GCM-SHA256 copy

В последующих строках подключения должно быть указано «Reused», например:

Reused, TLSv1.2, Cipher is ECDHE-RSA-AES128-GCM-SHA256 copy

Изменение набора шифров TLS по умолчанию

Node.js поставляется с набором включённых и отключённых шифров TLS по умолчанию. Этот список шифров по умолчанию можно настроить при сборке Node.js, чтобы дистрибутивы могли использовать собственный список по умолчанию.

Чтобы просмотреть набор шифров по умолчанию, можно использовать следующую команду:

node -p crypto.constants.defaultCoreCipherList | tr ':' '\n'
TLS_AES_256_GCM_SHA384
TLS_CHACHA20_POLY1305_SHA256
TLS_AES_128_GCM_SHA256
ECDHE-RSA-AES128-GCM-SHA256
ECDHE-ECDSA-AES128-GCM-SHA256
ECDHE-RSA-AES256-GCM-SHA384
ECDHE-ECDSA-AES256-GCM-SHA384
DHE-RSA-AES128-GCM-SHA256
ECDHE-RSA-AES128-SHA256
DHE-RSA-AES128-SHA256
ECDHE-RSA-AES256-SHA384
DHE-RSA-AES256-SHA384
ECDHE-RSA-AES256-SHA256
DHE-RSA-AES256-SHA256
HIGH
!aNULL
!eNULL
!EXPORT
!DES
!RC4
!MD5
!PSK
!SRP
!CAMELLIA copy

Этот набор можно полностью заменить с помощью переключателя командной строки --tls-cipher-list (напрямую или через переменную среды NODE_OPTIONS). Например, следующая команда задаёт ECDHE-RSA-AES128-GCM-SHA256:!RC4 в качестве набора шифров TLS по умолчанию:

node --tls-cipher-list='ECDHE-RSA-AES128-GCM-SHA256:!RC4' server.js

export NODE_OPTIONS=--tls-cipher-list='ECDHE-RSA-AES128-GCM-SHA256:!RC4'
node server.js copy

Для проверки используйте следующую команду, чтобы вывести заданный список шифров. Обратите внимание на разницу между defaultCoreCipherList и defaultCipherList:

node --tls-cipher-list='ECDHE-RSA-AES128-GCM-SHA256:!RC4' -p crypto.constants.defaultCipherList | tr ':' '\n'
ECDHE-RSA-AES128-GCM-SHA256
!RC4 copy

То есть список defaultCoreCipherList задаётся во время компиляции, а defaultCipherList — во время выполнения.

Чтобы изменить набор шифров по умолчанию во время выполнения, измените переменную tls.DEFAULT_CIPHERS. Это необходимо сделать до начала прослушивания любых сокетов; на уже открытые сокеты изменение не повлияет. Например:

// Remove Obsolete CBC Ciphers and RSA Key Exchange based Ciphers as they don't provide Forward Secrecy
tls.DEFAULT_CIPHERS +=
  ':!ECDHE-RSA-AES128-SHA:!ECDHE-RSA-AES128-SHA256:!ECDHE-RSA-AES256-SHA:!ECDHE-RSA-AES256-SHA384' +
  ':!ECDHE-ECDSA-AES128-SHA:!ECDHE-ECDSA-AES128-SHA256:!ECDHE-ECDSA-AES256-SHA:!ECDHE-ECDSA-AES256-SHA384' +
  ':!kRSA'; copy

Значение по умолчанию также можно заменить отдельно для клиента или сервера с помощью параметра ciphers из tls.createSecureContext(), который также доступен в tls.createServer(), tls.connect() и при создании новых tls.TLSSocket.

Список шифров может содержать сочетание названий наборов шифров TLSv1.3, начинающихся с 'TLS_', и спецификаций наборов шифров TLSv1.2 и более ранних версий. Для шифров TLSv1.2 поддерживается устаревший формат спецификаций. Подробности см. в документации OpenSSL о формате списка шифров, однако эти спецификации не применяются к шифрам TLSv1.3. Наборы TLSv1.3 можно включить, только указав их полное имя в списке шифров. Например, их нельзя включить или отключить с помощью спецификаций 'EECDH' или '!EECDH' устаревшего формата TLSv1.2.

Независимо от взаимного порядка наборов шифров TLSv1.3 и TLSv1.2, протокол TLSv1.3 значительно безопаснее TLSv1.2. Если в ходе рукопожатия выясняется, что он поддерживается, и включён хотя бы один набор шифров TLSv1.3, всегда будет выбран TLSv1.3.

Набор шифров, включённый в Node.js по умолчанию, тщательно подобран с учётом современных рекомендаций по безопасности и снижению рисков. Изменение набора шифров по умолчанию может существенно повлиять на безопасность приложения. Переключатель --tls-cipher-list и параметр ciphers следует использовать только в случае крайней необходимости.

В наборе шифров по умолчанию отдаются предпочтение шифрам GCM для настройки «современная криптография» Chrome, а также шифрам ECDHE и DHE, обеспечивающим совершенную прямую секретность, при этом сохраняется некоторая обратная совместимость.

Старые клиенты, использующие небезопасные и устаревшие шифры RC4 или на основе DES (например, Internet Explorer 6), не смогут завершить процесс рукопожатия с конфигурацией по умолчанию. Если поддержку этих клиентов необходимо обеспечить, совместимый набор шифров можно подобрать по рекомендациям по TLS. Подробное описание формата см. в документации OpenSSL о формате списка шифров.

Существует всего пять наборов шифров TLSv1.3:

  • 'TLS_AES_256_GCM_SHA384'
  • 'TLS_CHACHA20_POLY1305_SHA256'
  • 'TLS_AES_128_GCM_SHA256'
  • 'TLS_AES_128_CCM_SHA256'
  • 'TLS_AES_128_CCM_8_SHA256'

Первые три включены по умолчанию. Два набора на основе CCM поддерживаются в TLSv1.3, поскольку на системах с ограниченными ресурсами они могут работать быстрее, однако по умолчанию они отключены, так как обеспечивают меньшую безопасность.

Уровень безопасности OpenSSL

Библиотека OpenSSL применяет уровни безопасности, чтобы контролировать минимально допустимый уровень безопасности криптографических операций. Уровни безопасности OpenSSL варьируются от 0 до 5, причём на каждом следующем уровне требования безопасности становятся строже. Уровень безопасности по умолчанию — 2, что обычно подходит для большинства современных приложений. Однако для правильной работы некоторых устаревших функций и протоколов, таких как TLSv1, требуется более низкий уровень безопасности (SECLEVEL=0). Дополнительную информацию см. в документации OpenSSL об уровнях безопасности.

Настройка уровней безопасности

Чтобы настроить уровень безопасности в приложении Node.js, добавьте @SECLEVEL=X в строку шифров, где X — требуемый уровень безопасности. Например, чтобы установить уровень безопасности 0 и использовать список шифров OpenSSL по умолчанию, выполните следующее:

Модули JavaScript
import { createServer, connect } from 'node:tls';
const port = 443;

createServer({ ciphers: 'DEFAULT@SECLEVEL=0', minVersion: 'TLSv1' }, function(socket) {
  console.log('Client connected with protocol:', socket.getProtocol());
  socket.end();
  this.close();
})
.listen(port, () => {
  connect(port, { ciphers: 'DEFAULT@SECLEVEL=0', maxVersion: 'TLSv1' });
});
CommonJS
const { createServer, connect } = require('node:tls');
const port = 443;

createServer({ ciphers: 'DEFAULT@SECLEVEL=0', minVersion: 'TLSv1' }, function(socket) {
  console.log('Client connected with protocol:', socket.getProtocol());
  socket.end();
  this.close();
})
.listen(port, () => {
  connect(port, { ciphers: 'DEFAULT@SECLEVEL=0', maxVersion: 'TLSv1' });
});

Этот способ устанавливает уровень безопасности 0, что позволяет использовать устаревшие функции и при этом использовать шифры OpenSSL по умолчанию.

Использование --tls-cipher-list

Также можно задать уровень безопасности и шифры из командной строки с помощью --tls-cipher-list=DEFAULT@SECLEVEL=X, как описано в разделе Изменение набора шифров TLS по умолчанию. Однако обычно не рекомендуется задавать шифры с помощью параметра командной строки. Предпочтительно настраивать шифры для отдельных контекстов в коде приложения: такой подход обеспечивает более точный контроль и снижает риск глобального понижения уровня безопасности.

Коды ошибок сертификатов X509

Несколько функций могут завершиться с ошибкой из-за ошибок сертификатов, о которых сообщает OpenSSL. В этом случае функция передаёт через свой обратный вызов объект <Error> со свойством code, которое может принимать одно из следующих значений:

  • 'UNABLE_TO_GET_ISSUER_CERT': Не удалось получить сертификат издателя.
  • 'UNABLE_TO_GET_CRL': Не удалось получить список отозванных сертификатов (CRL).
  • 'UNABLE_TO_DECRYPT_CERT_SIGNATURE': Не удалось расшифровать подпись сертификата.
  • 'UNABLE_TO_DECRYPT_CRL_SIGNATURE': Не удалось расшифровать подпись CRL.
  • 'UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY': Не удалось декодировать открытый ключ издателя.
  • 'CERT_SIGNATURE_FAILURE': Ошибка подписи сертификата.
  • 'CRL_SIGNATURE_FAILURE': Ошибка подписи CRL.
  • 'CERT_NOT_YET_VALID': Срок действия сертификата ещё не начался.
  • 'CERT_HAS_EXPIRED': Срок действия сертификата истёк.
  • 'CRL_NOT_YET_VALID': Срок действия CRL ещё не начался.
  • 'CRL_HAS_EXPIRED': Срок действия CRL истёк.
  • 'ERROR_IN_CERT_NOT_BEFORE_FIELD': Ошибка формата поля notBefore сертификата.
  • 'ERROR_IN_CERT_NOT_AFTER_FIELD': Ошибка формата поля notAfter сертификата.
  • 'ERROR_IN_CRL_LAST_UPDATE_FIELD': Ошибка формата поля lastUpdate CRL.
  • 'ERROR_IN_CRL_NEXT_UPDATE_FIELD': Ошибка формата поля nextUpdate CRL.
  • 'OUT_OF_MEM': Недостаточно памяти.
  • 'DEPTH_ZERO_SELF_SIGNED_CERT': Самоподписанный сертификат.
  • 'SELF_SIGNED_CERT_IN_CHAIN': Самоподписанный сертификат в цепочке сертификатов.
  • 'UNABLE_TO_GET_ISSUER_CERT_LOCALLY': Не удалось получить локальный сертификат издателя.
  • 'UNABLE_TO_VERIFY_LEAF_SIGNATURE': Не удалось проверить первый сертификат.
  • 'CERT_CHAIN_TOO_LONG': Цепочка сертификатов слишком длинная.
  • 'CERT_REVOKED': Сертификат отозван.
  • 'INVALID_CA': Недействительный сертификат CA.
  • 'PATH_LENGTH_EXCEEDED': Превышено ограничение длины пути.
  • 'INVALID_PURPOSE': Неподдерживаемое назначение сертификата.
  • 'CERT_UNTRUSTED': Сертификат не является доверенным.
  • 'CERT_REJECTED': Сертификат отклонён.
  • 'HOSTNAME_MISMATCH': Имя хоста не совпадает.

При возникновении таких ошибок сертификата, как UNABLE_TO_VERIFY_LEAF_SIGNATURE, DEPTH_ZERO_SELF_SIGNED_CERT или UNABLE_TO_GET_ISSUER_CERT, Node.js добавляет подсказку с рекомендацией запустить программу с флагом --use-system-ca, если корневой CA установлен локально. Это помогает разработчикам выбрать безопасное решение и избежать небезопасных обходных путей.

Класс: tls.Server

Добавлено в: v0.3.2
  • Расширяет: <net.Server>

Принимает зашифрованные подключения с использованием TLS или SSL.

Событие: 'connection'

Добавлено в: v0.3.2
  • socket <stream.Duplex>

Это событие генерируется при установлении нового потока TCP, до начала рукопожатия TLS. socket обычно является объектом типа net.Socket, но не будет получать события, в отличие от сокета, созданного в результате события net.Server 'connection'. Обычно пользователям не требуется обращаться к этому событию.

Пользователи также могут явно генерировать это событие, чтобы внедрять подключения в TLS-сервер. В этом случае можно передать любой поток Duplex.

Событие: 'keylog'

Добавлено в: v12.3.0, v10.20.0
  • line <Buffer> Строка текста в кодировке ASCII в формате NSS SSLKEYLOGFILE.
  • tlsSocket <tls.TLSSocket> Экземпляр tls.TLSSocket, для которого он был сгенерирован.

Событие keylog генерируется, когда подключение к этому серверу создает или получает ключевой материал (обычно до завершения рукопожатия, но не обязательно). Этот ключевой материал можно сохранить для отладки, поскольку он позволяет расшифровать перехваченный трафик TLS. Для каждого сокета это событие может генерироваться несколько раз.

Типичный вариант использования — добавлять полученные строки в общий текстовый файл, который впоследствии используется программным обеспечением (например, Wireshark) для расшифровки трафика:

const logFile = fs.createWriteStream('/tmp/ssl-keys.log', { flags: 'a' });
// ...
server.on('keylog', (line, tlsSocket) => {
  if (tlsSocket.remoteAddress !== '...')
    return; // Only log keys for a particular IP
  logFile.write(line);
}); copy

Событие: 'newSession'

История
Версия Изменения
v0.11.12

Теперь поддерживается аргумент callback.

v0.9.2

Добавлено в: v0.9.2

Событие 'newSession' генерируется при создании нового сеанса TLS. Его можно использовать для сохранения сеансов во внешнем хранилище. Эти данные следует передать в обработчик 'resumeSession'.

При вызове в обработчик события передаются три аргумента:

  • sessionId <Buffer> Идентификатор сеанса TLS
  • sessionData <Buffer> Данные сеанса TLS
  • callback <Function> Функция обратного вызова без аргументов, которую необходимо вызвать, чтобы данные могли отправляться или приниматься через защищенное подключение.

Прослушивание этого события влияет только на подключения, установленные после добавления обработчика события.

Событие: 'OCSPRequest'

Добавлено в: v0.11.13

Событие 'OCSPRequest' генерируется, когда клиент отправляет запрос статуса сертификата. При вызове в обработчик события передаются три аргумента:

  • certificate <Buffer> Сертификат сервера
  • issuer <Buffer> Сертификат издателя
  • callback <Function> Функция обратного вызова, которую необходимо вызвать для предоставления результатов запроса OCSP.

Текущий сертификат сервера можно разобрать, чтобы получить URL-адрес OCSP и идентификатор сертификата; после получения ответа OCSP вызывается callback(null, resp), где resp — это экземпляр Buffer, содержащий ответ OCSP. И certificate, и issuer — это DER-представления Buffer основного сертификата и сертификата издателя. Их можно использовать для получения идентификатора сертификата OCSP и URL-адреса конечной точки OCSP.

Кроме того, можно вызвать callback(null, null), указав, что ответа OCSP нет.

Вызов callback(err) приведет к вызову socket.destroy(err).

Типичный процесс запроса OCSP выглядит следующим образом:

  1. Клиент подключается к серверу и отправляет 'OCSPRequest' (через расширение status info в ClientHello).
  2. Сервер получает запрос и генерирует событие 'OCSPRequest', вызывая обработчик, если он зарегистрирован.
  3. Сервер извлекает URL-адрес OCSP из certificate или issuer и отправляет запрос OCSP центру сертификации.
  4. Сервер получает 'OCSPResponse' от центра сертификации и отправляет его клиенту через аргумент callback
  5. Клиент проверяет ответ и либо уничтожает сокет, либо выполняет рукопожатие.

Значение issuer может быть null, если сертификат является самоподписанным или издатель отсутствует в списке корневых сертификатов. (Издатель можно указать с помощью параметра ca при установлении TLS-подключения.)

Прослушивание этого события влияет только на подключения, установленные после добавления обработчика события.

Для разбора сертификатов можно использовать npm-модуль, например asn1.js.

Событие: 'resumeSession'

Добавлено в: v0.9.2

Событие 'resumeSession' генерируется, когда клиент запрашивает возобновление предыдущего сеанса TLS. При вызове в обработчик события передаются два аргумента:

  • sessionId <Buffer> Идентификатор сеанса TLS
  • callback <Function> Функция обратного вызова, которую нужно вызвать после восстановления предыдущего сеанса: callback([err[, sessionData]])
    • err <Error>
    • sessionData <Buffer>

Обработчик события должен выполнить поиск во внешнем хранилище, чтобы найти sessionData, сохраненный обработчиком события 'newSession', используя предоставленный sessionId. Если сеанс найден, вызовите callback(null, sessionData), чтобы возобновить его. Если сеанс не найден, его нельзя возобновить. callback() необходимо вызвать без sessionData, чтобы рукопожатие могло продолжиться и создать новый сеанс. Можно вызвать callback(err), чтобы прервать входящее подключение и уничтожить сокет.

Прослушивание этого события влияет только на подключения, установленные после добавления обработчика события.

Ниже показано возобновление сеанса TLS:

const tlsSessionStore = {};
server.on('newSession', (id, data, cb) => {
  tlsSessionStore[id.toString('hex')] = data;
  cb();
});
server.on('resumeSession', (id, cb) => {
  cb(null, tlsSessionStore[id.toString('hex')] || null);
}); copy

Событие: 'secureConnection'

Добавлено в: v0.3.2

Событие 'secureConnection' генерируется после успешного завершения процесса рукопожатия для нового подключения. При вызове в обработчик события передается один аргумент:

  • tlsSocket <tls.TLSSocket> Установленный TLS-сокет.

Свойство tlsSocket.authorized — это boolean, указывающее, прошел ли клиент проверку одним из указанных центров сертификации сервера. Если tlsSocket.authorized имеет значение false, то socket.authorizationError устанавливается в значение, описывающее причину сбоя авторизации. В зависимости от настроек TLS-сервера неавторизованные подключения всё же могут быть приняты.

Свойство tlsSocket.alpnProtocol — это строка, содержащая выбранный протокол ALPN. Если протокол ALPN не выбран, поскольку клиент или сервер не отправил расширение ALPN, tlsSocket.alpnProtocol равно false.

Свойство tlsSocket.servername — это строка, содержащая запрошенное через SNI имя сервера.

Событие: 'tlsClientError'

Добавлено в: v6.0.0

Событие 'tlsClientError' генерируется, если ошибка возникает до установления защищенного подключения. При вызове в обработчик события передаются два аргумента:

  • exception <Error> Объект Error с описанием ошибки
  • tlsSocket <tls.TLSSocket> Экземпляр tls.TLSSocket, в котором произошла ошибка.

server.addContext(hostname, context)

Добавлено в: v0.5.3
  • hostname <string> Имя хоста SNI или подстановочный шаблон (например, '*')
  • context <Object> | <tls.SecureContext> Объект, содержащий любые допустимые свойства из аргументов options метода tls.createSecureContext() (например, key, cert, ca и т. д.) либо объект контекста TLS, созданный непосредственно с помощью tls.createSecureContext().

Метод server.addContext() добавляет защищенный контекст, который будет использоваться, если имя SNI в запросе клиента совпадает с указанным hostname (или подстановочным шаблоном).

Если совпадают несколько контекстов, используется последний добавленный.

server.address()

Добавлено в: v0.6.0
  • Возвращает: <Object>

Возвращает адрес привязки, имя семейства адресов и порт сервера, сообщаемые операционной системой. Дополнительные сведения см. в разделе net.Server.address().

server.close([callback])

Добавлено в: v0.3.2
  • callback <Function> Функция обратного вызова обработчика, регистрируемая для прослушивания события 'close' экземпляра сервера.
  • Возвращает: <tls.Server>

Метод server.close() прекращает прием новых подключений сервером.

Эта функция работает асинхронно. Событие 'close' будет сгенерировано, когда у сервера не останется открытых подключений.

server.getTicketKeys()

Добавлено в: v3.0.0
  • Возвращает: <Buffer> Буфер размером 48 байт, содержащий ключи билетов сеанса.

Возвращает ключи билетов сеанса.

Дополнительные сведения см. в разделе Возобновление сеанса.

server.listen()

Запускает прослушивание сервером зашифрованных подключений. Этот метод идентичен методу server.listen() класса net.Server.

server.setSecureContext(options)

Добавлено в: v11.0.0
  • options <Object> Объект, содержащий любые допустимые свойства из аргументов options метода tls.createSecureContext() (например, key, cert, ca и т. д.).

Метод server.setSecureContext() заменяет защищенный контекст существующего сервера. Существующие подключения к серверу не прерываются.

server.setTicketKeys(keys)

Добавлено в: v3.0.0
  • keys <Buffer> | <TypedArray> | <DataView> Буфер размером 48 байт, содержащий ключи билетов сеанса.

Устанавливает ключи билетов сеанса.

Изменения ключей билетов применяются только к будущим подключениям к серверу. Для существующих или ожидающих подключений к серверу будут использоваться предыдущие ключи.

Дополнительные сведения см. в разделе Возобновление сеанса.

Класс: tls.TLSSocket

Добавлено в: v0.11.4
  • Расширяет: <net.Socket>

Выполняет прозрачное шифрование записываемых данных и всю необходимую TLS-согласование.

Экземпляры tls.TLSSocket реализуют двунаправленный интерфейс Stream.

Методы, возвращающие метаданные TLS-соединения (например, tls.TLSSocket.getPeerCertificate()), возвращают данные только при открытом соединении.

new tls.TLSSocket(socket[, options])

История
Версия Изменения
v12.2.0

Теперь поддерживается параметр enableTrace.

v5.0.0

Теперь поддерживаются параметры ALPN.

v0.11.4

Добавлено в: v0.11.4

  • socket <net.Socket> | <stream.Duplex> На стороне сервера — любой поток Duplex. На стороне клиента — любой экземпляр net.Socket (для поддержки произвольных потоков Duplex на стороне клиента необходимо использовать tls.connect()).
  • options <Object>
    • enableTrace: см. tls.createServer()
    • isServer: протокол SSL/TLS асимметричен, поэтому TLSSockets должны знать, должны ли они работать как сервер или клиент. Если true, TLS-сокет будет создан в качестве сервера. По умолчанию: false.
    • server <net.Server> Экземпляр net.Server.
    • requestCert: следует ли аутентифицировать удалённый узел, запросив сертификат. Клиенты всегда запрашивают сертификат сервера. Серверы (isServer равно true) могут установить requestCert в true, чтобы запросить сертификат клиента.
    • rejectUnauthorized: см. tls.createServer()
    • ALPNProtocols: см. tls.createServer()
    • SNICallback: см. tls.createServer()
    • ALPNCallback: см. tls.createServer()
    • session <Buffer> Экземпляр Buffer, содержащий TLS-сеанс.
    • requestOCSP <boolean> Если true, указывает, что в сообщение client hello будет добавлено расширение запроса состояния OCSP, а до установления защищённого соединения на сокете будет сгенерировано событие 'OCSPResponse'.
    • secureContext: объект контекста TLS, созданный с помощью tls.createSecureContext(). Если secureContext не задан, он будет создан путём передачи всего объекта options в tls.createSecureContext().
    • ...: параметры tls.createSecureContext(), используемые, если параметр secureContext отсутствует. В противном случае они игнорируются.

Создаёт новый объект tls.TLSSocket на основе существующего TCP-сокета.

Событие: 'keylog'

Добавлено в: v12.3.0, v10.20.0
  • line <Buffer> Строка текста в формате SSLKEYLOGFILE NSS, состоящая из символов ASCII.

Событие keylog генерируется для tls.TLSSocket, когда сокет создает или получает ключевой материал. Этот материал ключей можно сохранить для отладки, поскольку он позволяет расшифровать перехваченный TLS-трафик. Событие может генерироваться несколько раз — до или после завершения рукопожатия.

Типичный сценарий использования — добавление полученных строк в общий текстовый файл, который впоследствии используется программами (например, Wireshark) для расшифровки трафика:

const logFile = fs.createWriteStream('/tmp/ssl-keys.log', { flags: 'a' });
// ...
tlsSocket.on('keylog', (line) => logFile.write(line)); copy

Событие: 'OCSPResponse'

Добавлено в: v0.11.13

Событие 'OCSPResponse' генерируется, если при создании tls.TLSSocket был задан параметр requestOCSP и получен ответ OCSP. При вызове слушатель получает один аргумент:

  • response <Buffer> Ответ OCSP сервера

Обычно response — это объект с цифровой подписью центра сертификации сервера, содержащий сведения об отзыве сертификата сервера.

Событие: 'secure'

Добавлено в: v0.11.4

Событие 'secure' генерируется после успешного завершения TLS-рукопожатия и установления защищённого соединения.

Это событие генерируется для экземпляров <tls.TLSSocket> как на стороне клиента, так и на стороне сервера, в том числе для сокетов, созданных с помощью конструктора new tls.TLSSocket().

Событие: 'secureConnect'

Добавлено в: v0.11.4

Событие 'secureConnect' генерируется после успешного завершения процесса рукопожатия для нового соединения. Функция обратного вызова слушателя вызывается независимо от того, был ли сертификат сервера авторизован. Клиент должен проверить свойство tlsSocket.authorized, чтобы определить, подписан ли сертификат сервера одним из указанных центров сертификации. Если tlsSocket.authorized === false, ошибку можно обнаружить, проверив свойство tlsSocket.authorizationError. Если использовался ALPN, свойство tlsSocket.alpnProtocol можно проверить, чтобы определить согласованный протокол.

Событие 'secureConnect' не генерируется, если <tls.TLSSocket> создан с помощью конструктора new tls.TLSSocket().

Событие: 'session'

Добавлено в: v11.10.0
  • session <Buffer>

Событие 'session' генерируется для клиентского tls.TLSSocket, когда становится доступен новый сеанс или TLS-билет. В зависимости от согласованной версии протокола TLS это может произойти до или после завершения рукопожатия. На сервере событие не генерируется, а также оно не генерируется, если новый сеанс не был создан, например, при возобновлении соединения. Для некоторых версий протокола TLS событие может генерироваться несколько раз; в таком случае все сеансы можно использовать для возобновления соединения.

На клиенте session можно передать в параметр session функции tls.connect(), чтобы возобновить соединение.

Дополнительные сведения см. в разделе Возобновление сеанса.

Для TLSv1.2 и более ранних версий после завершения рукопожатия можно вызвать tls.TLSSocket.getSession(). В TLSv1.3 протокол допускает возобновление только на основе билетов; отправляется несколько билетов, и они передаются только после завершения рукопожатия. Поэтому, чтобы получить сеанс, пригодный для возобновления, необходимо дождаться события 'session'. Приложениям следует использовать событие 'session' вместо getSession(), чтобы обеспечить совместимость со всеми версиями TLS. Приложениям, которым достаточно получить или использовать один сеанс, следует подписаться на это событие только один раз:

tlsSocket.once('session', (session) => {
  // The session can be used immediately or later.
  tls.connect({
    session: session,
    // Other connect options...
  });
}); copy

tlsSocket.address()

История
Версия Изменения
v18.4.0

Теперь свойство family возвращает строку вместо числа.

v18.0.0

Теперь свойство family возвращает число вместо строки.

v0.11.4

Добавлено в: v0.11.4

  • Возвращает: <Object>

Возвращает привязанный address, имя адреса family и port базового сокета согласно данным операционной системы: { port: 12346, family: 'IPv4', address: '127.0.0.1' }.

tlsSocket.authorizationError

Добавлено в: v0.11.4

Возвращает причину, по которой сертификат узла не прошёл проверку. Это свойство задаётся только в том случае, если tlsSocket.authorized === false.

tlsSocket.authorized

Добавлено в: v0.11.4
  • Тип: <boolean>

Это свойство равно true, если сертификат узла подписан одним из центров сертификации, указанных при создании экземпляра tls.TLSSocket; в противном случае оно равно false.

tlsSocket.disableRenegotiation()

Добавлено в: v8.4.0

Отключает повторное согласование TLS для этого экземпляра TLSSocket. После вызова попытки повторного согласования вызовут событие 'error' для TLSSocket.

tlsSocket.enableTrace()

Добавлено в: v12.2.0

Если трассировка включена, сведения о трассировке TLS-пакетов записываются в stderr. Это можно использовать для отладки проблем с TLS-соединением.

Формат вывода идентичен выводу openssl s_client -trace или openssl s_server -trace. Хотя он формируется функцией SSL_trace() из OpenSSL, формат не документирован, может измениться без предупреждения, и полагаться на него не следует.

tlsSocket.encrypted

Добавлено в: v0.11.4

Всегда возвращает true. Это можно использовать, чтобы отличать TLS-сокеты от обычных экземпляров net.Socket.

tlsSocket.exportKeyingMaterial(length, label[, context])

Добавлено в: v13.10.0, v12.17.0
  • length <number> количество байтов, извлекаемых из ключевого материала

  • label <string> специфичная для приложения метка; обычно это значение из реестра меток экспортёра IANA.

  • context <Buffer> Необязательный контекст.

  • Возвращает: <Buffer> запрошенные байты ключевого материала

Ключевой материал используется для проверки данных, чтобы предотвратить различные виды атак на сетевые протоколы, например, в спецификациях IEEE 802.1X.

Пример

const keyingMaterial = tlsSocket.exportKeyingMaterial(
  128,
  'client finished');

/*
 Example return value of keyingMaterial:
 <Buffer 76 26 af 99 c5 56 8e 42 09 91 ef 9f 93 cb ad 6c 7b 65 f8 53 f1 d8 d9
    12 5a 33 b8 b5 25 df 7b 37 9f e0 e2 4f b8 67 83 a3 2f cd 5d 41 42 4c 91
    74 ef 2c ... 78 more bytes>
*/ copy

Дополнительные сведения см. в документации OpenSSL для SSL_export_keying_material.

tlsSocket.getCertificate()

Добавлено в: v11.2.0
  • Возвращает: <Object>

Возвращает объект, представляющий локальный сертификат. Возвращённый объект содержит свойства, соответствующие некоторым полям сертификата.

Пример структуры сертификата см. в разделе tls.TLSSocket.getPeerCertificate().

Если локального сертификата нет, будет возвращён пустой объект. Если сокет уничтожен, будет возвращено null.

tlsSocket.getCipher()

История
Версия Изменения
v13.4.0, v12.16.0

Имя шифра IETF теперь возвращается как standardName.

v12.0.0

Теперь возвращается минимальная версия шифра вместо фиксированной строки ('TLSv1/SSLv3').

v0.11.4

Добавлено в: v0.11.4

  • Возвращает: <Object>
    • name <string> Имя набора шифров в OpenSSL.
    • standardName <string> Имя набора шифров в IETF.
    • version <string> Минимальная версия протокола TLS, поддерживаемая этим набором шифров. Фактически согласованную версию протокола см. в разделе tls.TLSSocket.getProtocol().

Возвращает объект со сведениями о согласованном наборе шифров.

Например, протокол TLSv1.2 с шифром AES256-SHA:

{
    "name": "AES256-SHA",
    "standardName": "TLS_RSA_WITH_AES_256_CBC_SHA",
    "version": "SSLv3"
} copy

Дополнительные сведения см. в разделе SSL_CIPHER_get_name.

tlsSocket.getEphemeralKeyInfo()

Добавлено в: v5.0.0
  • Возвращает: <Object>

Возвращает объект, представляющий тип, имя и размер параметра эфемерного обмена ключами при совершенной прямой секретности в клиентском соединении. Если обмен ключами не является эфемерным, возвращается пустой объект. Поскольку эта возможность поддерживается только для клиентского сокета, при вызове на серверном сокете возвращается null. Поддерживаются типы 'DH' и 'ECDH'. Свойство name доступно только при типе 'ECDH'.

Например: { type: 'ECDH', name: 'prime256v1', size: 256 }.

tlsSocket.getFinished()

Добавлено в: v9.9.0
  • Возвращает: <Buffer> | <undefined> Последнее сообщение Finished, отправленное сокету в рамках рукопожатия SSL/TLS, или undefined, если сообщение Finished ещё не отправлялось.

Поскольку сообщения Finished представляют собой дайджесты сообщений всего рукопожатия (общим объёмом 192 бита для TLS 1.0 и больше для SSL 3.0), их можно использовать для внешних процедур аутентификации, если аутентификация, предоставляемая SSL/TLS, нежелательна или недостаточна.

Соответствует подпрограмме SSL_get_finished в OpenSSL и может использоваться для реализации привязки канала tls-unique из RFC 5929.

tlsSocket.getPeerCertificate([detailed])

Добавлено в: v0.11.4
  • detailed <boolean> Включает всю цепочку сертификатов, если true, в противном случае включает только сертификат узла-партнёра.
  • Возвращает: <Object> Объект сертификата.

Возвращает объект, представляющий сертификат узла-партнёра. Если узел-партнёр не предоставил сертификат, возвращается пустой объект. Если сокет был уничтожен, возвращается null.

Если запрошена вся цепочка сертификатов, каждый сертификат будет содержать свойство issuerCertificate с объектом, представляющим сертификат его издателя.

Объект сертификата
История
Версия Изменения
v19.1.0, v18.13.0

Добавлено свойство "ca".

v17.2.0, v16.14.0

Добавлен fingerprint512.

v11.4.0

Добавлена поддержка сведений об открытом ключе на эллиптических кривых.

Объект сертификата содержит свойства, соответствующие полям сертификата.

  • ca <boolean> true, если это центр сертификации (CA), и false в противном случае.
  • raw <Buffer> Данные сертификата X.509 в кодировке DER.
  • subject <Object> Субъект сертификата, описанный с помощью страны (C), штата или провинции (ST), населённого пункта (L), организации (O), подразделения организации (OU) и общего имени (CN). В сертификатах TLS общее имя обычно является именем DNS. Пример: {C: 'UK', ST: 'BC', L: 'Metro', O: 'Node Fans', OU: 'Docs', CN: 'example.com'}.
  • issuer <Object> Издатель сертификата, описанный в тех же терминах, что и subject.
  • valid_from <string> Дата и время, с которых сертификат действителен.
  • valid_to <string> Дата и время, до которых сертификат действителен.
  • serialNumber <string> Серийный номер сертификата в виде шестнадцатеричной строки. Пример: 'B9B0D332A1AA5635'.
  • fingerprint <string> Дайджест SHA-1 сертификата в кодировке DER. Возвращается в виде шестнадцатеричной строки с разделителями :. Пример: '2A:7A:C2:DD:...'.
  • fingerprint256 <string> Дайджест SHA-256 сертификата в кодировке DER. Возвращается в виде шестнадцатеричной строки с разделителями :. Пример: '2A:7A:C2:DD:...'.
  • fingerprint512 <string> Дайджест SHA-512 сертификата в кодировке DER. Возвращается в виде шестнадцатеричной строки с разделителями :. Пример: '2A:7A:C2:DD:...'.
  • ext_key_usage <Array> (Необязательно) Расширенное использование ключа — набор OID.
  • subjectaltname <string> (Необязательно) Строка, содержащая объединённые имена субъекта; альтернатива именам subject.
  • infoAccess <Array> (Необязательно) Массив с описанием AuthorityInfoAccess, используемый с OCSP.
  • issuerCertificate <Object> (Необязательно) Объект сертификата издателя. Для самоподписанных сертификатов он может содержать циклическую ссылку.

В зависимости от типа ключа сертификат может содержать сведения об открытом ключе.

Для ключей RSA могут быть определены следующие свойства:

  • bits <number> Размер ключа RSA в битах. Пример: 1024.
  • exponent <string> Экспонента RSA в виде строки с шестнадцатеричной записью числа. Пример: '0x010001'.
  • modulus <string> Модуль RSA в виде шестнадцатеричной строки. Пример: 'B56CE45CB7...'.
  • pubkey <Buffer> Открытый ключ.

Для ключей EC могут быть определены следующие свойства:

  • pubkey <Buffer> Открытый ключ.
  • bits <number> Размер ключа в битах. Пример: 256.
  • asn1Curve <string> (Необязательно) Имя ASN.1 для OID эллиптической кривой. Известные кривые идентифицируются с помощью OID. Хотя это встречается редко, кривая может быть идентифицирована по её математическим свойствам; в таком случае у неё не будет OID. Пример: 'prime256v1'.
  • nistCurve <string> (Необязательно) Имя NIST для эллиптической кривой, если оно есть (не всем известным кривым NIST присвоил имена). Пример: 'P-256'.

Пример сертификата:

{ subject:
   { OU: [ 'Domain Control Validated', 'PositiveSSL Wildcard' ],
     CN: '*.nodejs.org' },
  issuer:
   { C: 'GB',
     ST: 'Greater Manchester',
     L: 'Salford',
     O: 'COMODO CA Limited',
     CN: 'COMODO RSA Domain Validation Secure Server CA' },
  subjectaltname: 'DNS:*.nodejs.org, DNS:nodejs.org',
  infoAccess:
   { 'CA Issuers - URI':
      [ 'http://crt.comodoca.com/COMODORSADomainValidationSecureServerCA.crt' ],
     'OCSP - URI': [ 'http://ocsp.comodoca.com' ] },
  modulus: 'B56CE45CB740B09A13F64AC543B712FF9EE8E4C284B542A1708A27E82A8D151CA178153E12E6DDA15BF70FFD96CB8A88618641BDFCCA03527E665B70D779C8A349A6F88FD4EF6557180BD4C98192872BCFE3AF56E863C09DDD8BC1EC58DF9D94F914F0369102B2870BECFA1348A0838C9C49BD1C20124B442477572347047506B1FCD658A80D0C44BCC16BC5C5496CFE6E4A8428EF654CD3D8972BF6E5BFAD59C93006830B5EB1056BBB38B53D1464FA6E02BFDF2FF66CD949486F0775EC43034EC2602AEFBF1703AD221DAA2A88353C3B6A688EFE8387811F645CEED7B3FE46E1F8B9F59FAD028F349B9BC14211D5830994D055EEA3D547911E07A0ADDEB8A82B9188E58720D95CD478EEC9AF1F17BE8141BE80906F1A339445A7EB5B285F68039B0F294598A7D1C0005FC22B5271B0752F58CCDEF8C8FD856FB7AE21C80B8A2CE983AE94046E53EDE4CB89F42502D31B5360771C01C80155918637490550E3F555E2EE75CC8C636DDE3633CFEDD62E91BF0F7688273694EEEBA20C2FC9F14A2A435517BC1D7373922463409AB603295CEB0BB53787A334C9CA3CA8B30005C5A62FC0715083462E00719A8FA3ED0A9828C3871360A73F8B04A4FC1E71302844E9BB9940B77E745C9D91F226D71AFCAD4B113AAF68D92B24DDB4A2136B55A1CD1ADF39605B63CB639038ED0F4C987689866743A68769CC55847E4A06D6E2E3F1',
  exponent: '0x10001',
  pubkey: <Buffer ... >,
  valid_from: 'Aug 14 00:00:00 2017 GMT',
  valid_to: 'Nov 20 23:59:59 2019 GMT',
  fingerprint: '01:02:59:D9:C3:D2:0D:08:F7:82:4E:44:A4:B4:53:C5:E2:3A:87:4D',
  fingerprint256: '69:AE:1A:6A:D4:3D:C6:C1:1B:EA:C6:23:DE:BA:2A:14:62:62:93:5C:7A:EA:06:41:9B:0B:BC:87:CE:48:4E:02',
  fingerprint512: '19:2B:3E:C3:B3:5B:32:E8:AE:BB:78:97:27:E4:BA:6C:39:C9:92:79:4F:31:46:39:E2:70:E5:5F:89:42:17:C9:E8:64:CA:FF:BB:72:56:73:6E:28:8A:92:7E:A3:2A:15:8B:C2:E0:45:CA:C3:BC:EA:40:52:EC:CA:A2:68:CB:32',
  ext_key_usage: [ '1.3.6.1.5.5.7.3.1', '1.3.6.1.5.5.7.3.2' ],
  serialNumber: '66593D57F20CBC573E433381B5FEC280',
  raw: <Buffer ... > } copy

tlsSocket.getPeerFinished()

Добавлено в: v9.9.0
  • Возвращает: <Buffer> | <undefined> Последнее сообщение Finished, которое ожидается или уже получено от сокета в рамках рукопожатия SSL/TLS, либо undefined, если сообщение Finished ещё не получено.

Поскольку сообщения Finished представляют собой дайджесты сообщений всего рукопожатия (общим объёмом 192 бита для TLS 1.0 и больше для SSL 3.0), их можно использовать для внешних процедур аутентификации, если аутентификация, предоставляемая SSL/TLS, нежелательна или недостаточна.

Соответствует подпрограмме SSL_get_peer_finished в OpenSSL и может использоваться для реализации привязки канала tls-unique из RFC 5929.

tlsSocket.getPeerX509Certificate()

Добавлено в: v15.9.0
  • Возвращает: <X509Certificate>

Возвращает сертификат узла-партнёра в виде объекта <X509Certificate>.

Если сертификат узла-партнёра отсутствует или сокет был уничтожен, возвращается undefined.

tlsSocket.getProtocol()

Добавлено в: v5.7.0
  • Возвращает: <string> | <null>

Возвращает строку с согласованной версией протокола SSL/TLS для текущего соединения. Для подключённых сокетов, у которых ещё не завершился процесс рукопожатия, возвращается значение 'unknown'. Для серверных сокетов или отключённых клиентских сокетов возвращается значение null.

Версии протокола:

  • 'SSLv3'
  • 'TLSv1'
  • 'TLSv1.1'
  • 'TLSv1.2'
  • 'TLSv1.3'

Дополнительные сведения см. в документации OpenSSL по SSL_get_version.

tlsSocket.getSession()

Добавлено в: v0.11.4
  • Тип: <Buffer>

Возвращает данные сеанса TLS или undefined, если сеанс не был согласован. На клиенте эти данные можно передать в параметр session функции tls.connect(), чтобы возобновить соединение. На сервере они могут быть полезны для отладки.

Дополнительные сведения см. в разделе Возобновление сеанса.

Примечание: getSession() работает только для TLSv1.2 и более ранних версий. Для TLSv1.3 приложения должны использовать событие 'session' (оно также работает для TLSv1.2 и более ранних версий).

tlsSocket.getSharedSigalgs()

Добавлено в: v12.11.0
  • Возвращает: <Array> Список алгоритмов подписи, общих для сервера и клиента, в порядке убывания предпочтения.

Дополнительные сведения см. в документации по SSL_get_shared_sigalgs.

tlsSocket.getTLSTicket()

Добавлено в: v0.11.4
  • Тип: <Buffer>

Для клиента возвращает билет сеанса TLS, если он доступен, или undefined. Для сервера всегда возвращает undefined.

Может быть полезно для отладки.

Дополнительные сведения см. в разделе Возобновление сеанса.

tlsSocket.getX509Certificate()

Добавлено в: v15.9.0
  • Возвращает: <X509Certificate>

Возвращает локальный сертификат в виде объекта <X509Certificate>.

Если локальный сертификат отсутствует или сокет был уничтожен, возвращается undefined.

tlsSocket.isSessionReused()

Добавлено в: v0.5.6
  • Возвращает: <boolean> true, если сеанс был использован повторно, и false в противном случае.

Дополнительные сведения см. в разделе Возобновление сеанса.

tlsSocket.localAddress

Добавлено в: v0.11.4
  • Тип: <string>

Возвращает строковое представление локального IP-адреса.

tlsSocket.localPort

Добавлено в: v0.11.4
  • Тип: <integer>

Возвращает числовое представление локального порта.

tlsSocket.remoteAddress

Добавлено в: v0.11.4
  • Тип: <string>

Возвращает строковое представление удаленного IP-адреса. Например, '74.125.127.100' или '2001:4860:a005::68'.

tlsSocket.remoteFamily

Добавлено в: v0.11.4
  • Тип: <string>

Возвращает строковое представление семейства удаленного IP-адреса. 'IPv4' или 'IPv6'.

tlsSocket.remotePort

Добавлено в: v0.11.4
  • Тип: <integer>

Возвращает числовое представление удаленного порта. Например, 443.

tlsSocket.renegotiate(options, callback)

История
Версия Изменения
v18.0.0

Теперь передача недопустимого обратного вызова в аргумент callback вызывает ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK.

v0.11.8

Добавлено в: v0.11.8

  • options <Object>

    • rejectUnauthorized <boolean> Если значение не равно false, сертификат сервера проверяется по списку предоставленных центров сертификации. Если проверка завершается неудачно, генерируется событие 'error'; err.code содержит код ошибки OpenSSL. По умолчанию: true.
    • requestCert
  • callback <Function> Если renegotiate() возвращает true, обратный вызов однократно добавляется к событию 'secure'. Если renegotiate() возвращает false, callback будет вызван в следующем цикле событий с ошибкой, если только tlsSocket не был уничтожен; в этом случае callback вообще не будет вызван.

  • Возвращает: <boolean> true, если инициирована повторная установка соединения, иначе false.

Метод tlsSocket.renegotiate() инициирует процесс повторной установки TLS-соединения. По его завершении функции callback будет передан один аргумент: либо Error (если запрос завершился неудачно), либо null.

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

При работе в режиме сервера сокет будет уничтожен с ошибкой по истечении времени ожидания handshakeTimeout.

Для TLSv1.3 повторную установку соединения инициировать нельзя, поскольку протокол ее не поддерживает.

tlsSocket.setKeyCert(context)

Добавлено в: v22.5.0, v20.17.0
  • context <Object> | <tls.SecureContext> Объект, содержащий как минимум свойства key и cert из options tls.createSecureContext() либо объект контекста TLS, созданный непосредственно с помощью tls.createSecureContext().

Метод tlsSocket.setKeyCert() задает закрытый ключ и сертификат, которые будут использоваться сокетом. Это особенно полезно, если необходимо выбрать сертификат сервера из ALPNCallback TLS-сервера.

tlsSocket.setMaxSendFragment(size)

Добавлено в: v0.11.11
  • size <number> Максимальный размер фрагмента TLS. Максимальное значение — 16384. По умолчанию: 16384.
  • Возвращает: <boolean>

Метод tlsSocket.setMaxSendFragment() задает максимальный размер фрагмента TLS. Возвращает true, если ограничение удалось установить, и false в противном случае.

Уменьшение размера фрагментов снижает задержку буферизации на клиенте: крупные фрагменты буферизуются на уровне TLS до получения всего фрагмента и проверки его целостности; крупные фрагменты могут передаваться в течение нескольких циклов обмена данными, а их обработка может задерживаться из-за потери или переупорядочивания пакетов. Однако небольшие фрагменты увеличивают накладные расходы на кадрирование TLS и загрузку процессора, что может снизить общую пропускную способность сервера.

tls.checkServerIdentity(hostname, cert)

История
Версия Изменения
v17.3.1, v16.13.2, v14.18.3, v12.22.9

Поддержка альтернативных имен субъекта uniformResourceIdentifier отключена в ответ на CVE-2021-44531.

v0.8.4

Добавлено в: v0.8.4

  • hostname <string> Имя хоста или IP-адрес, с которым нужно сверить сертификат.
  • cert <Object> Объект сертификата, представляющий сертификат узла.
  • Возвращает: <Error> | <undefined>

Проверяет, выдан ли сертификат cert для hostname.

В случае ошибки возвращает объект <Error>, заполняя его полями reason, host и cert. В случае успеха возвращает <undefined>.

Эта функция предназначена для использования совместно с параметром checkServerIdentity, который можно передать в tls.connect(), и поэтому работает с объектом сертификата. В других случаях рассмотрите возможность использования вместо нее x509.checkHost().

Эту функцию можно переопределить, передав альтернативную функцию в качестве параметра options.checkServerIdentity, который передается в tls.connect(). Переопределяющая функция, разумеется, может вызвать tls.checkServerIdentity(), чтобы дополнить выполняемые проверки дополнительной верификацией.

Эта функция вызывается только в том случае, если сертификат прошел все остальные проверки, например проверку на выдачу доверенным центром сертификации (options.ca).

В более ранних версиях Node.js сертификаты для заданного hostname ошибочно принимались при наличии соответствующего альтернативного имени субъекта uniformResourceIdentifier (см. CVE-2021-44531). Приложения, которым необходимо принимать альтернативные имена субъекта uniformResourceIdentifier, могут использовать пользовательскую функцию options.checkServerIdentity, реализующую требуемое поведение.

tls.connect(options[, callback])

История
Версия Изменения
v15.1.0, v14.18.0

Добавлена опция onread.

v14.1.0, v13.14.0

Теперь принимается опция highWaterMark.

v13.6.0, v12.16.0

Теперь поддерживается опция pskCallback.

v12.9.0

Добавлена поддержка опции allowHalfOpen.

v12.4.0

Теперь поддерживается опция hints.

v12.2.0

Теперь поддерживается опция enableTrace.

v11.8.0, v10.16.0

Теперь поддерживается опция timeout.

v8.0.0

Теперь поддерживается опция lookup.

v8.0.0

Теперь опцией ALPNProtocols может быть TypedArray или DataView.

v5.0.0

Теперь поддерживаются параметры ALPN.

v5.3.0, v4.7.0

Теперь поддерживается опция secureContext.

v0.11.3

Добавлено в: v0.11.3

  • options <Object>
    • enableTrace: см. tls.createServer()
    • host <string> Узел, к которому должен подключиться клиент. По умолчанию: 'localhost'.
    • port <number> Порт, к которому должен подключиться клиент.
    • path <string> Создает подключение через сокет Unix по указанному пути. Если эта опция задана, host и port игнорируются.
    • socket <stream.Duplex> Устанавливает защищенное соединение через указанный сокет вместо создания нового сокета. Обычно это экземпляр net.Socket, но допускается любой поток Duplex. Если эта опция задана, path, host и port игнорируются, за исключением проверки сертификата. Обычно передаваемый в tls.connect() сокет уже подключен, но подключение может быть выполнено и позже. Подключение, отключение и уничтожение socket являются ответственностью пользователя; вызов tls.connect() не приведет к вызову net.connect().
    • allowHalfOpen <boolean> Если установлено значение false, сокет автоматически завершит записываемую сторону, когда завершится читаемая сторона. Если задана опция socket, эта опция не действует. Подробности см. в описании опции allowHalfOpen для net.Socket. По умолчанию: false.
    • rejectUnauthorized <boolean> Если значение не равно false, сертификат сервера проверяется по списку предоставленных центров сертификации. При ошибке проверки генерируется событие 'error'; err.code содержит код ошибки OpenSSL. По умолчанию: true.
    • pskCallback <Function> О согласовании TLS-PSK см. раздел Предварительно общие ключи.
    • ALPNProtocols <string[]> | <Buffer> | <TypedArray> | <DataView> Массив строк или один объект Buffer, TypedArray либо DataView, содержащий поддерживаемые протоколы ALPN. Буферы должны иметь формат [len][name][len][name]..., например '\x08http/1.1\x08http/1.0', где байт len задает длину следующего имени протокола. Обычно передать массив гораздо проще, например ['http/1.1', 'http/1.0']. Протоколы, стоящие в списке раньше, имеют более высокий приоритет.
    • servername <string> Имя сервера для расширения TLS SNI (Server Name Indication). Это имя узла, к которому выполняется подключение; оно должно быть именем узла, а не IP-адресом. Многосетевой сервер может использовать его для выбора сертификата, который следует предъявить клиенту. См. описание опции SNICallback для tls.createServer().
    • checkServerIdentity(servername, cert) <Function> Функция обратного вызова, которая используется вместо встроенной функции tls.checkServerIdentity() при проверке имени узла сервера (или явно заданного значения servername) по сертификату. При ошибке проверки она должна возвращать <Error>. Метод должен возвращать undefined, если проверка servername и cert прошла успешно.
    • session <Buffer> Экземпляр Buffer, содержащий сеанс TLS.
    • requestOCSP <boolean> Если значение равно true, расширение запроса статуса OCSP добавляется в сообщение ClientHello, а до установления защищенного соединения в сокете генерируется событие 'OCSPResponse'.
    • minDHSize <number> Минимальный размер параметра DH в битах для принятия TLS-подключения. Если сервер предлагает параметр DH размером меньше minDHSize, TLS-подключение уничтожается и генерируется ошибка. По умолчанию: 1024.
    • highWaterMark <number> Соответствует параметру highWaterMark читаемого потока. По умолчанию: 16 * 1024.
    • timeout: <number> Если задано и сокет создается внутри, вызывает socket.setTimeout(timeout) после создания сокета, но до начала подключения.
    • secureContext: Объект контекста TLS, созданный с помощью tls.createSecureContext(). Если secureContext не задан, он будет создан путем передачи всего объекта options в tls.createSecureContext().
    • onread <Object> Если опция socket отсутствует, входящие данные сохраняются в одном buffer и передаются указанному callback при поступлении данных в сокет; в противном случае эта опция игнорируется. Подробности см. в описании опции onread для net.Socket.
    • ...: опции tls.createSecureContext(), используемые, если опция secureContext отсутствует; в противном случае они игнорируются.
    • ...: любая опция socket.connect(), не перечисленная выше.
  • callback <Function>
  • Возвращает: <tls.TLSSocket>

Указанная функция callback будет добавлена в качестве обработчика события 'secureConnect'.

tls.connect() возвращает объект tls.TLSSocket.

В отличие от API https, tls.connect() по умолчанию не включает расширение SNI (Server Name Indication), из-за чего некоторые серверы могут вернуть неверный сертификат или полностью отклонить подключение. Чтобы включить SNI, задайте опцию servername вместе с host.

Ниже показан клиент для примера эхо-сервера из раздела tls.createServer():

Модули JavaScript
// Assumes an echo server that is listening on port 8000.
import { connect } from 'node:tls';
import { readFileSync } from 'node:fs';
import { stdin } from 'node:process';

const options = {
  // Necessary only if the server requires client certificate authentication.
  key: readFileSync('client-key.pem'),
  cert: readFileSync('client-cert.pem'),

  // Necessary only if the server uses a self-signed certificate.
  ca: [ readFileSync('server-cert.pem') ],

  // Necessary only if the server's cert isn't for "localhost".
  checkServerIdentity: () => { return null; },
};

const socket = connect(8000, options, () => {
  console.log('client connected',
              socket.authorized ? 'authorized' : 'unauthorized');
  stdin.pipe(socket);
  stdin.resume();
});
socket.setEncoding('utf8');
socket.on('data', (data) => {
  console.log(data);
});
socket.on('end', () => {
  console.log('server ends connection');
});
CommonJS
// Assumes an echo server that is listening on port 8000.
const { connect } = require('node:tls');
const { readFileSync } = require('node:fs');

const options = {
  // Necessary only if the server requires client certificate authentication.
  key: readFileSync('client-key.pem'),
  cert: readFileSync('client-cert.pem'),

  // Necessary only if the server uses a self-signed certificate.
  ca: [ readFileSync('server-cert.pem') ],

  // Necessary only if the server's cert isn't for "localhost".
  checkServerIdentity: () => { return null; },
};

const socket = connect(8000, options, () => {
  console.log('client connected',
              socket.authorized ? 'authorized' : 'unauthorized');
  process.stdin.pipe(socket);
  process.stdin.resume();
});
socket.setEncoding('utf8');
socket.on('data', (data) => {
  console.log(data);
});
socket.on('end', () => {
  console.log('server ends connection');
});

Чтобы создать сертификат и ключ для этого примера, выполните команду:

openssl req -x509 -newkey rsa:2048 -nodes -sha256 -subj '/CN=localhost' \
  -keyout client-key.pem -out client-cert.pem copy

Затем, чтобы создать сертификат server-cert.pem для этого примера, выполните команду:

openssl pkcs12 -certpbe AES-256-CBC -export -out server-cert.pem \
  -inkey client-key.pem -in client-cert.pem copy

tls.connect(path[, options][, callback])

Добавлено в: v0.11.3
  • path <string> Значение по умолчанию для options.path.
  • options <Object> См. tls.connect().
  • callback <Function> См. tls.connect().
  • Возвращает: <tls.TLSSocket>

То же, что и tls.connect(), за исключением того, что path можно передать в качестве аргумента, а не опции.

Если задана опция path, она имеет приоритет над аргументом path.

tls.connect(port[, host][, options][, callback])

Добавлено в: v0.11.3
  • port <number> Значение по умолчанию для options.port.
  • host <string> Значение по умолчанию для options.host.
  • options <Object> См. tls.connect().
  • callback <Function> См. tls.connect().
  • Возвращает: <tls.TLSSocket>

То же, что и tls.connect(), за исключением того, что port и host можно передать в качестве аргументов, а не опций.

Если заданы опции port или host, они имеют приоритет над соответствующими аргументами port или host.

tls.createSecureContext([options])

История
Версия Изменения
v22.9.0, v20.18.0

Добавлен параметр allowPartialTrustChain.

v22.4.0, v20.16.0

Параметры clientCertEngine, privateKeyEngine и privateKeyIdentifier зависят от поддержки пользовательского движка в OpenSSL, которая объявлена устаревшей в OpenSSL 3.

v19.8.0, v18.16.0

Теперь параметру dhparam можно присвоить значение 'auto', чтобы включить DHE с соответствующими общепринятыми параметрами.

v12.12.0

Добавлены параметры privateKeyIdentifier и privateKeyEngine для получения закрытого ключа из движка OpenSSL.

v12.11.0

Добавлен параметр sigalgs для переопределения поддерживаемых алгоритмов подписи.

v12.0.0

Добавлена поддержка TLSv1.3.

v11.5.0

Теперь параметр ca: поддерживает BEGIN TRUSTED CERTIFICATE.

v11.4.0, v10.16.0

Параметры minVersion и maxVersion можно использовать для ограничения допустимых версий протокола TLS.

v10.0.0

Из-за изменения в OpenSSL параметру ecdhCurve больше нельзя присвоить значение false.

v9.3.0

Теперь параметр options может содержать clientCertEngine.

v9.0.0

Теперь параметр ecdhCurve может содержать несколько имен кривых ':', разделенных 'auto'.

v7.3.0

Если параметр key является массивом, отдельным элементам больше не требуется свойство passphrase. Элементами Array теперь также могут быть просто string или Buffer.

v5.2.0

Теперь параметр ca может быть одной строкой, содержащей несколько сертификатов CA.

v0.11.13

Добавлено в: v0.11.13

  • options <Object>
    • allowPartialTrustChain <boolean> Считать промежуточные (не самоподписанные) сертификаты в списке доверенных сертификатов УЦ доверенными.
    • ca <string> | <string[]> | <Buffer> | <Buffer[]> При необходимости переопределяет доверенные сертификаты УЦ. Если параметр не указан, сертификаты УЦ, считающиеся доверенными по умолчанию, совпадают с сертификатами, возвращаемыми tls.getCACertificates() с использованием типа default. Если параметр указан, он полностью заменяет список по умолчанию сертификатами из параметра ca, а не дополняет его. Если нужно добавить дополнительные сертификаты, а не полностью заменить список по умолчанию, пользователям необходимо объединить списки вручную. Значением может быть строка или Buffer либо Array строк и/или Buffer. Любая строка или Buffer может содержать несколько объединённых PEM-сертификатов УЦ. Чтобы соединение прошло аутентификацию, сертификат узла должен иметь цепочку до УЦ, которому доверяет сервер. При использовании сертификатов, не имеющих цепочки до общепризнанного УЦ, сертификат УЦ необходимо явно указать как доверенный, иначе аутентификация соединения завершится неудачно. Если узел использует сертификат, который не совпадает ни с одним из сертификатов УЦ по умолчанию и не имеет до них цепочки, используйте параметр ca, чтобы предоставить сертификат УЦ, которому соответствует сертификат узла или до которого он имеет цепочку. Для самоподписанных сертификатов сам сертификат является собственным УЦ и должен быть предоставлен. Для сертификатов в кодировке PEM поддерживаются типы "TRUSTED CERTIFICATE", "X509 CERTIFICATE" и "CERTIFICATE".
    • cert <string> | <string[]> | <Buffer> | <Buffer[]> Цепочки сертификатов в формате PEM. Для каждого закрытого ключа необходимо предоставить одну цепочку сертификатов. Каждая цепочка сертификатов должна состоять из сертификата в формате PEM для предоставленного закрытого key, за которым в соответствующем порядке следуют промежуточные сертификаты в формате PEM (если они есть); корневой УЦ включать не нужно (корневой УЦ должен быть заранее известен узлу, см. ca). При передаче нескольких цепочек сертификатов их порядок не обязан совпадать с порядком закрытых ключей в key. Если промежуточные сертификаты не предоставлены, узел не сможет проверить сертификат, и согласование завершится неудачно.
    • sigalgs <string> Разделённый двоеточиями список поддерживаемых алгоритмов подписи. Список может содержать алгоритмы дайджеста (SHA256, MD5 и т. д.), алгоритмы открытого ключа (RSA-PSS, ECDSA и т. д.), их комбинации (например, 'RSA+SHA384') или имена схем TLS v1.3 (например, rsa_pss_pss_sha512). Подробнее см. страницы руководства OpenSSL.
    • ciphers <string> Спецификация набора шифров, заменяющая значение по умолчанию. Подробнее см. Изменение набора шифров TLS по умолчанию. Допустимые шифры можно получить с помощью tls.getCiphers(). Имена шифров необходимо указывать в верхнем регистре, чтобы OpenSSL принимал их.
    • clientCertEngine <string> Имя механизма OpenSSL, который может предоставить сертификат клиента. Устарело.
    • crl <string> | <string[]> | <Buffer> | <Buffer[]> Списки отзыва сертификатов (CRL) в формате PEM.
    • dhparam <string> | <Buffer> 'auto' или пользовательские параметры Диффи — Хеллмана, необходимые для совершенной прямой секретности без ECDHE. Если параметр не указан или недопустим, эти параметры будут молча отброшены, а шифры DHE будут недоступны. ECDHE-вариант совершенной прямой секретности останется доступен.
    • ecdhCurve <string> Строка с именем именованной кривой или список разделённых двоеточиями NID либо имён кривых, например P-521:P-384:P-256, для согласования ключей ECDH. Укажите auto, чтобы выбрать кривую автоматически. Используйте crypto.getCurves(), чтобы получить список доступных имён кривых. В последних версиях openssl ecparam -list_curves также отображает имя и описание каждой доступной эллиптической кривой. По умолчанию: tls.DEFAULT_ECDH_CURVE.
    • honorCipherOrder <boolean> Пытаться использовать предпочтения сервера относительно набора шифров вместо предпочтений клиента. Если значение true, приводит к установке SSL_OP_CIPHER_SERVER_PREFERENCE в secureOptions; дополнительную информацию см. в разделе Параметры OpenSSL.
    • key <string> | <string[]> | <Buffer> | <Buffer[]> | <Object[]> Закрытые ключи в формате PEM. PEM допускает шифрование закрытых ключей. Зашифрованные ключи будут расшифрованы с помощью options.passphrase. Можно предоставить несколько ключей с разными алгоритмами: в виде массива незашифрованных строк или буферов с ключами либо в виде массива объектов формата {pem: <string|buffer>[, passphrase: <string>]}. Объектный формат допустим только в массиве. Параметр object.passphrase необязателен. Зашифрованные ключи будут расшифрованы с помощью object.passphrase, если он предоставлен, или options.passphrase, если нет.
    • privateKeyEngine <string> Имя механизма OpenSSL, из которого нужно получить закрытый ключ. Следует использовать вместе с privateKeyIdentifier. Устарело.
    • privateKeyIdentifier <string> Идентификатор закрытого ключа, управляемого механизмом OpenSSL. Следует использовать вместе с privateKeyEngine. Не следует задавать вместе с key, поскольку оба параметра задают закрытый ключ разными способами. Устарело.
    • maxVersion <string> При необходимости задаёт максимальную допустимую версию TLS. Одно из значений: 'TLSv1.3', 'TLSv1.2', 'TLSv1.1' или 'TLSv1'. Нельзя указывать вместе с параметром secureProtocol; используйте один из них. По умолчанию: tls.DEFAULT_MAX_VERSION.
    • minVersion <string> При необходимости задаёт минимальную допустимую версию TLS. Одно из значений: 'TLSv1.3', 'TLSv1.2', 'TLSv1.1' или 'TLSv1'. Нельзя указывать вместе с параметром secureProtocol; используйте один из них. Не рекомендуется задавать версию ниже TLSv1.2, однако это может потребоваться для совместимости. Для версий до TLSv1.2 может потребоваться понизить уровень безопасности OpenSSL. По умолчанию: tls.DEFAULT_MIN_VERSION.
    • passphrase <string> Общая парольная фраза для одного закрытого ключа и/или файла PFX.
    • pfx <string> | <string[]> | <Buffer> | <Buffer[]> | <Object[]> Закрытый ключ и цепочка сертификатов в кодировке PFX или PKCS12. pfx — альтернатива раздельной передаче key и cert. PFX обычно зашифрован; в этом случае для его расшифровки будет использоваться passphrase. Можно передать несколько файлов PFX: в виде массива незашифрованных буферов PFX либо в виде массива объектов формата {buf: <string|buffer>[, passphrase: <string>]}. Объектный формат допустим только в массиве. Параметр object.passphrase необязателен. Зашифрованные файлы PFX будут расшифрованы с помощью object.passphrase, если он предоставлен, или options.passphrase, если нет.
    • secureOptions <number> При необходимости влияет на поведение протокола OpenSSL, хотя обычно в этом нет необходимости. Используйте этот параметр с осторожностью, если вообще используете! Значение — числовая битовая маска параметров SSL_OP_* из раздела Параметры OpenSSL.
    • secureProtocol <string> Устаревший способ выбора используемой версии протокола TLS; он не позволяет независимо задавать минимальную и максимальную версии и не позволяет ограничить протокол версией TLSv1.3. Вместо него используйте minVersion и maxVersion. Возможные значения перечислены в разделе SSL_METHODS; используйте имена функций в виде строк. Например, используйте 'TLSv1_1_method', чтобы принудительно задать TLS версии 1.1, или 'TLS_method', чтобы разрешить любую версию протокола TLS вплоть до TLSv1.3. Не рекомендуется использовать версии TLS ниже 1.2, однако это может потребоваться для совместимости. По умолчанию: нет, см. minVersion.
    • sessionIdContext <string> Непрозрачный идентификатор, используемый серверами, чтобы гарантировать, что состояние сеанса не используется совместно разными приложениями. Клиенты его не используют.
    • ticketKeys <Buffer> 48 байт криптографически стойких псевдослучайных данных. Подробнее см. раздел Возобновление сеанса.
    • sessionTimeout <number> Количество секунд, по истечении которых сеанс TLS, созданный сервером, больше нельзя будет возобновить. Подробнее см. раздел Возобновление сеанса. По умолчанию: 300.

tls.createServer() задаёт для параметра honorCipherOrder значение по умолчанию true; в других API, создающих защищённые контексты, этот параметр не задан.

tls.createServer() использует в качестве значения по умолчанию параметра sessionIdContext 128-битное усечённое значение хеша SHA1, сгенерированное из process.argv; в других API, создающих защищённые контексты, значение по умолчанию отсутствует.

Метод tls.createSecureContext() создаёт объект SecureContext. Его можно использовать в качестве аргумента в нескольких API tls, например в server.addContext(), однако у него нет открытых методов. Конструктор tls.Server и метод tls.createServer() не поддерживают параметр secureContext.

Для шифров, использующих сертификаты, требуется ключ. Его можно предоставить с помощью key или pfx.

Если параметр ca не указан, Node.js по умолчанию использует общедоступный список доверенных УЦ Mozilla.

Вместо пользовательских параметров DHE рекомендуется использовать новый параметр dhparam: 'auto'. Если задать значение 'auto', автоматически будут выбраны общепринятые параметры DHE достаточной стойкости. В противном случае при необходимости можно использовать openssl dhparam для создания пользовательских параметров. Длина ключа должна быть не меньше 1024 бит, иначе будет выброшена ошибка. Хотя допустима длина 1024 бита, для большей безопасности используйте 2048 бит или более.

tls.createServer([options][, secureConnectionListener])

История
Версия Изменения
v22.4.0, v20.16.0

Параметр clientCertEngine зависит от поддержки пользовательских движков в OpenSSL, которая устарела в OpenSSL 3.

v19.0.0

Если задан ALPNProtocols, входящие соединения, отправляющие расширение ALPN без поддерживаемых протоколов, завершаются с фатальным предупреждением no_application_protocol.

v20.4.0, v18.19.0

Параметр options теперь может включать ALPNCallback.

v12.3.0

Параметр options теперь поддерживает параметры net.createServer().

v9.3.0

Параметр options теперь может включать clientCertEngine.

v8.0.0

Параметр ALPNProtocols теперь может быть TypedArray или DataView.

v5.0.0

Теперь поддерживаются параметры ALPN.

v0.3.2

Добавлено в: v0.3.2

  • options <Object>
    • ALPNProtocols <string[]> | <Buffer> | <TypedArray> | <DataView> Массив строк или одиночный Buffer, TypedArray или DataView, содержащий поддерживаемые протоколы ALPN. Буферы должны иметь формат [len][name][len][name]..., например 0x05hello0x05world, где первый байт указывает длину следующего имени протокола. Обычно передать массив гораздо проще, например ['hello', 'world']. (Протоколы следует упорядочить по приоритету.)
    • ALPNCallback <Function> Если задан, этот обработчик будет вызван, когда клиент установит соединение с использованием расширения ALPN. В функцию обратного вызова будет передан один аргумент: объект, содержащий поля servername и protocols, в которых находятся имя сервера из расширения SNI (если оно есть) и массив строк с именами протоколов ALPN соответственно. Функция обратного вызова должна вернуть одну из строк, перечисленных в protocols, которая будет передана клиенту как выбранный протокол ALPN, либо undefined, чтобы отклонить соединение с фатальным предупреждением. Если возвращённая строка не совпадает ни с одним протоколом ALPN клиента, будет выброшена ошибка. Этот параметр нельзя использовать вместе с параметром ALPNProtocols; при задании обоих параметров будет выброшена ошибка.
    • clientCertEngine <string> Имя движка OpenSSL, который может предоставить сертификат клиента. Устарело.
    • enableTrace <boolean> Если значение равно true, для новых соединений будет вызван tls.TLSSocket.enableTrace(). Трассировку можно включить после установления защищённого соединения, но для трассировки настройки защищённого соединения необходимо использовать этот параметр. По умолчанию: false.
    • handshakeTimeout <number> Прервать соединение, если согласование SSL/TLS не завершится за указанное количество миллисекунд. При каждом превышении времени ожидания согласования на объекте tls.Server генерируется событие 'tlsClientError'. По умолчанию: 120000 (120 секунд).
    • rejectUnauthorized <boolean> Если значение не равно false, сервер отклонит любое соединение, не авторизованное с помощью списка предоставленных центров сертификации. Этот параметр действует только в том случае, если requestCert имеет значение true. По умолчанию: true.
    • requestCert <boolean> Если значение равно true, сервер запросит сертификат у подключающихся клиентов и попытается проверить его. По умолчанию: false.
    • sessionTimeout <number> Количество секунд, по истечении которых возобновление TLS-сеанса, созданного сервером, станет невозможным. Дополнительные сведения см. в разделе Возобновление сеанса. По умолчанию: 300.
    • SNICallback(servername, callback) <Function> Функция, которая будет вызвана, если клиент поддерживает расширение TLS SNI. При вызове ей будут переданы два аргумента: servername и callback. callback — это функция обратного вызова с обработкой ошибки в качестве первого аргумента, принимающая два необязательных аргумента: error и ctx. ctx, если он указан, является экземпляром SecureContext. Для получения корректного SecureContext можно использовать tls.createSecureContext(). Если callback вызвана с ложным аргументом ctx, будет использован контекст безопасности сервера по умолчанию. Если SNICallback не указан, будет использована функция обратного вызова высокого уровня по умолчанию (см. ниже).
    • ticketKeys <Buffer> 48 байт криптографически стойких псевдослучайных данных. Дополнительные сведения см. в разделе Возобновление сеанса.
    • pskCallback <Function> Для согласования TLS-PSK см. раздел Предварительно установленные ключи.
    • pskIdentityHint <string> Необязательная подсказка, отправляемая клиенту для выбора идентификатора при согласовании TLS-PSK. В TLS 1.3 игнорируется. Если не удаётся задать pskIdentityHint, будет сгенерировано событие 'tlsClientError' с кодом 'ERR_TLS_PSK_SET_IDENTITY_HINT_FAILED'.
    • ...: Можно указать любой параметр tls.createSecureContext(). Для серверов обычно требуются параметры идентификации (pfx, key/cert или pskCallback).
    • ...: Можно указать любой параметр net.createServer().
  • secureConnectionListener <Function>
  • Возвращает: <tls.Server>

Создаёт новый tls.Server. Если указан параметр secureConnectionListener, он автоматически устанавливается в качестве обработчика события 'secureConnection'.

Параметры ticketKeys автоматически совместно используются рабочими потоками модуля node:cluster.

Ниже показан простой эхо-сервер:

Модули JavaScript
import { createServer } from 'node:tls';
import { readFileSync } from 'node:fs';

const options = {
  key: readFileSync('server-key.pem'),
  cert: readFileSync('server-cert.pem'),

  // This is necessary only if using client certificate authentication.
  requestCert: true,

  // This is necessary only if the client uses a self-signed certificate.
  ca: [ readFileSync('client-cert.pem') ],
};

const server = createServer(options, (socket) => {
  console.log('server connected',
              socket.authorized ? 'authorized' : 'unauthorized');
  socket.write('welcome!\n');
  socket.setEncoding('utf8');
  socket.pipe(socket);
});
server.listen(8000, () => {
  console.log('server bound');
});
CommonJS
const { createServer } = require('node:tls');
const { readFileSync } = require('node:fs');

const options = {
  key: readFileSync('server-key.pem'),
  cert: readFileSync('server-cert.pem'),

  // This is necessary only if using client certificate authentication.
  requestCert: true,

  // This is necessary only if the client uses a self-signed certificate.
  ca: [ readFileSync('client-cert.pem') ],
};

const server = createServer(options, (socket) => {
  console.log('server connected',
              socket.authorized ? 'authorized' : 'unauthorized');
  socket.write('welcome!\n');
  socket.setEncoding('utf8');
  socket.pipe(socket);
});
server.listen(8000, () => {
  console.log('server bound');
});

Чтобы сгенерировать сертификат и ключ для этого примера, выполните команду:

openssl req -x509 -newkey rsa:2048 -nodes -sha256 -subj '/CN=localhost' \
  -keyout server-key.pem -out server-cert.pem copy

Затем, чтобы сгенерировать сертификат client-cert.pem для этого примера, выполните команду:

openssl pkcs12 -certpbe AES-256-CBC -export -out client-cert.pem \
  -inkey server-key.pem -in server-cert.pem copy

Работу сервера можно проверить, подключившись к нему с помощью примера клиента из раздела tls.connect().

tls.setDefaultCACertificates(certs)

Добавлено в: v24.5.0
  • certs <string[]> | <ArrayBufferView[]> Массив сертификатов центров сертификации в формате PEM.

Устанавливает сертификаты центров сертификации по умолчанию, используемые TLS-клиентами Node.js. Если предоставленные сертификаты успешно обработаны, они становятся списком сертификатов центров сертификации по умолчанию, возвращаемым tls.getCACertificates() и используемым последующими TLS-соединениями, для которых не указаны собственные сертификаты центров сертификации. Перед установкой сертификаты будут очищены от дубликатов.

Эта функция влияет только на текущий поток Node.js. Изменение не затрагивает ранее сохранённые сеансы агента HTTPS, поэтому этот метод следует вызывать до установления TLS-соединений, результаты которых не должны кэшироваться.

Чтобы использовать системные сертификаты центров сертификации по умолчанию:

CommonJS
const tls = require('node:tls');
tls.setDefaultCACertificates(tls.getCACertificates('system'));
Модули JavaScript
import tls from 'node:tls';
tls.setDefaultCACertificates(tls.getCACertificates('system'));

Эта функция полностью заменяет список сертификатов центров сертификации по умолчанию. Чтобы добавить сертификаты к уже имеющимся, получите текущие сертификаты и добавьте их к ним:

CommonJS
const tls = require('node:tls');
const currentCerts = tls.getCACertificates('default');
const additionalCerts = ['-----BEGIN CERTIFICATE-----\n...'];
tls.setDefaultCACertificates([...currentCerts, ...additionalCerts]);
Модули JavaScript
import tls from 'node:tls';
const currentCerts = tls.getCACertificates('default');
const additionalCerts = ['-----BEGIN CERTIFICATE-----\n...'];
tls.setDefaultCACertificates([...currentCerts, ...additionalCerts]);

tls.getCACertificates([type])

Добавлено в: v23.10.0, v22.15.0
  • type <string> | <undefined> Тип возвращаемых сертификатов центров сертификации. Допустимые значения: "default", "system", "bundled" и "extra". По умолчанию: "default".
  • Возвращает: <string[]> Массив сертификатов в кодировке PEM. Массив может содержать дубликаты, если один и тот же сертификат многократно хранится в нескольких источниках.

Возвращает массив сертификатов центров сертификации из различных источников в зависимости от type:

  • "default": возвращает сертификаты центров сертификации, которые TLS-клиенты Node.js будут использовать по умолчанию.
    • Если включён параметр --use-bundled-ca (по умолчанию) или не включён параметр --use-openssl-ca, сюда входят сертификаты центров сертификации из встроенного хранилища Mozilla.
    • Если включён параметр --use-system-ca, сюда также входят сертификаты из доверенного хранилища системы.
    • При использовании NODE_EXTRA_CA_CERTS сюда также входят сертификаты, загруженные из указанного файла.
  • "system": возвращает сертификаты центров сертификации, загруженные из доверенного хранилища системы согласно правилам, установленным параметром --use-system-ca. Этот вариант можно использовать для получения сертификатов из системы, когда параметр --use-system-ca не включён.
  • "bundled": возвращает сертификаты центров сертификации из встроенного хранилища Mozilla. Это те же сертификаты, что и в tls.rootCertificates.
  • "extra": возвращает сертификаты центров сертификации, загруженные из NODE_EXTRA_CA_CERTS. Если параметр NODE_EXTRA_CA_CERTS не задан, возвращается пустой массив.

tls.getCiphers()

Добавлено в: v0.10.2
  • Возвращает: <string[]>

Возвращает массив имён поддерживаемых шифров TLS. По историческим причинам имена указаны в нижнем регистре, но для использования в параметре ciphers метода tls.createSecureContext() их необходимо преобразовать в верхний регистр.

По умолчанию включены не все поддерживаемые шифры. См. раздел Изменение набора шифров TLS по умолчанию.

Имена шифров, начинающиеся с 'tls_', предназначены для TLSv1.3; все остальные — для TLSv1.2 и более ранних версий.

console.log(tls.getCiphers()); // ['aes128-gcm-sha256', 'aes128-sha', ...] copy

tls.rootCertificates

Добавлено в: v12.3.0
  • Тип: <string[]>

Неизменяемый массив строк, представляющих корневые сертификаты (в формате PEM) из встроенного хранилища центров сертификации Mozilla, предоставленного в текущей версии Node.js.

Встроенное хранилище центров сертификации, предоставляемое Node.js, представляет собой снимок хранилища центров сертификации Mozilla, зафиксированный на момент выпуска. Он одинаков на всех поддерживаемых платформах.

Чтобы получить фактические сертификаты центров сертификации, используемые текущим экземпляром Node.js, которые могут включать сертификаты из системного хранилища (если используется --use-system-ca) или из файла, указанного в NODE_EXTRA_CA_CERTS, используйте tls.getCACertificates().

tls.DEFAULT_ECDH_CURVE

История
Версия Изменения
v10.0.0

Значение по умолчанию изменено на 'auto'.

v0.11.13

Добавлено в: v0.11.13

Имя кривой по умолчанию для согласования ключей ECDH на TLS-сервере. Значение по умолчанию — 'auto'. Дополнительные сведения см. в разделе tls.createSecureContext().

tls.DEFAULT_MAX_VERSION

Добавлено в: v11.4.0
  • Тип: <string> Значение по умолчанию параметра maxVersion для tls.createSecureContext(). Ему можно присвоить любую из поддерживаемых версий протокола TLS: 'TLSv1.3', 'TLSv1.2', 'TLSv1.1' или 'TLSv1'. По умолчанию: 'TLSv1.3', если значение не изменено с помощью параметров CLI. Использование --tls-max-v1.2 задаёт значение по умолчанию 'TLSv1.2'. Использование --tls-max-v1.3 задаёт значение по умолчанию 'TLSv1.3'. Если указано несколько параметров, используется наибольшее максимальное значение.

tls.DEFAULT_MIN_VERSION

Добавлено в: v11.4.0
  • Тип: <string> Значение по умолчанию параметра minVersion для tls.createSecureContext(). Ему можно присвоить любую из поддерживаемых версий протокола TLS: 'TLSv1.3', 'TLSv1.2', 'TLSv1.1' или 'TLSv1'. Для версий ниже TLSv1.2 может потребоваться понизить уровень безопасности OpenSSL. По умолчанию: 'TLSv1.2', если значение не изменено с помощью параметров CLI. Использование --tls-min-v1.0 задаёт значение по умолчанию 'TLSv1'. Использование --tls-min-v1.1 задаёт значение по умолчанию 'TLSv1.1'. Использование --tls-min-v1.3 задаёт значение по умолчанию 'TLSv1.3'. Если указано несколько параметров, используется наименьшее минимальное значение.

tls.DEFAULT_CIPHERS

Добавлено в: v0.11.3
  • Тип: <string> Значение по умолчанию параметра ciphers для tls.createSecureContext(). Ему можно присвоить любой из поддерживаемых шифров OpenSSL. По умолчанию используется содержимое crypto.constants.defaultCoreCipherList, если оно не изменено с помощью параметров CLI, используя --tls-default-ciphers.

© Joyent, Inc. and other Node contributors
Licensed under the MIT License.
Node.js is a trademark of Joyent, Inc. and is used with its permission.
We are not endorsed by or affiliated with Joyent.
https://nodejs.org/dist/latest-v24.x/docs/api/tls.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API