エラーメッセージ
curl: (35) TLS connect error: error:0A000102:SSL routines::unsupported protocol
別の表記
- curl: (35) error:0A000102:SSL routines::unsupported protocol
- curl: (35) error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol
最近の curl のリリース(ここでは 8.14.1)では、OpenSSL の理由文字列の前に「TLS connect error:」が付きます。OpenSSL 1.1.1 では「error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol」のように関数名が示されます。拒否するのがサーバー側の場合、クライアントには代わりに「tlsv1 alert protocol version」が表示されます。
curl (OpenSSL backend) — CURLE_SSL_CONNECT_ERROR, SSL_R_UNSUPPORTED_PROTOCOL
このエラーの意味
サーバーは ClientHello に対して、curl の TLS ライブラリが使用を許可されていないプロトコルバージョン(通常は TLS 1.0 または 1.1)を選んで応答しました。その後、クライアントが自分の側で接続を中止します。ここではネットワーク経路も証明書も関係ありません。両端に共通の TLS バージョンがないだけです。
発生する理由
サーバーが TLS 1.0 または 1.1 にしか対応していない
よくある古い Windows Server/IIS 環境、Java 6/7 時代のアプリケーション、保守されていないロードバランサーは、今も TLS 1.0 でネゴシエートします。RFC 8996 は 2021年に TLS 1.0 と 1.1 を非推奨とし、現行のクライアントはもうこれらを提示しません。
クライアントのシステムポリシーで最低バージョンが TLS 1.2 に設定されている
よくあるDebian、Ubuntu(20.04 以降)、RHEL 8 以降の暗号ポリシーと、OpenSSL 3 のデフォルトのセキュリティレベルは、いずれも TLS 1.0/1.1 を拒否します。同じサーバーでも古いマシンからなら接続できる場合があるため、この障害は環境に固有のものに見えます。
組み込みの管理インターフェースと機器
ときどきプリンターや UPS の Web インターフェース、古い IPMI/iLO ファームウェア、SCADA ゲートウェイなどの機器は、多くの場合 TLS 1.0 より新しいバージョンにアップグレードできません。
修正方法
- 1.
サーバーが受け付けるバージョンを確認する
各バージョンを明示的に試してください。tls1 または tls1_1 しか成功しない場合は、サーバーをアップグレードする必要があります。tls1_2 も成功する場合は、最大バージョンを制限しているクライアントのオプションを探してください。
bash # Which versions does the server accept? (each line succeeds or fails on its own) for v in tls1 tls1_1 tls1_2 tls1_3; do printf '%s: ' "$v" openssl s_client -connect legacy.example.com:443 -"$v" </dev/null >/dev/null 2>&1 && echo ok || echo no done - 2.
サーバーで TLS 1.2 と 1.3 を有効にする
TLS 1.2(スタックが対応していれば 1.3 も)を有効にし、1.0/1.1 を無効にしてください。ブラウザー、モバイルアプリ、その他の API クライアントにも効果があるのは、この修正だけです。
text # nginx ssl_protocols TLSv1.2 TLSv1.3; # Apache httpd SSLProtocol -all +TLSv1.2 +TLSv1.3 # IIS / Windows Server: enable TLS 1.2 under # HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server - 3.
最後の手段:アップグレードできない機器への 1 回の呼び出しに限り TLS 1.0 を許可する
古いバージョンを再び有効にするのは、レガシー機器と通信する特定のコマンドだけにしてください。システム全体で有効にしてはいけません。TLS 1.0 は、既知の攻撃が存在する SHA-1 と CBC の構成に依存しています。このような通信は、分離された管理用ネットワーク内にとどめてください。
bash # Last resort for a device you cannot upgrade: allow TLS 1.0 for this one call only. # OpenSSL 3 also needs security level 0 for the SHA-1 based handshake of TLS 1.0/1.1. curl --tlsv1.0 --ciphers 'DEFAULT:@SECLEVEL=0' https://legacy-device.example.internal/
関連するエラー
SSL routines:ssl_choose_client_version:unsupported protocolOpenSSL (client side)curl: (35) TLS connect error: error:0A00042E:SSL routines::tlsv1 alert protocol…curl (OpenSSL backend)The server selected protocol version TLS10 is not accepted by client preference…Java (JSSE)tls: server selected unsupported protocol version 301Go crypto/tls clientnet::ERR_SSL_VERSION_OR_CIPHER_MISMATCHChrome, Edge and other Chromium browsers