26.6 SSLをサポートするセキュアWebサーバのセットアップ

クレジットカード情報などの機密データがWebサーバとクライアント間で転送される場合は常に、接続が安全で、認証により暗号化されていることが望まれます。mod_sslは、クライアントとWebサーバ間のHTTP通信に、SSL (secure sockets layer)およびTLS (transport layer security)プロトコルを使用する、強力な暗号化を提供します。SSL/TSLを使用することにより、Webサーバとクライアント間でプライベートな接続が確立されます。データの整合性が保証され、クライアントとサーバ間で相互認証ができるようになります。

この目的で、サーバは、URLに対するリクエストに応答する前に、サーバの有効な識別情報を含むSSL証明書を送ります。これにより、サーバが唯一の正当な通信相手であることが保証されます。加えて、この証明書は、クライアントとサーバの間の暗号化された通信が、重要な内容がプレーンテキストとして見られる危険なしに、情報を転送できることを保証します。

mod_sslは、SSL/TSLプロトコル自体は実装しませんが、ApacheとSSLライブラリ間のインタフェースとして機能します。SUSE Linuxでは、OpenSSLライブラリが使用されます。OpenSSLは、Apacheとともに自動的にインストールされます。

Apacheでmod_sslを使用する場合の最もはっきりした影響は、URLのプレフィックスがhttp://ではなくhttps://となることです。

26.6.1 SSL証明書の作成

SSL/TSLをWebサーバで使用するには、SSL証明書を作成する必要があります。この証明書は、両者が互いに相手を識別できるように、Webサーバとクライアント間の認証に必要です。証明書の整合性を確認するには、すべてのユーザが信用する者によって署名される必要があります。

作成できる証明書の種類には3つのタイプがあります。これらは、テストの目的のみの「ダミー」証明書、あらかじめ定義されている信用する一部のユーザグループ用の自己署名付き証明書、および公的な独立団体のCA (Certificate Authority)によって署名される証明書です。

証明書の作成には、基本的に2つのステップで行えます。まず、CAの秘密鍵が生成され、次に、この鍵を使用してサーバ証明書が署名されます。

[Tip]関連情報

SSL/TSLの概念および定義の詳細については、http://httpd.apache.org/docs/2.2/ssl/ssl_intro.htmlを参照してください。

26.6.1.1 「ダミー」証明書の作成

ダミー証明書の生成は簡単です。/usr/bin/gensslcertスクリプトを呼び出すだけです。このスクリプトは以下のファイルを作成または上書きします。

  • /etc/apache2/ssl.crt/ca.crt

  • /etc/apache2/ssl.crt/server.crt

  • /etc/apache2/ssl.key/server.key

  • /etc/apache2/ssl.csr/server.csr

ca.crtのコピーは、ダウンロード用に/srv/www/htdocs/CA.crtにも配置されます。

[Important]重要項目

ダミー証明書は、実働システム上では必ず使用しないでください。テストの目的のみで使用してください。

26.6.1.2 自己署名付き証明書の作成

イントラネットまたは定義されている一部のユーザグループ用にセキュアWebサーバをセットアップするとき、独自のCA (Certificate Authority)を通じて証明書に署名するので十分な場合があります。

自己署名付き証明書の作成手順は、対話形式の9つのステップで構成されています。/usr/share/doc/packages/apache2ディレクトリに移動し、以下のコマンドを実行します。./mkcert.sh make --no-print-directory /usr/bin/openssl /usr/sbin/ custom。このディレクトリ以外からこのコマンドを実行しないでください。プログラムは、一連のプロンプトを表示します。この一部には、ユーザ入力が必要なものもあります。

手順 26.1 mkcert.shを使用した自己署名付き証明書の作成

  1. Decide the signature algorithm used for certificates

    一部の古いブラウザでDSAを使用すると問題があるため、RSA (デフォルトのR)を選択します。

  2. CA用RSA秘密鍵を生成(1024ビット)

    操作の必要はありません。

  3. CAへのX.509証明書署名要求を生成

    ここで、CAの識別名を作成します。このとき、国名または組織名など、2、3の質問に答える必要があります。ここで入力した内容が証明書に含まれるため、有効なデータを入力します。すべての質問に答える必要はありません。該当しない、または空白のままにする場合は、「.」を使用します。一般名は、CA自体の名前です。My company CAなど、意味のある名前を選択します。

  4. CAによる署名用のX.509証明書を生成

    証明書バージョン3を選択します(デフォルト)。

  5. SERVER用のRSA秘密鍵を生成(1024ビット)

    操作の必要はありません。

  6. SERVERへのX.509証明書署名要求を生成

    ここで、サーバの鍵の識別名を作成します。質問は、CAの識別名で答えたものとほぼ同じです。ここで入力するデータがWenサーバに適用されますが、CAのデータと同一である必要はありません(サーバが別の場所に位置する場合など)。

    [Important]一般名の選択

    ここで入力する一般名は、セキュアサーバの完全修飾ホスト名(www.example.comなど)である必要があります。完全修飾ホスト名でない場合、Webサーバへのアクセス時、証明書がサーバと一致していないという警告がブラウザに表示されます。

  7. 独自のCAによる署名付きX.509証明書を生成

    証明書バージョン3を選択します(デフォルト)。

  8. セキュリティ用のパスフレーズのあるCAのRSA秘密鍵の暗号化

    CAの秘密鍵をパスワードで暗号化することをお勧めします。そのため、Yを選択し、パスワードを入力します。

  9. セキュリティ用のパスフレーズのあるSERVERのRSA秘密鍵の暗号化

    秘密鍵をパスワードで暗号化すると、Webサーバを起動するたびにこのパスワードを入力するよう求められます。このため、Webサーバのブートおよび再起動時にサーバを自動的に起動するのが難しくなります。したがって、一般的に、この質問にはNと答えます。パスワードで暗号化しないと鍵は保護されないため、この鍵へのアクセスは許可されたユーザのみに限定する必要があることに注意してください。

    [Important]サーバ鍵の暗号化

    サーバ鍵をパスワードで暗号化する場合は、/etc/sysconfig/apache2APACHE_TIMEOUTの値を増やします。値を増やさないと、サーバを起動しようとする試みが停止する前に、パスフレーズを入力するのに十分な時間がなくなります。

