問題の概要
Firefoxユーザーは、ウェブサイトが古いセキュリティを使用している場合、しばしば壁に突き当たります。SSL_ERROR_WEAK_SERVER_EPHEMERAL_DH_KEY というメッセージが表示された場合、ブラウザはあなたを保護するために接続をブロックしています。これは、サーバーが「輸出グレード(export-grade)」のDiffie-Hellman (DH) キーを使用していることを検出したためです。これらのキーは通常512または768ビットで、あまりにも短すぎます。
90年代当時、これらの弱いキーは輸出されるソフトウェアの法的要件でした。今日では、これらは重大な脆弱性となります。現代のブラウザは少なくとも1024ビットのパラメータを必要としますが、セキュリティコミュニティでは、Logjam attackを防ぐために2048ビットを絶対的な最小値と見なしています。このアップグレードを行わないと、攻撃者がリアルタイムで暗号を解読できる可能性があります。
なぜブラウザはこれらのキーをブロックするのか
Diffie-Hellman(DH)鍵交換により、サーバーと訪問者は第三者に知られることなく秘密鍵を共有できます。しかし、この交換で使用される素数が小さすぎると、予測可能になってしまいます。研究者たちは、512ビットの素数がわずか数百ドルの費用で8時間以内に解読できることを示しました。これらの接続をブロックすることで、Firefoxはあなたのプライベートなデータが非常に脆弱な接続を介して送信されないようにしています。
ステップ1:より強力なDHパラメータの生成
解決の第一歩は、ユニークで強度の高いDHグループを作成することです。4096ビットキーのようなCPUへの大きな負荷をかけずに優れたセキュリティを提供できる、2048ビットを推奨します。ターミナルで次のコマンドを実行してください。
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
注: このプロセスはCPU負荷が高いです。サーバーのハードウェアによっては1〜5分かかる場合があります。次のステップに進む前に、完全に終了するまでお待ちください。
ステップ2:サーバー設定の更新
dhparam.pem ファイルが作成されたので、ウェブサーバーがそれを参照するように設定する必要があります。
Nginxでの修正方法
サイトの設定ファイルを見つけます。通常は /etc/nginx/sites-available/ または /etc/nginx/conf.d/ にあります。
ポート443の server ブロック内に、以下に示す ssl_dhparam の行を追加します。
server {
listen 443 ssl;
server_name yourdomain.com;
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
# Nginxに新しいDHパラメータを使用するように指示
ssl_dhparam /etc/ssl/certs/dhparam.pem;
# 現代的なプロトコルと暗号スイートを使用
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;
}
構文を確認し、サービスをリロードします:
sudo nginx -t
sudo systemctl restart nginx
Apacheでの修正方法
Apacheの設定はバージョンによって異なります。Apache 2.4.8以降の場合、プロセスは簡単です。
オプションA:推奨される現代的な方法<VirtualHost *:443> ブロック内にこのディレクティブを追加します:
<VirtualHost *:443>
ServerName yourdomain.com
SSLEngine on
SSLCertificateFile /path/to/cert.crt
SSLCertificateKeyFile /path/to/key.key
# Apacheに新しいDHファイルを指定
SSLOpenSSLConfCmd DHParameters "/etc/ssl/certs/dhparam.pem"
</VirtualHost>
オプションB:従来の方法古いバージョンのApacheを使用している場合は、DHパラメータを証明書ファイルの末尾に追記するだけです:
cat /etc/ssl/certs/dhparam.pem | sudo tee -a /etc/ssl/certs/your_certificate.crt
変更を適用するためにApacheを再起動します:
sudo systemctl restart apache2
Java / Tomcatでの修正方法
古いJavaバージョン(Java 8u121以前)は、DHの制限が1024ビットにハードコードされています。Javaをアップグレードできない場合は、DHE暗号を完全に無効にする必要があります。server.xml 内で Connector を探し、ciphers 属性を編集して TLS_DHE_ で始まるものをすべて除外します。代わりに、より高速でDHパラメータの問題を完全に回避できる TLS_ECDHE_ (Elliptic Curve) を優先させてください。
ステップ3:修正の確認
エラーページが消えたからといって、修正されたと思い込まないでください。これらのツールを使用して確認してください。
コマンドラインでのチェック
ローカルマシンから次のOpenSSLコマンドを実行して、サーバーが何を提供しているかを確認します:
openssl s_client -connect yourdomain.com:443 -cipher "DHE" | grep "Server Temp Key"
修正が成功していれば、次のように返されます:Server Temp Key: DH, 2048 bits。
視覚的なチェック
Qualys SSL Labs にアクセスしてください。ドメインのスキャンを実行し、「Cipher Suites」セクションまでスクロールします。「DH 2048 bits」と表示され、Logjamテストが合格(緑色)になっていることを確認してください。
よくある落とし穴
- 読み取り権限: NginxやApacheの起動に失敗する場合は、サービスユーザー(
www-dataなど)が/etc/ssl/certs/dhparam.pemを読み取る権限を持っているか確認してください。 - 4096ビットの罠: 4096ビットの方がより安全ですが、すべての訪問者に対して最初のハンドシェイクが大幅に遅くなります。99%のウェブサイトにとって、2048ビットは速度とセキュリティの完璧なバランスです。
- 古いデバイス: Windows XPや非常に古いAndroid 2.3デバイスをサポートする必要がある場合、2048ビットのDHでは接続が切れる可能性があります。そのような稀なケースでは、ECDHE暗号に切り替える方が適切な回避策となります。

