Mensaje de error
tls: server selected unsupported protocol version 301
El número es el código de versión en hexadecimal sin el prefijo 0x: 300 = SSL 3.0, 301 = TLS 1.0, 302 = TLS 1.1. Los clientes HTTP anteponen «Get \"https://…\": ». Un servidor que solo admite TLS 1.0 pero usa una biblioteca actual rechaza la conexión en lugar de bajar de versión, y entonces Go informa «remote error: tls: protocol version not supported» (observado contra openssl s_server -tls1).
Go crypto/tls client — the server chose TLS 1.0 (0x0301) or 1.1 (0x0302), below Go's minimum
Qué significa
El servidor responde al ClientHello de Go eligiendo una versión de TLS que el cliente de Go no permite: 301 es el código de versión hexadecimal de TLS 1.0 y 302 el de TLS 1.1. Desde Go 1.18, los clientes Go exigen de forma predeterminada TLS 1.2 o posterior, así que abortan el handshake. El servidor tiene que admitir TLS 1.2+.
Por qué ocurre
El servidor solo admite TLS 1.0 o 1.1
frecuenteDispositivos dedicados antiguos, sistemas embebidos, servidores Windows heredados y balanceadores de carga desactualizados.
El mínimo del cliente de Go es TLS 1.2
frecuenteDesde Go 1.18, el valor predeterminado de tls.Config.MinVersion para clientes es TLS 1.2; los programas recompilados con un Go más reciente dejan de comunicarse con servidores TLS 1.0 sin ningún cambio en el código.
Cómo solucionarlo
- 1.
Actualizar el TLS del servidor
Habilita TLS 1.2 (y 1.3) en el servidor o pon delante un 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: un cliente dedicado con MinVersion TLS 1.0
Bajar MinVersion en un cliente que se use solo para ese dispositivo heredado restablece la conectividad. TLS 1.0 está obsoleto (RFC 8996) y carece de protecciones modernas; mantén ese tráfico en redes de confianza y nunca lo configures en transportes compartidos.
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/")