Mensaje de error
tls: client offered only unsupported versions: [301]
net/http lo escribe así: «http: TLS handshake error from <client address>: tls: client offered only unsupported versions: [301]»; la lista muestra todas las versiones que ofrece el cliente (300 = SSL 3.0, 301 = TLS 1.0, 302 = TLS 1.1).
Go crypto/tls server (net/http ErrorLog) — the client offered only TLS versions below the server's minimum
Qué significa
Un servidor TLS de Go recibió un ClientHello que solo ofrecía versiones del protocolo inferiores a su mínimo, en este caso TLS 1.0 (código de versión 301). Los servidores Go aceptan de forma predeterminada TLS 1.2 y 1.3, por lo que el handshake se rechaza con una alerta protocol_version y net/http escribe esta línea en el registro. El cliente del otro extremo está desactualizado o está sondeando el servidor a propósito.
Por qué ocurre
Clientes desactualizados
frecuenteDispositivos antiguos, aplicaciones viejas de Java 6/7 o .NET Framework y clientes HTTP embebidos que no admiten TLS 1.2.
Escáneres de internet y herramientas de seguridad
frecuenteLos escáneres ofrecen versiones antiguas a propósito para clasificar los servidores; en los endpoints públicos es normal ver estas líneas desde muchas direcciones distintas.
Clientes configurados para una versión antigua
ocasionalAplicaciones con un ajuste de protocolo fijado en TLS 1.0 por una integración heredada que desapareció hace tiempo.
Cómo solucionarlo
- 1.
Averiguar quién envía estos handshakes
Agrupa las líneas del registro por dirección del cliente: unas pocas direcciones conocidas indican clientes desactualizados que hay que actualizar; muchas direcciones desconocidas indican escáneres.
bash # Which addresses send these handshakes, and how often? journalctl -u myservice --since today | grep 'client offered only unsupported versions' \ | grep -oE 'from [0-9a-f.:]+' | sort | uniq -c | sort -rn | head - 2.
Mantener TLS 1.2 como mínimo del servidor
No bajes MinVersion para adaptarte a los escáneres; actualiza en su lugar los pocos clientes antiguos legítimos.
go // Keep TLS 1.2 as the minimum (Go's server default); set it explicitly to document intent srv := &http.Server{Addr: ":443", TLSConfig: &tls.Config{MinVersion: tls.VersionTLS12}} - 3.
Separar el ruido de los handshakes
http.Server.ErrorLog recibe los errores de handshake; dirigirlo a un logger dedicado mantiene legibles los registros de la aplicación.
go // Route handshake noise from scanners to a separate logger instead of the main log srv.ErrorLog = log.New(handshakeLogWriter, "tls: ", 0)