スクリプトの結果ページに、生成された鍵と証明書のリストが表示されます。スクリプトの出力とは異なり、ファイルはローカルディレクトリのconf内ではなく、適切な場所である、/etc/apache2/内に生成されます。

最後のステップとして、Webブラウザ内の認識および信用されたCAのリストに含まれるように、ユーザがアクセスできる場所に/etc/apache2/ssl.crt/ca.crtからCA証明書ファイルをコピーします。コピーしない場合、ブラウザは、この証明書が不明な認証局から発行されたものであると見なします。証明書は1年間有効です。

[Important]自己署名付き証明書

自己署名付き証明書は、CA(Certificate Authority)として認識および信用するユーザによってアクセスされるWebサーバ上でのみ使用します。自己署名付き証明書をオンラインショップなどで使用することはお勧めしません。

26.6.1.3 公式に署名された証明書の取得

証明書に署名する公式なCA(Certificate Authority)は、多数存在します。証明書は、信用のあるサードパーティによって署名されるため、完全に信用できます。通常、一般に運営されているセキュアWebサーバでは、証明書が公式に署名されます。

最も良く知られている公式なCAには、Thawte (http://www.thawte.com/)またはVerisign (www.verisign.com)があります。これらや、その他のCAは、すべてのブラウザにすでにコンパイルされているため、これらのCAによって署名された証明書は、ブラウザによって自動的に許可されます。

公式に署名された証明書を要求するとき、CAに証明書を送信しません。代わりに、CSR (Certificate Signing Request) を発行します。CSRを作成するには、/usr/share/ssl/misc/CA.sh -newreqスクリプトを呼び出します。

まず、スクリプトは、CSRの暗号化に使用されているパスワードを問い合わせてきます。その後、識別名を入力するよう求められます。このとき、国名または組織名など、2、3の質問に答える必要があります。ここで入力した内容が証明書に含まれ、確認されるため、有効なデータを入力します。すべての質問に答える必要はありません。該当しない、または空白のままにする場合は、「.」を使用します。一般名は、CA自体の名前です。My company CAなど、意味のある名前を選択します。最後に、チャレンジパスワードおよび代替の企業名を入力する必要があります。

スクリプトを呼び出したディレクトリでCSRを検索します。ファイルには、newreq.pemという名前が付きます。

26.6.2 SSLサポートのあるApacheの設定

Webサーバ側のSSLとTLS要求用のデフォルトのポートは443です。ポート80をリスンする通常のApacheと、ポート443をリスンするSSL/TL対応のApacheとの間に競合は生じません。通常、ポート80とポート443への要求はそれぞれ別の仮想ホストが処理し、別の仮想サーバに送られます。

[Important]ファイアウォール設定

ポート443でSSL対応のApache用のファイアウォールを開くことを忘れないでください。ファイアウォールは、4.1.4.1項 「YaSTによる設定」で説明されているように、YaSTを使用して設定できます。

SSLを使用するには、グローバルサーバ設定でSSLが有効化されている必要があります。/etc/sysconfig/apache2をエディタで開き、APACHE_MODULESを検索します。「ssl」がモジュールのリストに存在しない場合は、追加します(デフォルトではmod_sslが有効化されている)。次に、APACHE_SERVER_FLAGSを検索し、「SSL」を追加します。サーバ証明書をパスワードで暗号化している場合は、APACHE_TIMEOUTの値を増やし、Apacheの起動時にパスフレーズを入力するのに十分な時間が与えられるようにします。これらの変更を適用するため、サーバを再起動します。再ロードでは不十分です。

仮想ホスト設定ディレクトリには、SSL固有ディレクティブが詳細に記述されている/etc/apache2/vhosts.d/vhost-ssl.templateテンプレートが含まれています。一般的な仮想ホスト設定については、26.2.1.2項 「仮想ホスト設定」を参照してください。

開始するには、以下のディレクティブの各値を調整するだけで十分です。

  • DocumentRoot

  • ServerName

  • ServerAdmin

  • ErrorLog

  • TransferLog

[Important]名前ベースの仮想ホストとSSL

IPアドレスが1つだけの1台のサーバで、複数のSSL対応の仮想ホストを実行することはできません。そのような構成のサーバに接続するユーザは、URLを訪問するたびに、証明書がサーバ名と一致しないという警告メッセージを受け取ることになります。有効なSSL証明書に基づいて通信を行うには、SSL対応のドメインごとに、個別のIPアドレスまたはポートが必要です。