Сообщение об ошибке
code: 'ERR_SSL_WRONG_VERSION_NUMBER'
Также выводится как
- ERR_SSL_WRONG_VERSION_NUMBER
Полное сообщение содержит идентификатор потока и путь к исходному файлу, например «60747095FFFF0000:error:0A00010B:SSL routines:tls_validate_record_header:wrong version number:../deps/openssl/openssl/ssl/record/methods/tlsany_meth.c:77:», поэтому искать лучше по коду. tls.connect() и fetch() задают код ERR_SSL_WRONG_VERSION_NUMBER; https.request() сообщает ту же причину как «write EPROTO …» с кодом EPROTO.
Node.js tls.connect / fetch (undici) — OpenSSL SSL_R_WRONG_VERSION_NUMBER; https.request reports it as write EPROTO
Что это означает
Node.js начал TLS-рукопожатие, но ответ оказался не записью TLS, поэтому OpenSSL выдал ошибку при проверке заголовка записи. Другая сторона на этом порту работает без шифрования: это HTTP-сервер, прокси, который ждёт обычный HTTP, или SMTP-сервер до команды STARTTLS. Несмотря на название ошибки, с сертификатами и версиями TLS всё в порядке.
Почему это происходит
https:// на порту, где работает обычный HTTP
частоЛокальные серверы разработки, внутренние сервисы за прокси, который терминирует TLS, или неверный номер порта в переменной окружения.
HTTPS_PROXY или параметр https-proxy в npm указаны как https://
частоБольшинство прямых прокси принимают от клиента обычный HTTP и открывают туннель CONNECT; если URL прокси начинается с https://, клиент устанавливает TLS-соединение с самим прокси.
Неявный TLS на порту STARTTLS
иногдаПочтовые библиотеки с secure: true для порта 587 или 25 сразу начинают TLS-рукопожатие, а сервер сначала ждёт обычного приветствия SMTP без шифрования.
Как исправить
- 1.
Выясните, какой протокол работает на порту
Обратитесь к порту по http://; если он отвечает, используйте http:// или настоящий TLS-порт.
bash curl -si http://127.0.0.1:8080/ | head -1 # HTTP answers: use http:// or the TLS port openssl s_client -connect 127.0.0.1:8443 -brief </dev/null - 2.
Указывайте URL прокси с http://
Схема в URL прокси описывает соединение с прокси, а не с целевым сервером; соединение с HTTPS-серверами назначения всё равно защищено сквозным TLS через туннель.
bash # Proxy URLs for HTTPS traffic normally start with http:// (CONNECT tunnel) export HTTPS_PROXY=http://proxy.example.net:3128 npm config set https-proxy http://proxy.example.net:3128 - 3.
Почта: используйте STARTTLS на порту 587 и неявный TLS на 465
В nodemailer secure: true предназначен для порта 465; на порту 587 оставьте secure: false и сделайте STARTTLS обязательным.
js // SMTP: secure: true only for implicit TLS (465); 587 upgrades with STARTTLS import nodemailer from "nodemailer"; const transport = nodemailer.createTransport({ host: "smtp.example.com", port: 587, secure: false, requireTLS: true });
Связанные ошибки
curl: (35) TLS connect error: error:0A00010B:SSL routines::wrong version numbercurl (OpenSSL backend)SSL routines:tls_validate_record_header:wrong version numberOpenSSL 3 (openssl s_client and any OpenSSL-based client)[SSL: WRONG_VERSION_NUMBER] wrong version numberPython ssl module (OpenSSL)http: server gave HTTP response to HTTPS clientGo net/http