ChromeでHTTPSサイトにアクセスする際のERR_SSL_PROTOCOL_ERRORを修正する

intermediate🔒 SSL/TLS2026-05-15| Google Chrome(全バージョン)、Windows 10/11、macOS、Linux、Ubuntu 20.04/22.04、Nginx 1.18+、Apache 2.4+

Error Message

ERR_SSL_PROTOCOL_ERROR
#chrome#ssl#https#nginx#apache#ブラウザ

表示されているエラーについて

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_protocolsTLSv1または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でキャプチャを解析する

Related Error Notes