エラーメッセージ
curl: (35) TLS connect error: error:0A00042E:SSL routines::tlsv1 alert protocol version
別の表記
- curl: (35) error:0A00042E:SSL routines::tlsv1 alert protocol version
- curl: (35) error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version
最近の curl のリリースでは、OpenSSL の理由文字列の前に「TLS connect error:」が付きます。OpenSSL 1.1.1 では「error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version」のように関数名も含まれます。逆に、クライアントが拒否するバージョンをサーバーが選んだ場合、クライアントは「unsupported protocol」と報告します。
curl (OpenSSL backend) — CURLE_SSL_CONNECT_ERROR, TLS alert 70 (protocol_version) received from the server
このエラーの意味
サーバーが TLS アラート 70(protocol_version)を送信しました。curl が提示した TLS バージョンのどれもサーバーが受け入れられないということです。プレフィックスの「tlsv1」は、TLS 1.0 以降で定義されたアラートに OpenSSL が付ける名前にすぎず、使用中のバージョンを表すものではありません。通常は、クライアントが 1.2 と 1.3 を提示しているのにサーバーが TLS 1.0/1.1 のままになっているか、クライアントの上限がサーバーの最低バージョンより低く設定されています。
発生する理由
サーバーが TLS 1.0 または 1.1 にしか対応していない
よくある最近のクライアントの ClientHello が提示するのは TLS 1.2 と 1.3 だけです。最高バージョンが 1.0 または 1.1 で、かつ supported_versions 拡張を理解するサーバーは、選べるものがないため protocol_version で拒否します。
クライアントに古い最大バージョンが指定されている
ときどき--tls-max 1.1、上限付きの --tlsv1.0、または古い機器をデバッグしたときに残った .curlrc の行があると、curl は現行のサーバーで無効化されているバージョンを提示します。
TLS 1.3 専用のサーバーに上限 1.2 のクライアントが接続
ときどき堅牢化された一部のエンドポイントは TLS 1.3 しか受け付けません。古いライブラリでビルドされたクライアントや、設定で TLS 1.2 に固定されたクライアントは、同じアラートで拒否されます。
修正方法
- 1.
サーバーが受け付けるバージョンを調べる
openssl s_client で各バージョンを試してください。結果から、修正すべきなのがサーバー(tls1/tls1_1 しか受け付けない)か、クライアント(受け付けられるバージョンを一度も提示していない)かがわかります。
bash for v in tls1 tls1_1 tls1_2 tls1_3; do printf '%s: ' "$v" openssl s_client -connect api.example.com:443 -servername api.example.com -"$v" </dev/null >/dev/null 2>&1 \ && echo accepted || echo refused done - 2.
サーバーで TLS 1.2 と 1.3 を有効にする
サーバーが TLS 1.2 と 1.3 を受け付けるように、TLS の設定(必要に応じて TLS ライブラリや OS も)をアップグレードしてください。
text # nginx ssl_protocols TLSv1.2 TLSv1.3; # HAProxy (global section) ssl-default-bind-options ssl-min-ver TLSv1.2 - 3.
クライアントのバージョン上限を削除する
スクリプトと .curlrc から --tls-max や古いプロトコル指定のフラグを削除し、最小バージョンだけを指定してください。そうすれば、curl は双方がサポートする最も高いバージョンをネゴシエートできます。
bash grep -nE 'tls-max|tlsv1|sslv3' ~/.curlrc # a forgotten cap in the config file curl --tlsv1.2 https://api.example.com/ # minimum 1.2, no maximum
関連するエラー
SSL routines:ssl3_read_bytes:tlsv1 alert protocol versionOpenSSL (client side)curl: (35) TLS connect error: error:0A000102:SSL routines::unsupported protocolcurl (OpenSSL backend)curl: (35) TLS connect error: error:0A000410:SSL routines::ssl/tls alert handsh…curl (OpenSSL backend)SSL_ERROR_UNSUPPORTED_VERSIONFirefox