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

エラーメッセージ

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 バージョンがないだけです。

発生する理由

修正方法

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

関連するエラー

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