FirefoxのSSL_ERROR_NO_CYPHER_OVERLAPを修正する:サーバーとクライアント間で共通の暗号スイートがない

intermediate🔒 SSL/TLS2026-05-21| Firefox(全バージョン)、Nginx 1.x / Apache 2.x、Ubuntu/Debian/CentOS、TLS 1.0〜1.3

Error Message

SSL_ERROR_NO_CYPHER_OVERLAP
#ssl#tls#firefox#暗号スイート#nginx#apache

エラーの内容

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ディレクティブを変更することがあります。

Related Error Notes