エラーメッセージ
SSL routines:tls_setup_handshake:no protocols available
別の表記
- error:0A0000BF:SSL routines::no protocols available
openssl CLI(3.0 と 3.5)は「error:0A0000BF:SSL routines:tls_setup_handshake:no protocols available」と出力します。関数名を含めずにエラーを整形するアプリケーションでは「error:0A0000BF:SSL routines::no protocols available」と表示されます。
OpenSSL (client or server side) — SSL_R_NO_PROTOCOLS_AVAILABLE before the handshake starts
このエラーの意味
すべての制限を適用した結果、提示できるプロトコルバージョンが何も残らなかったため、OpenSSL はハンドシェイクを開始することさえ拒否しました。典型的なのは、OpenSSL のセキュリティレベル(現行のディストリビューションではデフォルトで 2)が TLS 1.0 と 1.1 を禁止しているのに、アプリケーションがそれらを要求した場合や、設定された最低バージョンが最大バージョンを上回っている場合です。サーバーには何も送信されていません。
発生する理由
セキュリティレベルが禁止しているのに TLS 1.0/1.1 を強制している
よくあるOpenSSL 3.0 以降では、セキュリティレベル 1 以上で TLS 1.0 と 1.1 が無効になり、ディストリビューションのデフォルトはレベル 2 です。そのため、古い機器のために TLS 1.0 をハードコードしたクライアントには、提示できるものが何もありません。
最低バージョンが最大バージョンを上回っている
ときどき最低バージョン TLS 1.3 と最大バージョン TLS 1.2 を組み合わせた設定(多くの場合、別々の 2 つの設定が重なった結果)では、許可される範囲が空になります。
システム全体の暗号ポリシーがアプリケーションの設定を上書きしている
ときどきRHEL と Fedora の暗号ポリシー(DEFAULT、FUTURE)や Debian の openssl.cnf は、そのマシン上のすべての OpenSSL アプリケーションに対して MinProtocol とセキュリティレベルを設定します。
修正方法
- 1.
制限している設定を見つける
openssl.cnf とシステムの暗号ポリシーで、MinProtocol、MaxProtocol、CipherString の @SECLEVEL の値を確認してください。
bash openssl version -d # where openssl.cnf lives grep -nE 'MinProtocol|MaxProtocol|CipherString' /usr/lib/ssl/openssl.cnf /etc/ssl/openssl.cnf 2>/dev/null update-crypto-policies --show 2>/dev/null # RHEL/Fedora system policy - 2.
古い機器:1 つのコマンドに限ってレベルを下げる
暗号スイートの指定文字列に @SECLEVEL=0 を追加すると、その実行に限って TLS 1.0/1.1 が再び有効になります。このような例外はシステム全体の設定に含めず、信頼できないネットワークでも使わないでください。
bash # For a one-off test against a legacy device: lower the security level for this command only echo | openssl s_client -connect legacy.example.com:443 -tls1 -cipher 'DEFAULT:@SECLEVEL=0' - 3.
矛盾のないバージョン範囲を使う
最低バージョンが最大バージョンを超えないようにしてください。現在の一般的な範囲は TLS 1.2〜TLS 1.3 です。
ini # openssl.cnf (system_default_sect): a consistent range MinProtocol = TLSv1.2 MaxProtocol = TLSv1.3