Перейти к содержимому
ecdsa.com
Node.js tls.connect / fetch (undici)Модуль crypto в Node.js

Сообщение об ошибке

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 всё в порядке.

Почему это происходит

Как исправить

  1. 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. 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. 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 });

Связанные ошибки

Открыть всю базу ошибок подписей