DigiCert証明書の正規代理店株式会社アールエムエス
DigiCert サーバー証明書利用団体
  1. ホーム
  2. サポート
  3. 技術情報
  4. ApacheとNginxでのForward Secrecy設定方法

ApacheとNginxでのForward Secrecy設定方法

ユーザーとエンドユーザーの間の通信を暗号化するには、SSL証明書を購入してサーバーにインストールし、証明書を使用してこれらの通信を保護するようにWebサイトを構成します。
SSL接続は、エンドユーザーのブラウザがWebサイトにアクセスする際に開始されます。開始の最初の段階でハンドシェイクが行われます。

このハンドシェイク過程で、ブラウザとサーバーの暗号化に利用する情報が交換され、検証が行われ、ブラウザとサーバー両方の基準を満たすセッションキーが作成されます。
セッションキーが作成されると、エンドユーザーとサイト間の通信の残りの部分がセッションキーで暗号化されて通信が保護されます。
歴史的に、セッション鍵をネゴシエートする最も一般的な方法は、RSA公開鍵暗号方式です。
RSA公開鍵暗号方式では、ブラウザは作成したセッションキーパラメータをサーバーの公開鍵を使用して暗号化し、サーバに送信します。サーバーは、このセッションキーをサーバーの秘密鍵で復号化することができます。

RSA鍵交換メカニズムを使用すると以下の問題が発生します。
これは、サーバーの鍵ペアと、固有の安全なセッションごとに作成されたセッション鍵との間にリンクが作成されるためです。

  • 攻撃者は暗号化されたトラフィックを任意の時間記録し、秘密鍵にアクセスできるようになるまでアーカイブすることができます。
  • 攻撃者がサーバーの秘密鍵にアクセスできるようになった場合、すべてのアーカイブを復号化できます。

一方、Perfect Forward Secrecy(PFS)を有効にすると、サーバーの秘密キーと各セッションキーとのリンクがなくなるため、攻撃者がサーバーの秘密鍵にアクセスできるようになった場合でも、攻撃者は秘密鍵を使用してアーカイブを復号することはできません。
この特長から、「Perfect Forward Secrecy(PFS)完全前方秘匿性」と呼ばれています。

SSL Lab の SSL Server Testにホスト名を入力すると、そのWebサイトでPerfect Forward Secrecyが利用されているかを確認することができます。

EV SSL Plus/1年あたり32,500円から
緑のアドレスバーでサイトの信頼性向上 DigiCert(デジサート) EV SSL/TLS サーバー台数無制限 国内最安値でご提供

Perfect Forward Secrecy の原理

Perfect Forward Secrecyでは、セッションキーの交換にRSA鍵交換メカニズムを使用するのではなく、楕円曲線ディフィー・ヘルマン [Elliptic Curve Diffie-Hellman (ECDHE)] 鍵交換を使う必要があります。

暗号化アルゴリズムではRSA公開鍵を使うことはできますが、鍵交換ではRSAを使うことはできません。

ECDHEは、通常のディフィー・ヘルマン [Diffie-Hellman(DH)] よりもはるかに高速ですが、どちらもSSL接続に関与するエンティティだけがアクセスできるセッションキーを作成します。
セッションキーはサーバーのキーペアにリンクされていないため、サーバーの秘密キーのみを使用してSSLセッションを復号化することはできません。

Forward Secrecyとは も参照してください。

Perfect Forward Secrecyを設定する

ApacheでPerfect Forward Secrecyを設定する

楕円曲線暗号 [Elliptic Curve cryptography (ECC)] 対応WebサーバーとSSL/TLS libraryが必要です。
対応する最小バージョン
  • OpenSSL 1.0.1c+
  • Apache 2.4x
HeartbleedバグとOpenSSLの脆弱性対応のため、OpenSSLは最新バージョンの利用をお勧めします。

Apache Perfect Forward Secrecy 設定手順

