エラーメッセージ
SSL routines:ssl3_read_bytes:tlsv1 alert protocol version
別の表記
- error:0A00042E:SSL routines::tlsv1 alert protocol version
- SSL alert number 70
OpenSSL 3.0 と 3.5 はどちらも「error:0A00042E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version:<source>:SSL alert number 70」と出力します。OpenSSL 1.1.1 ではコード 1409442E でした。OpenSSL を基盤とするクライアント(curl、Python、Ruby、PHP)にも、同じ理由の文字列が表示されます。
OpenSSL (client side) — TLS alert 70 (protocol_version) received from the server
このエラーの意味
クライアントはサーバーから TLS アラート 70(protocol_version)を受け取りました。クライアントが提示したプロトコルバージョンのどれも、サーバーが受け入れられなかったということです。「tlsv1」は、TLS 1.0 以降で定義されたアラートに OpenSSL が使う系統名にすぎません。実際には、サーバーが TLS 1.0/1.1 に限定されているのにクライアントが 1.2 と 1.3 を提示しているか、サーバーが無効にしているバージョンにクライアントが制限されているかのどちらかです。
発生する理由
サーバーが TLS 1.0 または 1.1 にしか対応していない
よくあるレガシーなアプライアンス、古い Windows/IIS や Java のサーバー、一度も更新されていない機器が該当します。
クライアントが古いバージョンを使うよう指定されている
ときどき-tls1 のようなフラグや、設定に残ったままの MaxProtocol の指定があると、クライアントは現行のサーバーが拒否するバージョンを提示します。
TLS 1.3 専用のサーバーと 1.2 に限定されたクライアント
ときどき堅牢化されたエンドポイントの中には TLS 1.3 しか受け付けないものがあり、古いクライアントは接続できません。
修正方法
- 1.
サーバーが受け付けるバージョンを確認する
各バージョンを明示的に試してください(セキュリティレベル 0 にすると、このテストに限って TLS 1.0/1.1 の SHA-1 ベースのハンドシェイクが許可されます)。
bash for v in tls1 tls1_1 tls1_2 tls1_3; do printf '%-7s ' "$v" echo | openssl s_client -connect legacy.example.com:443 -servername legacy.example.com -"$v" \ -cipher 'DEFAULT:@SECLEVEL=0' >/dev/null 2>&1 && echo accepted || echo refused done - 2.
サーバーで TLS 1.2 と 1.3 を有効にする
サーバーのプロトコル設定を更新してください(TLS ライブラリが TLS 1.2 より古い場合は、ライブラリも更新してください)。
text # nginx ssl_protocols TLSv1.2 TLSv1.3; # Apache httpd SSLProtocol -all +TLSv1.2 +TLSv1.3