ブラウザでWebサイトにアクセスした際に「ERR_SSL_PROTOCOL_ERROR」が表示された。このエラーの主な原因として最も適切なものはどれか?
解説
このエラーの鍵はSSL/TLSハンドシェイクの失敗にあります。ERR_SSL_PROTOCOL_ERRORは、ブラウザ(クライアント)とWebサーバー間で安全な暗号化通信を確立する際に、TLSバージョンや暗号スイートが合意に至らなかった場合に発生します。他のエラーとの違いを整理するパスワードの誤りはHTTPレベルの認証エラー(401 Unauthorized)であり、SSL/TLS接続が確立された後の話です。そもそもSSLエラーはパスワード入力画面に到達する前に発生するため、原因にはなりません。ドメインの有効期限切れの場合、ブラウザにはERR_NAME_NOT_RESOLVEDや「このサイトにアクセスできません」が表示されます。「ERR_SSL_PROTOCOL_ERROR ドメイン期限切れ 違い」で混同されがちですが、ドメイン失効はDNS解決の段階で失敗するため、SSLハンドシェイクまで到達しません。DNSサーバーのダウンも同様に、名前解決ができずERR_NAME_NOT_RESOLVEDやDNS_PROBE_FINISHED_NXDOMAINが表示されます。SSLプロトコルエラーとはレイヤーが異なります。TLSハンドシェイクで何が起きているのかHTTPS通信はまずTLSハンドシェイクと呼ばれるネゴシエーション(交渉)を行います。具体的には、クライアントが対応するTLSバージョンと暗号スイートの一覧を送り、サーバーがその中から使用するものを選びます。この交渉が失敗する主な原因は以下の通りです。TLSバージョンの不一致: サーバーがTLS 1.2以上のみ対応しているのに、古いブラウザがTLS 1.0/1.1しかサポートしていないSSL証明書の設定不備: 証明書チェーンが不完全、または証明書のフォーマットが壊れている暗号スイートの不一致: サーバーが強固な暗号スイートのみ許可しており、クライアント側が対応していないERR_SSL_PROTOCOL_ERRORの調査手順このエラーに遭遇したとき、サーバー側・クライアント側それぞれで確認すべきポイントがあります。# サーバー側: opensslで証明書とTLS対応状況を確認 $ openssl s_client -connect example.com:443 -tls1_2 # TLS 1.3の対応確認 $ openssl s_client -connect example.com:443 -tls1_3 # 証明書チェーンの検証 $ openssl s_client -connect example.com:443 -showcertsクライアント側では、ブラウザのキャッシュとSSL状態のクリア、ブラウザの更新、別のブラウザでの再現確認が基本的な切り分け手順です。Chromeの場合、chrome://flagsでTLS関連の設定が変更されていないかも確認しましょう。実務で押さえておくべきTLSの現状TLS 1.0/1.1は廃止済み: 主要ブラウザは2020年にTLS 1.0/1.1のサポートを終了しており、サーバー側でも無効化が推奨される。古いプロトコルを残すと脆弱性(POODLE、BEASTなど)のリスクがあるTLS 1.3が主流: ハンドシェイクの往復回数が削減され、接続速度とセキュリティの両方が向上しているNginxでの設定例: ssl_protocols TLSv1.2 TLSv1.3;と明示することで、安全なバージョンのみ許可できるSSL Labsのテスト: ssllabs.com/ssltestでサーバーのSSL設定を診断でき、証明書チェーンの問題やプロトコル対応状況を可視化できる