TLS, что именно означает 'rejectUnauthorized' для меня?
Итак, у меня была проблема ранее сегодня, когда мой клиент, написанный на node
, был недоволен тем, что сервер, к которому я подключался, использовал самозаверяющие сертификаты. Итак, я пошел и добавил опцию rejectUnauthorized: false
к моему tls.connect
команда, как любой невольный разработчик сделал бы.
Мой вопрос сейчас, что, черт возьми, это значит для меня? Является ли мое TLS-соединение обычным TCP-соединением, которое также может быть TLS-соединением? Писать это как поток TLS совершенно бесполезно?
Что еще более важно, этот сервер, вы знаете тот, с самозаверяющими сертификатами? Мой поток между здесь и там зашифрован?
1 ответ
Как описано в документации:
rejectUnauthorized
: Еслиtrue
сертификат сервера сверяется со списком предоставленных ЦС.error
событие выдается, если проверка не пройдена;err.code
содержит код ошибки OpenSSL. По умолчанию:true
,
Поскольку вы используете самозаверяющие сертификаты, очевидно, что не будет совпадения со встроенными центрами сертификации, поэтому по умолчанию соединение будет отклонено, поскольку он не может проверить, является ли сервер тем, кем они себя называют.
Установив rejectUnauthorized: false
, вы говорите: "Мне все равно, если я не смогу подтвердить личность сервера". Очевидно, что это не очень хорошее решение, так как оно делает вас уязвимым для атак MITM.
Лучшее решение для самозаверяющих сертификатов - установить соответствующие ca
значение для вашего собственного CA при подключении на стороне клиента. Кроме того, убедитесь, что ваш host
значение соответствует общему имени самозаверяющего сертификата сервера. Например:
var socket = tls.connect({
host: 'MyTLSServer',
port: 1337,
ca: [ fs.readFileSync('CA.pem') ],
}, function() {
// Connected!
});
// ...
Неважно, если вы используете rejectUnauthorized: false
или установить ca
, соединение зашифровано.