本文へスキップ
ecdsa.com
curl (OpenSSL backend)curl

エラーメッセージ

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 のままになっているか、クライアントの上限がサーバーの最低バージョンより低く設定されています。

発生する理由

修正方法

  1. 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. 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. 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

関連するエラー

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