エラーメッセージ
SSL routines:ssl_choose_client_version:unsupported protocol
別の表記
- error:0A000102:SSL routines::unsupported protocol
openssl CLI は「<thread>:error:0A000102:SSL routines:ssl_choose_client_version:unsupported protocol:<source>」と出力します。curl、Node.js などのアプリケーションでは「error:0A000102:SSL routines::unsupported protocol」と表示されます。OpenSSL 1.1.1 ではコード 1425F102 でした。
OpenSSL (client side) — SSL_R_UNSUPPORTED_PROTOCOL: the server chose a version the client does not allow
このエラーの意味
クライアントは TLS 1.2 と 1.3 を提示しましたが、サーバーの ServerHello はそれより古いバージョン(通常は TLS 1.0)を選択しました。クライアントの OpenSSL は、そのバージョンの使用を許可されていません。クライアントは ssl_choose_client_version で処理を中止します。古い TLS スタックはクライアントが提示した範囲を無視し、単に自分のバージョンで応答します。最近のスタックであれば、代わりに protocol_version アラートで拒否するはずです。
発生する理由
サーバーが TLS 1.0 または 1.1 にしか対応していない
よくある保守されていないサーバー、古いアプライアンス、組み込み機器が該当します。
クライアントの OpenSSL が古いバージョンを禁止している
よくある現行のディストリビューションは最低バージョンを TLS 1.2 に設定している(セキュリティレベル 2)ため、古いマシンからは接続できたサーバーに、新しいマシンからは接続できなくなります。
修正方法
- 1.
サーバーのバージョンを確認する
この診断用のコマンドに限ってセキュリティレベル 0 で TLS 1.0 を強制すると、サーバーが古いバージョンにしか対応していないかどうかがわかります。
bash # Allowed only for this diagnostic command: which version does the server pick? echo | openssl s_client -connect legacy.example.com:443 -servername legacy.example.com \ -tls1 -cipher 'DEFAULT:@SECLEVEL=0' -brief 2>&1 | grep -E 'Protocol version|error' - 2.
サーバーで TLS 1.2 と 1.3 を有効にする
サーバーをアップグレードする(または前段に最新の TLS 終端装置を置く)ことが、唯一の恒久的な修正策です。
text # Server side ssl_protocols TLSv1.2 TLSv1.3; # nginx SSLProtocol -all +TLSv1.2 +TLSv1.3 # Apache httpd