.
WEB/DB 関連 => Webクライアント認証 > 5.Apache2 Webサーバ設定
Linux 活用ガイド:目次

サーバ構築ガイド

レンタル ガイド

ショップ 構築ガイド

情報漏洩対策

Apache2 WebサーバのSSL化 と クライアント認証の有効化

これまでの作業で、WebサーバーのSSL化に必要なサーバー証明書と、クライアント認証に必要な証明書が用意できました。また、これらの証明書を作成するために、最初に独自CAを作成しました。

ここまでの一連の作業で作成したファイルの確認

これらの証明書を使ってサーバー側の設定と、クライアント側の証明書の使い方について説明しますが、ちょっとその前に整理します。

・CA [/etc/pki/CA]

  • ./private/cakey.pem  … CA秘密鍵
  • ./etc/pki/CA/cacert.pem … CA自己証明書★
  • ./etc/pki/CA/careq.pem … CSR(署名要求書)
  • ./etc/pki/CA/ca.der … CA公開鍵(ブラウザで警告を無くす)☆

・サーバー証明書 [/etc/pki/httpd/]

  • ./newkey.pem サーバー証明書の秘密鍵★
  • ./newreq.pem 署名リクエストファイル(CSR)
  • ./newcert.pem CAに署名してもらったサーバー証明書★

・クライアント証明書 [/etc/pki/httpd/client/]

  • ./cliant_key.pem クライアント証明書の秘密鍵
  • ./cliant_newcert.pem CAに署名してもらったサーバー証明書
  • ./cliant_newreq.pem 署名リクエストファイル(CSR)
  • ./cliant_cert.p12 クライアントにインストールしてもらう証明書☆

Apache 2系の SSLで必要となるファイルには ★ を、クライアント側に提出するファイルを ☆ で印をつけています。

Apache Webサーバーを例に説明していますが、それ以外のクライアント認証に対応したサーバープログラムの場合は、証明書のタイプが同じであれば、ここで作成した証明書を流用できるはずですが、そうでない場合は、適切なサーバー証明書を作成する必要があります。

立ち上げたCAはそのまま使えますが、構築できるCAは一つとは限りません。これらの証明書を使ってクライアントに省可能なSSL通信に対応した Apache Webサーバーの構築に必要な設定項目について説明します。

Apache2 SSLを有効にする(conf.d/ssl.conf の修正)

本項では CentOS6.x の場合です。他のディストリビューションはパスが異なる可能性がありますので適宜読み替えて下さい。Apache2系のSSLに関する設定は以下のファイルに纏められています。

# vi /etc/httpd/conf.d/ssl.conf

<VirtualHost _default_:443> タグ内を以下の様に修正します。

/etc/httpd/conf.d/ssl.conf

<VirtualHost _default_:443>
DocumentRoot "/home/www/pub/html" ①
ServerName hogehoge.net:443 ②

SSLCertificateFile /etc/pki/httpd/newcert.pem ③
SSLCertificateKeyFile /etc/pki/httpd/newkey.pem ④
SSLCertificateChainFile /etc/pki/CA/cacert.pem ⑤
SSLCACertificateFile /etc/pki/CA/cacert.pem ⑥
</VirtualHost>

conf.d/ssl.conf を修正したら、再起動します。

# service httpd restart

① ~ ⑥ 説明

<VirtualHost _default_:443> の下に以下の2行を追記します。名前ベースのバーチャルホストを運用しているので、SSL通信が出来るのはメインのサイトのみです。ドキュメントルートとサーバーネームを追記しています。

DocumentRoot "/home/www/pub/html"
ServerName hogehoge.net:443

補足:これは名前ベースのバーチャルホストを運用している例なので、実際にSSL化が利用できるのはオリジナルのホストだけ、ということになります。バーチャルホストについての説明は割愛します。必要があれば「名前ベース」「IPベース」「バーチャルホスト」で調べてみて下さい。
http://httpd.apache.org/docs/2.2/vhosts/

ServerName はサーバー証明書を作成した際の commonName と同じであり、また、FQDN である必要があります。これらが一致した証明書を作成することが重要なポイントになります。

また、メールサーバーなど同一ホストで複数のサービスを運用している場合は、これらのサーバー証明書、クライアント証明書は流用出来ます。

本稿では Apache Webサーバーを例に紹介しましたが、同一ホストでFTPやメールサービスを提供している場合、これらのSSL化にあたり、新たにサーバー証明書を用意する必要はありません。

逆にCAの署名手続きや失効管理などが煩雑になるので、流用が可能であれば流用します。ただ、クライアント認証に関しては、クライアントアプリケーションとの互換性の観点から、新たな証明書の発行の必要性に迫られるケースがあるかも知れません。


