Сообщение об ошибке
tls: server selected unsupported protocol version 301
Число — код версии в шестнадцатеричном виде без префикса 0x: 300 = SSL 3.0, 301 = TLS 1.0, 302 = TLS 1.1. HTTP-клиенты добавляют префикс «Get \"https://…\": ». Сервер, поддерживающий только TLS 1.0 и построенный на актуальной библиотеке, не понижает версию, а отказывает, и тогда Go сообщает «remote error: tls: protocol version not supported» (так было при подключении к openssl s_server -tls1).
Go crypto/tls client — the server chose TLS 1.0 (0x0301) or 1.1 (0x0302), below Go's minimum
Что это означает
В ответ на ClientHello от Go сервер выбрал версию TLS, которую клиент Go не допускает: 301 — шестнадцатеричный код версии TLS 1.0, 302 — TLS 1.1. Клиенты Go по умолчанию (начиная с Go 1.18) требуют TLS 1.2 или новее, поэтому прерывают рукопожатие. Сервер должен поддерживать TLS 1.2+.
Почему это происходит
Сервер поддерживает только TLS 1.0 или 1.1
частоСтарые специализированные устройства, встраиваемые устройства, устаревшие серверы Windows и старые балансировщики нагрузки.
Клиент Go требует как минимум TLS 1.2
частоНачиная с Go 1.18 значение tls.Config.MinVersion по умолчанию для клиентов — TLS 1.2; программы, пересобранные более новой версией Go, перестают работать с серверами TLS 1.0 без каких-либо изменений в коде.
Как исправить
- 1.
Обновите TLS на сервере
Включите на сервере TLS 1.2 (и 1.3) или поставьте перед ним современный прокси, терминирующий TLS.
text Upgrade the server (or the appliance firmware / TLS terminator in front of it) to TLS 1.2 or 1.3. 0x0301 = TLS 1.0, 0x0302 = TLS 1.1, 0x0303 = TLS 1.2, 0x0304 = TLS 1.3. - 2.
Крайняя мера: отдельный клиент с MinVersion TLS 1.0
Если понизить MinVersion в клиенте, который используется только для этого устаревшего устройства, связь восстановится. TLS 1.0 объявлен устаревшим (RFC 8996), и в нём нет современных механизмов защиты; держите такой трафик в доверенных сетях и никогда не задавайте эту настройку в общих транспортах.
go // Last resort for one legacy device on a trusted network: a dedicated client legacy := &http.Client{Transport: &http.Transport{TLSClientConfig: &tls.Config{ MinVersion: tls.VersionTLS10, // only for this client; never in a shared transport }}} resp, err := legacy.Get("https://legacy.example.com:8443/")