Saltar al contenido
ecdsa.com
Go crypto/tls server (net/http ErrorLog)Go

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

Cómo solucionarlo

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

Errores relacionados

Explorar toda la base de datos de errores de firma