エラーメッセージ
tls: server selected unsupported protocol version 301
この数値は、0x プレフィックスを付けない 16 進数のバージョンコードです(300 = SSL 3.0、301 = TLS 1.0、302 = TLS 1.1)。HTTP クライアントでは、先頭に「Get \"https://…\":」が付きます。現行のライブラリで構築された TLS 1.0 専用のサーバーは、ダウングレードせずに接続を拒否します。その場合、Go は「remote error: tls: protocol version not supported」と報告します(openssl s_server -tls1 に対して確認)。
Go crypto/tls client — the server chose TLS 1.0 (0x0301) or 1.1 (0x0302), below Go's minimum
このエラーの意味
サーバーは Go の ClientHello に対して、Go のクライアントが許可していない TLS バージョンを選択して応答しました。301 は TLS 1.0 の、302 は TLS 1.1 の 16 進数のバージョンコードです。Go のクライアントはデフォルトで(Go 1.18 以降)TLS 1.2 以上を要求するため、ハンドシェイクを中止します。サーバーが TLS 1.2 以上に対応する必要があります。
発生する理由
サーバーが TLS 1.0 または 1.1 にしか対応していない
よくある古いアプライアンス、組み込みデバイス、レガシーな Windows サーバー、古いロードバランサーが該当します。
Go のクライアントの最小バージョンは TLS 1.2
よくあるGo 1.18 以降、クライアントの tls.Config.MinVersion はデフォルトで TLS 1.2 に設定されています。新しい Go で再ビルドしたプログラムは、コードを一切変更していなくても、TLS 1.0 のサーバーと通信できなくなります。
修正方法
- 1.
サーバーの TLS をアップグレードする
サーバーで TLS 1.2(および 1.3)を有効にするか、最新の TLS 終端プロキシをサーバーの前段に置いてください。
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.
最後の手段:MinVersion を TLS 1.0 にした専用クライアント
そのレガシーデバイス専用のクライアントで MinVersion を下げれば、接続できるようになります。TLS 1.0 は非推奨(RFC 8996)であり、現代的な保護機能を備えていません。こうした通信は信頼できるネットワーク内にとどめ、共有のトランスポートには決して設定しないでください。
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/")