Mensagem de erro
tls: server selected unsupported protocol version 301
O número é o código da versão em hexadecimal, sem o prefixo 0x: 300 = SSL 3.0, 301 = TLS 1.0, 302 = TLS 1.1. Clientes HTTP acrescentam o prefixo “Get \"https://…\": ”. Um servidor só com TLS 1.0 construído sobre uma biblioteca atual recusa a conexão em vez de negociar uma versão inferior, e o Go então informa “remote error: tls: protocol version not supported” (observado com openssl s_server -tls1).
Go crypto/tls client — the server chose TLS 1.0 (0x0301) or 1.1 (0x0302), below Go's minimum
O que significa
O servidor respondeu ao ClientHello do Go escolhendo uma versão de TLS que o cliente do Go não permite: 301 é o código hexadecimal da versão do TLS 1.0, e 302, do TLS 1.1. Por padrão (desde o Go 1.18), clientes Go exigem TLS 1.2 ou mais recente, então abortam o handshake. O servidor precisa oferecer suporte a TLS 1.2+.
Por que acontece
O servidor só aceita TLS 1.0 ou 1.1
comumAppliances antigos, dispositivos embarcados, servidores Windows legados e balanceadores de carga desatualizados.
O mínimo do cliente Go é TLS 1.2
comumDesde o Go 1.18, o tls.Config.MinVersion padrão para clientes é TLS 1.2; programas recompilados com um Go mais novo deixam de se comunicar com servidores TLS 1.0 sem nenhuma alteração no código.
Como corrigir
- 1.
Atualizar o TLS do servidor
Ative TLS 1.2 (e 1.3) no servidor ou coloque na frente dele um terminador TLS moderno.
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.
Último recurso: um cliente dedicado com MinVersion TLS 1.0
Reduzir o MinVersion em um cliente usado apenas para esse dispositivo legado restabelece a conectividade. O TLS 1.0 está obsoleto (RFC 8996) e não tem as proteções modernas; mantenha esse tráfego em redes confiáveis e nunca aplique esse ajuste a transportes compartilhados.
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/")