Server Certificate: ③

CAで署名発行したサーバー証明書のパスを指定します。証明書自体を暗号化するパスフレーズが使用されている場合は起動時にパスフレーズを求められますが、利便性を優先して本稿では無向にして作成しています。

SSLCertificateFile /etc/pki/httpd/newcert.pem


Server Private Key: ④

サーバー証明書の秘密鍵のパスを指定します。

SSLCertificateKeyFile /etc/pki/httpd/newkey.pem


Server Certificate Chain: ⑤

中間証明書のパスを指定します。本稿では必要ないので、自分で立ち上げたルート証明書のパスを指定しています。

SSLCertificateChainFile /etc/pki/CA/cacert.pem


Certificate Authority (CA): ⑥

クライアント認証のキモになります。PKCS12ファイルにもこのCAの公開鍵が梱包されている点に着目。

SSLCACertificateFile /etc/pki/CA/cacert.pem

ディレクティブ毎の挙動設定

先の ssl.conf の設定では、サーバーのSSL化と、クライアント認証を有効にするサーバー全体の設定を行いましたが、ここでは公開ディレクティブごとのSSL通信に対する挙動を設定します。

例えば、

  • 個人証明書は求めないが、SSL通信に限定させる
  • SSL接続をするかしないかはクライアント次第
  • SSL接続に限定するが個人証明書は求めない
  • SSL接続に限定し、個人証明書の提出を求める

といった具合にです。これらのSSL通信に対する挙動は、それぞれのApache公開ディレクティブの設定で行います。そのサービスの重要性に見合ったセキュリティポリシーを適用します。

ここでは、MySQL をブラウザ経由で管理出来る phpMyAdmin というツールに対して、クライアント認証の利用を強制させる設定例を紹介しますので、4ポツ目の厳格な設定を例に紹介します。

Apache2系では、conf.d ディレクトリにある任意の .conf ファイルが設定として有効になる用になっていますので、管理がやり易くなっています。

CentOS の場合は、/etc/httpd/conf.d になりますので、例えば、MySQL の ブラウザによるGUI操作を実現するphpMyAdminの場合、/etc/httpd/conf.d ディレクトリに作成した phpMyAdmin.conf に以下の様に記述します。

# vi /etc/httpd/conf.d/phpMyAdmin.conf
/etc/httpd/conf.d/phpMyAdmin.conf

Alias /phpMyAdmin/ "/var/www/phpMyAdmin/"

<Directory /var/www/phpMyAdmin/>
SSLRequireSSL ①
SSLVerifyDepth 1 ②
SSLOptions +OptRenegotiate ③
SSLVerifyClient require ④
# ErrorDocument 403 http://hogehoge.net/ssl_only.html ⑤
Options FollowSymLinks ExecCGI +Includes
AllowOverride AuthConfig
order deny,allow
deny from all
allow from 192.168.5.30
</Directory>

このうち、SSLに関係する部分は ①~⑤の部分です。以下、その内容です。認識に間違いがあるかも知れません。詳細は上記リンク先を参照して下さい。

① ~ ⑤説明

SSLRequireSSL ①

SSL接続でのみの接続を要求します。http:// での接続は出来なくなります。


SSLVerifyDepth 1 ②

クライアント認証の有効性を確認する際に辿る深さを指定します。自己認証局による自己署名なので1とします。


SSLOptions +OptRenegotiate ③

利用可能なランタイムオプションを+,- で指定します。+OptRenegotiate では SSLの再交渉を許可します。ディレクトリ単位でSSLの動作を設定するのでこのオプションを付加しています。


SSLVerifyClient require ④

Server Certificate で指定した認証局が発行した証明書を求めます。つまり、証明書を持たないクライアントはセッションを確立することすら出来なくなります。


ErrorDocument 403

⑤ SSL限定なのに http:// で接続してきたクライアントに対して、飛ばすページを指定します。必須ではありません。


この例では、サーバー管理者が phpMyAdmin を安全に操作するためにクライアント認証を有効にする例ですが、SSLRequireSSL だけを指定すれば、SSL以外の接続は出来なくなります。

クライアント認証は必要なく http:// での接続は避けて、SSLの接続に限定したい場合は、SSLRequireSSL を個別のディレクティブに記述すれば、通信経路をSSL接続に強制する事が出来ます。

何れにしても、限られた個人、組織内の用途に留めるべきで、不特定多数に対してSSL通信を提供する用途に使うべきでないことに変わりはありません。

サーバー側の準備はこれで終了です。引き続き、クライアント側の設定について説明します。

 

bottom_mark
ページ最上部
ページ最上部 前のページ