エラーの内容
Firefoxが空白ページを表示し、以下のエラーが出ます:
SSL_ERROR_NO_CYPHER_OVERLAP
意味:Firefoxがサーバーとハンドシェイクしようとしたものの、共通の暗号スイートで合意できませんでした。サーバーがFirefoxにより数年前にブラックリスト入りした暗号を要求しているか、暗号リストが完全に壊れているかのどちらかです。
根本原因
原因は4つありますが、最初の1つがケースの80%をカバーしています:
- サーバーがTLS 1.0またはTLS 1.1のみを受け入れている — Firefox 78以降(2020年6月リリース)は両方のサポートを廃止しました。
ssl_ciphers(Nginx)またはSSLCipherSuite(Apache)ディレクティブに、Firefoxが以前に削除したRC4、DES、またはエクスポートグレードの暗号しかリストされていない。- 2014年のStack Overflowの回答からSSL設定をコピー&ペーストした際に、それらの暗号が今も有効かどうか確認しなかった。
- 一見まともに見えるカスタム暗号文字列が、現代のFirefoxがサポートするものをすべて誤って除外している。
Chromeが同じサイトを問題なく読み込めるのは、一部のレガシー暗号をまだ受け入れているからです。Firefoxはそうではありません。これはバグではなく、意図された仕様です。
まず診断する
設定はまだ触らないでください。サーバーが実際に何をアドバタイズしているか確認しましょう:
# TLSバージョンをそれぞれ個別にテスト
openssl s_client -connect yourdomain.com:443 -tls1
openssl s_client -connect yourdomain.com:443 -tls1_1
openssl s_client -connect yourdomain.com:443 -tls1_2
openssl s_client -connect yourdomain.com:443 -tls1_3
# グレード付きの完全な暗号リスト
nmap --script ssl-enum-ciphers -p 443 yourdomain.com
TLS 1.0/1.1は接続できるがTLS 1.2が失敗する?それが原因です。暗号リストにRC4やDESのバリアントしかない?同じ問題、別の角度からのアプローチです。
修正1:Nginx SSL設定の更新
ケースの90%をカバーします。サーバーブロックを開きます:
sudo nano /etc/nginx/sites-available/yourdomain.conf
# または
sudo nano /etc/nginx/conf.d/yourdomain.conf
SSLセクションを以下に置き換えます:
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;
# TLS 1.0と1.1は廃止 — 提供しない
ssl_protocols TLSv1.2 TLSv1.3;
# モダンな暗号スイート — Firefox 78以降すべてでサポート済み
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# セッションキャッシュ — リピートビジターのハンドシェイクオーバーヘッドを削減
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
}
テストしてリロードします:
sudo nginx -t
sudo systemctl reload nginx
修正2:Apache SSL設定の更新
SSL仮想ホストを見つけます — 通常は/etc/apache2/sites-available/または/etc/httpd/conf.d/ssl.confにあります:
sudo nano /etc/apache2/sites-available/yourdomain-ssl.conf
以下のディレクティブを更新します:
<VirtualHost *:443>
ServerName yourdomain.com
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 ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder off
</VirtualHost>
テストして再起動します:
sudo apachectl configtest
sudo systemctl reload apache2
# RHEL/CentOS:
sudo systemctl reload httpd
修正3:TLS 1.0しか使えないレガシークライアント
まれなケースですが発生します — 古いIoTデバイス、組み込みシステム、またはTLS 1.0に固定された内部ツールなどです。サーバーを修正する間、Firefoxで一時的に再有効化できます:
- アドレスバーに
about:configと入力する - 警告を承認する
security.tls.version.minを検索する3(TLS 1.2)を1(TLS 1.0)に変更する
**これは回避策であり、解決策ではありません。**TLS 1.0には既知の実用的な攻撃(BEAST、POODLE)があります。サーバーを修正してください。作業が完了したらこの設定を元に戻してください。
修正4:nginx.conf内のssl_ciphersの競合
見落としやすい問題です。/etc/nginx/nginx.conf内のグローバルなssl_ciphersが、サーバーブロックで設定した値を暗黙的に上書きすることがあります。競合を確認しましょう:
grep -rn "ssl_ciphers\|ssl_protocols" /etc/nginx/
複数のファイルに異なる値がある場合は統合してください。すべてを共有スニペットに集約します:
# /etc/nginx/snippets/ssl-params.conf
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:...;
ssl_prefer_server_ciphers off;
各サーバーブロックにはこれだけ記述します:
include snippets/ssl-params.conf;
設定の唯一の情報源ができ、予期しない問題がなくなります。
修正の確認
リロード後、以下を実行して確認します:
# TLS 1.2は成功するはず
openssl s_client -connect yourdomain.com:443 -tls1_2 2>&1 | grep -E "Protocol|Cipher"
# 期待される出力:
# Protocol : TLSv1.2
# Cipher : ECDHE-RSA-AES256-GCM-SHA384
# TLS 1.3も動作するはず
openssl s_client -connect yourdomain.com:443 -tls1_3 2>&1 | grep -E "Protocol|Cipher"
# TLS 1.1は拒否されなければならない
openssl s_client -connect yourdomain.com:443 -tls1_1 2>&1 | grep -i "error\|alert"
SSL Labsでも確認しましょう — 適切な設定であればAが取得できます。これらすべてを行った後もSSL_ERROR_NO_CYPHER_OVERLAPが表示される場合は、FirefoxのSSLステートキャッシュをクリアしてください:about:preferences#privacy → データを消去 → キャッシュされたウェブコンテンツ。
予防策
- MozillaのSSL設定ジェネレーター(ssl-config.mozilla.org)は、すぐに使えるNginx/Apache設定を生成します。現在の推奨事項を自動的に追跡しているので、暗号文字列を手書きする代わりに活用しましょう。
- デプロイプロセスの一環としてSSL Labsを実行してください。リリースごとに5分かけるほうが、Firefoxでサイトが読み込めない理由をユーザーに説明するよりずっとましです。
- SSL設定を年に一度監査してください。暗号の推奨事項は2018年から2024年の間に大きく変化しており、当時は問題なかったものが今は通らないかもしれません。
- CertbotでLet's Encryptを使用している場合は、
sudo certbot renew --dry-runを実行し、その後Nginx/Apache設定を必ず確認してください。Certbotは更新時にsslディレクティブを変更することがあります。

