FirefoxにおけるSSL_ERROR_RX_RECORD_TOO_LONGエラーの修正方法

intermediate🔒 SSL/TLS2026-04-07| Firefoxブラウザ、Nginx/Apacheウェブサーバー、Linux/Windowsサーバー環境

Error Message

SSL_ERROR_RX_RECORD_TOO_LONG
#ssl#firefox#nginx#apache#https#sysadmin

このエラーの実際の意味

HTTPS経由でサイトを読み込もうとしていますが、Firefoxが問題に直面し、安全な接続に失敗したことを表示しています。具体的には、SSL_ERROR_RX_RECORD_TOO_LONG というコードが表示されます。これは標準的な「証明書の期限切れ」の警告ではなく、根本的なプロトコルの不一致を意味します。ブラウザとサーバーが同じ言語で通信できていないため、この画面には「リスクを承知で続行」といったボタンは表示されません。

根本的な原因:HTTP vs. HTTPS

このエラーは、Firefoxが暗号化されたTLSハンドシェイクを期待しているのに、代わりに暗号化されていないプレーンなHTTPレスポンスを受け取ったときに発生します。通常、サーバーがポート443でリッスンしているものの、その特定のポートでSSL/TLSを使用するように設定されていない場合に起こります。

なぜ「record too long(レコードが長すぎる)」という表現なのでしょうか?標準的なTLSレコードの最大長は16,384バイト(16 KB)です。Firefoxが接続すると、「Client Hello」を送信します。もしサーバーが HTTP/1.1 404 Not Found のようなプレーンテキストで応答すると、Firefoxはその最初の数文字のASCII文字をバイナリの長さフィールドとして解釈しようとします。その結果、算出される数値が膨大になり、16 KBの制限を大幅に超えてしまうため、ブラウザは安全のために接続を強制終了します。

解決策1:Nginxの設定を修正する

Nginxを運用しているサーバー管理者の場合、listen ディレクティブで ssl パラメータを省略していることが原因であることが多いです。もし設定が以下のスニペットのようになっているなら、それが原因です:

server {
    listen 443;
    server_name example.com;
    # エラー:ポート443は開いているが、SSLが有効になっていない
}

これを修正するには、listenの行に ssl を追加し、証明書のパスを定義します。最近の設定では、脆弱な古いプロトコルを避けるためにTLSバージョンも指定する必要があります:

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # セキュリティ向上のためTLS 1.2と1.3を使用する
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
}

ターミナルを閉じる前に、構文を確認してサービスを再読み込みしてください:

sudo nginx -t
sudo systemctl reload nginx

解決策2:ApacheのVirtualHostを修正する

Apacheユーザーの場合、ポート443のブロック内で SSLEngine がオフになっているとこの問題が発生します。有効な証明書がリンクされていても、明示的に暗号化をオンにしない限り、Apacheはデフォルトでプレーンテキストを使用します。

設定ファイル(通常は /etc/apache2/sites-available/ 内)で以下の行を確認してください:

<VirtualHost *:443>
    ServerName example.com
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/example.pem
    SSLCertificateKeyFile /etc/ssl/private/example.key
</VirtualHost>

新しい証明書をインストールしたばかりの場合は、SSLモジュールが実際に動作しているか確認してください。念のため以下のコマンドを実行します:

sudo a2enmod ssl
sudo a2ensite your-ssl-config.conf
sudo systemctl restart apache2

解決策3:Cloudflareプロキシの不一致を解消する

トラフィックがCloudflareや同様のCDNを経由している場合、このエラーは多くの場合「SSL終端」のループに起因します。これは、プロキシがあるプロトコルを期待しているのに、オリジンサーバーが別のプロトコルを提供している場合に発生します。

- **Flexible SSLの罠:** 「Flexible」モードでは、Cloudflareはポート80(HTTP)経由でサーバーに接続します。サーバーがポート443への強制リダイレクトを設定しているにもかかわらず、そのポートでSSLが設定されていない場合、ハンドシェイクは失敗します。
- **Full/Strictモード:** これが推奨される設定です。オリジンサーバーに有効な証明書(「Full」モードの場合は自己署名証明書でも可)があり、実際の暗号化を使用してポート443で通信する必要があります。

Cloudflareの設定を Full または Full (strict) に切り替えてください。その後、オリジンサーバーが誤ってポート443でプレーンなHTTPを提供していないか確認します。

解決策4:ローカルブラウザのトラブルシューティング

ChromeやSafariではサイトが表示されるのに、Firefoxで失敗しますか?その場合は、ローカルキャッシュの不具合や、ブラウザ内のプロキシ設定の競合が原因かもしれません。

- **ハードリフレッシュを強制する:** `Ctrl + F5`(Macの場合は `Cmd + Shift + R`)を押して、ローカルキャッシュをバイパスします。
- **Firefoxのプロキシ設定を確認する:** **設定** > **ネットワーク設定** に移動します。環境で特別に必要とされていない限り、「プロキシなし」に設定されていることを確認してください。
- **スタートアップキャッシュをリセットする:** アドレスバーに `about:support` と入力し、**スタートアップキャッシュを消去...** を選択して、一時的なアーキテクチャデータを削除します。

修正を確認する方法

ブラウザの結果だけに頼らず、curl を使用してサーバーが実際に何を返しているかを確認してください。ターミナルで以下のコマンドを実行します:

curl -vI https://yourdomain.com

* SSL connection using TLSv1.3 という行を探してください。もし Received HTTP/0.9 when not allowed と表示される場合は、サーバーは依然として暗号化ポートでプレーンテキストを出力しています。ハンドシェイクが正常に完了すれば、Firefoxのエラーはすぐに解消されるはずです。

Related Error Notes