本文へスキップ
ecdsa.com
Go crypto/tls clientGo

エラーメッセージ

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 以上に対応する必要があります。

発生する理由

修正方法

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

関連するエラー

署名エラーデータベースをすべて見る