表示されているエラーについて
Chromeを開いてHTTPSサイトにアクセスしようとすると、ページの代わりに真っ白な画面が表示されます:
ERR_SSL_PROTOCOL_ERROR
場合によってはこのサイトでは安全な接続を提供できませんと表示されます。証明書の警告も、部分的な読み込みもなく、完全に停止します。
ハンドシェイクは開始されましたが、完了しませんでした。ChromeがセキュアなTLS接続を確立しようとしたところ、サーバー(または途中の何か)が期待どおりに応答しませんでした。原因はブラウザ、ネットワーク、またはサーバー自体にある可能性があります。
主な原因
- ポート443はリッスンしているがSSLが設定されていない — サーバーがHTTPSポートでHTTPを提供している
- NginxまたはApacheのSSL証明書の設定ミス
- サーバーで古いTLSバージョンが強制されている(SSLv3、TLS 1.0 — Chrome 84以降はこれらを拒否)
- システムクロックが正確でない — タイムスタンプが数分以上ずれていると、Chromeは証明書を拒否する
- ChromeのSSL状態キャッシュが古くなっている
- ファイアウォール、プロキシ、またはウイルス対策ソフトがHTTPSトラフィックを傍受し、ハンドシェイクを妨害している
- Chromeが信頼するよう設定されていない自己署名証明書
まず確認:問題はあなたの端末かサーバーか?
すぐにサーバーの設定を変更しないでください。まず問題がどこにあるかを特定しましょう:
- FirefoxまたはEdgeで同じURLを試す — 正常に読み込めればChrome固有の問題
- スマートフォンのホットスポットに切り替えて再試行 — それで解決すれば、ネットワーク(ファイアウォールまたはプロキシ)が原因
- ターミナルからSSLハンドシェイクをテストする:
curl -vI https://yourdomain.com 2>&1 | grep -E "SSL|TLS|error|certificate"
または直接OpenSSLを使用する:
openssl s_client -connect yourdomain.com:443 -tls1_2
OpenSSLでも失敗する場合、問題はサーバー側にあります。OpenSSLは成功するがChromeでエラーが出る場合は、まずChromeの設定とローカルの要因を確認してください。
修正1:ChromeのSSL状態キャッシュをクリアする
Chromeは繰り返しのアクセスを高速化するためにSSLセッションデータをキャッシュします。古くなったキャッシュや破損したキャッシュが、有効な証明書でもERR_SSL_PROTOCOL_ERRORを引き起こすことがあります。
- chrome://settings/ にアクセスする
- 閲覧データを削除 を検索 → 詳細設定タブを開く
- キャッシュされた画像とファイルとCookieと他のサイトデータにチェックを入れる
- データを削除をクリックする
Windowsの場合は、OSレベルのSSL状態もクリアする:
# Windows: インターネットオプション → コンテンツタブ → SSL状態のクリア
スタート → ファイル名を指定して実行 → inetcpl.cpl → コンテンツ → SSL状態のクリア
もう一つ確認すべき場所 — ChromeのHSTSキャッシュ。以下にアクセスする:
chrome://net-internals/#hsts
ドメインセキュリティポリシーを削除の下にドメインを入力し、削除をクリックする。
修正2:システムクロックを同期する
SSL証明書には「有効期間の開始日」と「有効期間の終了日」があります。システムクロックが10〜15分でもずれていると、Chromeはハンドシェイクを完全に拒否します。
# Linux / Ubuntu
timedatectl status
sudo timedatectl set-ntp true
# 手動で同期する場合
sudo ntpdate -u pool.ntp.org
Windowsの場合:時計を右クリック → 日付と時刻の調整 → 今すぐ同期。
修正3:NginxのSSL設定を修正する
サーバーを自分で運用している場合、これが最も一般的な原因です。listenディレクティブにsslキーワードを忘れたり、証明書のパスが間違っていたりすると、まさにこのエラーが発生します。
まず設定を検証する:
sudo nginx -t
正しいHTTPSサーバーブロックの例:
server {
listen 443 ssl;
server_name yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
root /var/www/html;
index index.html;
}
}
ERR_SSL_PROTOCOL_ERRORが発生する典型的な3つのミス:
sslキーワードなしのlisten 443— Nginxがポート443でHTTPを提供し、ChromeがTLSをネゴシエートできない- 証明書のパスが間違っている — Nginxはエラーなく起動するがハンドシェイクがサイレントに失敗する
ssl_protocolsにTLSv1またはTLSv1.1のみ指定 — Chrome 84以降は両方のサポートを廃止
修正後にリロードする:
sudo nginx -t && sudo systemctl reload nginx
修正4:ApacheのSSL設定を修正する
Apacheにはmod_sslの有効化と適切に構成されたVirtualHostが必要です。まずここから確認する:
# SSLモジュールが有効でない場合は有効化する
sudo a2enmod ssl
sudo systemctl restart apache2
正しく動作するSSL VirtualHostの例:
<VirtualHost *:443>
ServerName yourdomain.com
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/yourdomain.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/yourdomain.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/yourdomain.com/chain.pem
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite HIGH:!aNULL:!MD5
</VirtualHost>
sudo apachectl configtest && sudo systemctl reload apache2
修正5:期限切れの証明書を更新する
Let's Encryptの証明書は90日ごとに期限切れになります。現在の状態を確認する:
sudo certbot certificates
期限切れ、または期限まで1週間以内の場合は強制更新する:
sudo certbot renew --force-renewal
sudo systemctl reload nginx # または apache2
修正6:ウイルス対策ソフトのHTTPSスキャンを無効にする
Avast、Kaspersky、ESETなどのツールはHTTPS接続を傍受し、独自の証明書に置き換えることがあります。Chromeは予期しない証明書を検出するとハンドシェイクを中断します。
HTTPSスキャンを一時的にオフにしてページを再読み込みしてください。問題が解決したら、再度有効にしてそのドメインを例外として追加してください — HTTPSインスペクションを永続的にオフにしないでください。
修正7:ドメインのHSTSをクリアする
サイトはHSTSヘッダーを通じてChromeに常にHTTPSを使用するよう指示できます。以前HSTSを適用していたサイトで証明書が壊れた場合、ChromeはHTTPへのフォールバックすら試みません。保存されているポリシーを削除する:
chrome://net-internals/#hstsにアクセスする- ドメインセキュリティポリシーを削除の下にドメインを入力する
- 削除をクリックする
確認手順
修正を適用したら、ハンドシェイクが実際に機能していることを確認する:
# TLSハンドシェイクのテスト
openssl s_client -connect yourdomain.com:443 -tls1_2
# 証明書の有効期限を確認
echo | openssl s_client -connect yourdomain.com:443 2>/dev/null | openssl x509 -noout -dates
# SSLの完全な診断
curl -vI https://yourdomain.com 2>&1 | head -40
Chromeで鍵アイコンをクリック → 接続は保護されています → 証明書は有効ですと表示されれば完了です。
まだ解決しない場合
一般的な修正をすべて試しても解決しない場合、あまり知られていない原因として以下が考えられます:
- ファイアウォールでポート443がブロックされている:
sudo ufw statusまたはsudo firewall-cmd --list-ports - ドメインが別のIPに解決されている:
dig yourdomain.com +short - 別のドメイン向けに発行された証明書 — ワイルドカードとサブドメインの不一致は見落としやすい
- SSLの詳細デバッグ:
chrome --ssl-key-log-file=/tmp/ssl.logでChromeを起動し、Wiresharkでキャプチャを解析する

