Mensagem de erro
tls: client offered only unsupported versions: [301]
O net/http a escreve como “http: TLS handshake error from <client address>: tls: client offered only unsupported versions: [301]”; a lista mostra todas as versões que o cliente ofereceu (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
O que significa
Um servidor TLS em Go recebeu um ClientHello que oferecia apenas versões do protocolo abaixo do mínimo dele, aqui o TLS 1.0 (código de versão 301). Por padrão, servidores Go aceitam TLS 1.2 e 1.3, então o handshake é recusado com um alerta protocol_version e o net/http registra esta linha no log. O cliente do outro lado está desatualizado ou está sondando o servidor de propósito.
Por que acontece
Clientes desatualizados
comumDispositivos legados, aplicações antigas em Java 6/7 ou .NET Framework e clientes HTTP embarcados que não conseguem negociar TLS 1.2.
Scanners da internet e ferramentas de segurança
comumScanners oferecem versões antigas de propósito para classificar servidores; linhas assim, vindas de muitos endereços diferentes, são esperadas em endpoints públicos.
Clientes configurados para uma versão antiga
ocasionalAplicações cuja configuração de protocolo foi fixada em TLS 1.0 para uma integração legada que deixou de existir há muito tempo.
Como corrigir
- 1.
Descobrir quem envia esses handshakes
Agrupe as linhas do log por endereço do cliente: poucos endereços conhecidos indicam clientes desatualizados que precisam ser atualizados; muitos endereços desconhecidos indicam scanners.
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.
Manter o TLS 1.2 como mínimo do servidor
Não reduza o MinVersion para acomodar scanners; em vez disso, atualize os poucos clientes antigos 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 o ruído de handshakes
O http.Server.ErrorLog recebe os erros de handshake; direcioná-lo para um logger dedicado mantém os logs da aplicação legíveis.
go // Route handshake noise from scanners to a separate logger instead of the main log srv.ErrorLog = log.New(handshakeLogWriter, "tls: ", 0)