デフォルトでは、ハンドシェイクの過程ではクライアントが指定した暗号スイートが利用されます。
そこで、まずサーバーが指定した暗号スイートを利用するように設定します。次に、利用する暗号スイートをサーバーの設定ファイルで指定します。

  1. 設定対象のApacheサーバー設定ファイルを探す
    事例サンプル
    1. 以下のコマンドを実行します。
      この例では、/etc/apacheをApache サーバーの設定が置かれているディレクトリと想定していますが、インストール方法によって、/etc/httpd/etc/apache2等のケースもあります。
      grep -i -r "SSLEngine" /etc/apache
      
    2. 上のコマンドで、Forward Secrecy設定を行うべきファイル情報が得られますので、該当のファイルを開きます。
  2. 対象Virtual Hostディレクティブ内に以下の設定を追加
    1. SSLProtocolで以下を指定します。
      SSLProtocol all -SSLv2 -SSLv3
    2. SSLHonorCipherOrderで以下を指定します。
      SSLHonorCipherOrder on
    3. For SSLCipherSuiteでは以下のどれかを指定します。
      • 推奨の設定
        このSSLCipherSuite設定では、タイミング攻撃に耐性があるGCM(Galois Counter Mode)スイートを利用します。
        また、パフォーマンスを向上させるために、高速なECDHEスイートを可能な限り使用します。
        SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4"
      • 広範囲のブラウザや古いブラウザをサポートする最後の手段としてRC4で設定する(非推奨)
        このSSLCipherSuite設定では、タイミング攻撃に耐性があるGCM(Galois Counter Mode)スイートを利用し、広範囲のブラウザや古いブラウザをサポートする最後の手段としてのみRC4を利用します。
        また、パフォーマンスを向上させるために、高速なECDHEスイートを可能な限り使用します。
        SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS +RC4 RC4"
  3. Apacheの再起動
    インストール環境によって異なる場合がありますが、以下のようにApacheを再起動します。
    apachectl -k restart
    
  4. SSL LabのSSL Server TestでPerfect Forward Secrecyが正しく設定されていることを確認してください。
WildCard Plus/1年あたり88,000円から
ひとつの証明書でホスト名数・サーバー台数無制限で利用可能 DigiCert(デジサート)企業認証SSL/TLS 国内最安値でご提供

NginxでPerfect Forward Secrecyを設定する

楕円曲線暗号 [Elliptic Curve cryptography (ECC)] 対応WebサーバーとSSL/TLS libraryが必要です。
対応する最小バージョン
  • OpenSSL 1.0.1c+
  • Nginx 1.0.6+ and 1.1.0+
HeartbleedバグとOpenSSLの脆弱性対応のため、OpenSSLは最新バージョンの利用をお勧めします。

Nginx Perfect Forward Secrecy設定手順

まず、サーバーが指定した暗号スイートを利用するように設定します。次に、利用する暗号スイートをサーバーの設定ファイルで指定します。

  1. 設定対象のNginxサーバー設定ファイルを探す
    事例サンプル
    1. 以下のコマンドを実行します。
      grep -r ssl_protocol /etc/nginx
      

      この例では、/etc/nginx をNginxの設定ファイルのディレクトリと想定しています。ディレクトリ名は実情に合わせて指定してください。

    2. 上のコマンドでForward Secrecy設定を行うべきファイル情報が得られますので、該当のファイルを開き、対象のServer Blockを探します。
  2. 以下をForward Secrecy対象のServer Blockに追記する
    1. ssl_protocolsで以下を指定します。
      ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
    2. ssl_prefer_server_ciphersで以下を指定します。
      ssl_prefer_server_ciphers on;
    3. For ssl_ciphersでは以下のどれかを指定します。
      • 推奨の設定
        このSSLCipherSuite設定では、タイミング攻撃に耐性があるGCM(Galois Counter Mode)スイートを利用します。
        また、パフォーマンスを向上させるために、高速なECDHEスイートを可能な限り使用します。
        ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
      • 広範囲のブラウザや古いブラウザをサポートする最後の手段としてRC4で設定する(非推奨)
        このSSLCipherSuite設定では、タイミング攻撃に耐性があるGCM(Galois Counter Mode)スイートを利用し、広範囲のブラウザや古いブラウザをサポートする最後の手段としてのみRC4を利用します。
        また、パフォーマンスを向上させるために、高速なECDHEスイートを可能な限り使用します。
        ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS +RC4 RC4";
  3. Nginxの再起動
    インストール環境によって異なる場合がありますが、以下のようにNginxを再起動します。
    sudo service nginx restart
    
  4. SSL LabのSSL Server TestでPerfect Forward Secrecyが正しく設定されていることを確認してください。
マルチドメイン証明書/1年あたり50,833円から
Windowsサーバーにおすすめ 最大25ホスト名まで対応 DigiCert(デジサート) 企業認証SSL/TLS 国内最安値でご提供
SSL サーバ証明書とは?
30日間テスト証明書
30日間返金保証制度あり!
コードサイニング証明書
ドキュメントサイニング証明書
デジタル証明書ニュース
HTTPS入門
digicert.comトピックス&ニュース