エラーメッセージ
net::ERR_SSL_PROTOCOL_ERROR
エラーページには「ERR_SSL_PROTOCOL_ERROR」、自動化ツールや DevTools には「net::ERR_SSL_PROTOCOL_ERROR」と表示されます。
Chrome, Edge and other Chromium browsers — "This site can't provide a secure connection"
このエラーの意味
サーバーの応答がプロトコルに違反していたため、Chrome は TLS ハンドシェイクを完了できませんでした。最も多いのは応答がそもそも TLS ではなかったケース(そのポートで平文の HTTP サーバーが動いている)で、ほかにサーバーが不正な形式や想定外のハンドシェイクデータを送信したケースもあります。ページには「このサイトは安全に接続できません」「<host> から無効な応答が送信されました」と表示されます。証明書は関係ありません。
発生する理由
平文の HTTP で応答するポートへの https:// 接続
よくある開発用サーバー、管理用ポート、または TLS リスナーがないサーバーが該当します。
HSTS により平文 HTTP の開発用サイトで https:// が強制される
よくあるHSTS プリロードリストに登録されたドメイン(.dev や .app など)や、以前に Strict-Transport-Security を送信したホストは、ローカルサーバーが HTTP にしか対応していない場合でも、常に https:// にアップグレードされます。
設定ミスや不具合のある TLS サーバー
ときどきバックエンドのプロトコル設定を誤ったプロキシ、バグのあるアプライアンス、またはハンドシェイクの途中で接続を閉じるサーバーが該当します。
ウイルス対策ソフトやファイアウォールによる干渉
ときどきハンドシェイクを失敗させる HTTPS スキャン機能やネットワークフィルターがあると、ほかには問題のないサイトでも同じエラーが発生します。
修正方法
- 1.
ポートがどのプロトコルで応答するかを確認する
平文の HTTP が応答する場合は、TLS 用のポートを使うか、そのリスナーで TLS を有効にしてください。
bash curl -si http://www.example.com:8080/ | head -1 # plain HTTP answers? openssl s_client -connect www.example.com:443 -servername www.example.com -brief </dev/null - 2.
開発環境:HSTS をクリアするか、ローカルで HTTPS を使う
chrome://net-internals/#hsts でそのホストの HSTS エントリを削除する(プリロード済みのドメインでは不可)か、開発用サーバーにローカルで信頼される証明書を設定してください。
text Local development on a domain with HSTS (e.g. *.dev, or a site you once visited over HTTPS): open chrome://net-internals/#hsts, "Delete domain security policies" for the host, or serve the dev site over HTTPS with a locally trusted certificate (mkcert). - 3.
サイト運営者:https:// で提供している箇所で TLS を有効にする
リスナーに TLS と証明書を設定し、外部からハンドシェイクをテストしてください。
text Site owners: make sure the port that browsers reach with https:// has TLS enabled (nginx: "listen 443 ssl;" plus ssl_certificate / ssl_certificate_key).