Spec-Zone.ru › Node.js 22 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');

Определение отсутствия поддержки криптографии

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 без поддержки криптографии, рассмотрите возможность использования функции 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 включена по умолчанию. Параметр ecdhCurve можно использовать при создании TLS-сервера, чтобы настроить список поддерживаемых кривых 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 «современная криптография» ('modern cryptography'), а также шифрам 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; каждый следующий уровень предъявляет более строгие требования. Уровень безопасности по умолчанию — 1, что обычно подходит для большинства современных приложений. Однако для работы некоторых устаревших функций и протоколов, таких как 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': Недействительный сертификат центра сертификации.
  • '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. Эта подсказка помогает разработчикам выбрать безопасное решение и избежать небезопасных обходных путей.

Класс: tls.SecurePair

Добавлено в: v0.3.2Устарело начиная с: v0.11.3
Стабильность: 0 — Устарело: вместо этого используйте tls.TLSSocket.

Возвращается функцией tls.createSecurePair().

Событие: 'secure'

Добавлено в: v0.3.2Устарело начиная с: v0.11.3

Событие 'secure' генерируется объектом SecurePair после установления защищённого соединения.

Как и при проверке события 'secureConnection' сервера, необходимо проверить pair.cleartext.authorized, чтобы убедиться, что использованный сертификат прошёл надлежащую авторизацию.

Класс: tls.Server

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

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

Событие: 'connection'

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

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

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

Методы, возвращающие метаданные 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 асимметричен, поэтому TLSSocket должен знать, должен ли он работать как сервер или как клиент. Если true, TLS-сокет будет создан в качестве сервера. По умолчанию: false.
    • server <net.Server> Экземпляр net.Server.
    • requestCert: следует ли аутентифицировать удалённую сторону, запросив сертификат. Клиенты всегда запрашивают сертификат сервера. Серверы (isServer имеет значение true) могут установить requestCert в значение true, чтобы запросить сертификат клиента.
    • rejectUnauthorized: см. tls.createServer()
    • ALPNProtocols: см. tls.createServer()
    • SNICallback: см. tls.createServer()
    • session <Buffer> Экземпляр Buffer, содержащий TLS-сеанс.
    • requestOCSP <boolean> Если true, указывает, что расширение запроса статуса OCSP будет добавлено в ClientHello, а перед установлением защищённого соединения на сокете будет сгенерировано событие 'OCSPResponse'
    • secureContext: объект контекста TLS, созданный с помощью tls.createSecureContext(). Если secureContext не задан, он будет создан путём передачи всего объекта options в tls.createSecureContext().
    • ...: параметры tls.createSecureContext(), которые используются, если параметр secureContext отсутствует. В противном случае они игнорируются.

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

Событие: 'keylog'

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

Событие 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 — это объект с цифровой подписью центра сертификации сервера, содержащий сведения об отзыве сертификата сервера.

Событие: '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
  • 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> Массив строк, Buffers, TypedArrays или DataViews либо один Buffer, TypedArray или DataView, содержащий поддерживаемые протоколы ALPN. Buffers должны иметь формат [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>. Если servername и cert прошли проверку, метод должен вернуть undefined.
    • session <Buffer> Экземпляр Buffer, содержащий сеанс TLS.
    • minDHSize <number> Минимальный размер параметра DH в битах, допустимый для TLS-соединения. Если сервер предлагает параметр DH размером менее minDHSize, TLS-соединение будет уничтожено и возникнет ошибка. По умолчанию: 1024.
    • highWaterMark <number> Соответствует параметру highWaterMark читаемого потока. По умолчанию: 16 * 1024.
    • 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

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

v22.4.0

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

v19.8.0, v18.16.0

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

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 также могут быть просто strings или Buffers.

v5.2.0

Теперь параметр 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.createSecurePair([context][, isServer][, requestCert][, rejectUnauthorized][, options])

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

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

v0.11.3

Устарело начиная с: v0.11.3

v0.3.2

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

Стабильность: 0 - Устарело: вместо этого используйте tls.TLSSocket.
  • context <Object> Объект безопасного контекста, возвращаемый tls.createSecureContext()
  • isServer <boolean> true, чтобы указать, что это TLS-соединение следует открыть в качестве сервера.
  • requestCert <boolean> true, чтобы указать, должен ли сервер запрашивать сертификат у подключающегося клиента. Применяется только если isServer равно true.
  • rejectUnauthorized <boolean> Если значение не false, сервер автоматически отклоняет клиентов с недействительными сертификатами. Применяется только если isServer равно true.
  • options
    • enableTrace: См. tls.createServer()
    • secureContext: Объект контекста TLS из tls.createSecureContext()
    • isServer: Если true, сокет TLS будет создан в режиме сервера. По умолчанию: false.
    • server <net.Server> Экземпляр net.Server
    • requestCert: См. tls.createServer()
    • rejectUnauthorized: См. tls.createServer()
    • ALPNProtocols: См. tls.createServer()
    • SNICallback: См. tls.createServer()
    • session <Buffer> Экземпляр Buffer, содержащий сеанс TLS.
    • requestOCSP <boolean> Если true, расширение запроса статуса OCSP будет добавлено в ClientHello, а перед установлением защищенного соединения для сокета будет создано событие 'OCSPResponse'.

Создает новый объект защищенной пары с двумя потоками: один из них читает и записывает зашифрованные данные, а другой — открытые данные. Как правило, зашифрованный поток подключается к входящему потоку зашифрованных данных, а также от него, а открытый поток используется вместо исходного зашифрованного потока.

tls.createSecurePair() возвращает объект tls.SecurePair со свойствами потоков cleartext и encrypted.

Использование cleartext предоставляет тот же API, что и tls.TLSSocket.

Метод tls.createSecurePair() теперь устарел; вместо него следует использовать tls.TLSSocket(). Например, следующий код:

pair = tls.createSecurePair(/* ... */);
pair.encrypted.pipe(socket);
socket.pipe(pair.encrypted); copy

можно заменить на:

secureSocket = tls.TLSSocket(socket, options); copy

где secureSocket предоставляет тот же API, что и pair.cleartext.

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

История
Версия Изменения
v22.4.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> Массив строк, Buffers, TypedArrays или DataViews либо одиночное значение Buffer, TypedArray или DataView, содержащее поддерживаемые протоколы ALPN. Buffers должны иметь формат [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 не указан, будет использована функция обратного вызова по умолчанию с высокоуровневым API (см. ниже).
    • ticketKeys <Buffer> 48 байт криптографически стойких псевдослучайных данных. Дополнительные сведения см. в разделе Возобновление сеанса.
    • pskCallback <Function> Согласование TLS-PSK описано в разделе Предварительно установленные ключи.
    • pskIdentityHint <string> Необязательная подсказка, отправляемая клиенту для помощи в выборе идентификатора при согласовании TLS-PSK. В TLS 1.3 игнорируется. Если не удалось задать pskIdentityHint, будет создано событие 'tlsClientError' с кодом 'ERR_TLS_PSK_SET_IDENTIY_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)

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

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

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

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

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

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

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])

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

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

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

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

Чтобы получить фактические сертификаты CA, используемые текущим экземпляром 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-v22.x/docs/api/tls.html

Spec-Zone.ru

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