カテゴリー

アクセスカウンター


since 1996/06/14

Count per Day

  • 6今日の訪問者数:
  • 52昨日の訪問者数:
  • 1054月別訪問者数:
  • 0現在オンライン中の人数:

apache2.0系

Apacheの概要


 Apacheとはwwwサーバソフトウエアで、主にWebサイトを閲覧する為の機能が実装されています。同じようなwwwサーバで有名なものにMicrosoftのIIS(Internet Infomation Server)がありますが(有名な理由は機能よりも、、、以下略)、それらの前身はスイスの欧州粒子物理学研究所(CERN)や、アメリカのNCSAのWebサーバが有名です。5年くらい前にCGIをいじってた人なら、この辺のことを知ってるかと思いますが、今となってはもはや昔のこととなってしまいました。
 ApacheはアメリカのNCSAベースのWebサーバにパッチをあてたことから始まり、一説によると名前の由来も「a pach」をもじってるそうです。
 歴史はともかくとして、今や世界No1のシェアであり、ほとんどのOSを網羅している上にタダで利用出来るところがなんとも喜ばしいソフトウエアです。
NetCraftによるシェア情報

前置き

 ここでの解説は特に明記されていない限り、apache2.0.43(httpd-2.0.43.tar.gz)を使用しています。バージョンの違いによる差異はほとんど無いアプリケーションですが、頻繁にバージョンアップ(主にセキュリティ関連)されていますので、なるべく最新のものを使用してください。

インストール

 ここでは基本的なインストール方法を解説します。apacheはさまざまなモジュールを使えます。各モジュールの説明は後半の章で解説しますが、コンパイルの時点で記述しなければならない設定もあります。コンパイルの時点で書く内容は可能な限りここの章で解説しますが、他の機能を入れたい場合に再コンパイルが必要になる場合があることに注意してください。

ダウンロード&インストール


 デフォルトインストール方法です。
 まずはapacheをダウンロードします。apacheはApache Software Foundation(ASF:http://www.apache.org/)からダウンロードできます。現在はapache1.3.xx系とapache2.0.xx系をダウンロードできます。ここでは、apache2.0を落とします。
例)$ wget http://www.apache.org/dist/httpd/httpd-2.0.43.tar.gz
 ダウンロードが終わったら展開します。

$ tar zxvf httpd-2.0.43.tar.gz
$ cd httpd-2.0.43.tar.gz

 次に環境設定→コンパイル→インストールをします。大分大きいので時間がかかります。なお、インストール先は「/usr/local/apache2」なので、既にapache1.3系を運用していても上書きはされません(ポート番号が重複しなければ同時起動も可能です)。
※実際は「./configure」でモジュール等の追加が必要になる場合があります。詳細は次の項で説明します。

$ ./configure
$ make
$ su
# make install

 これでインストールは完了です。

モジュールとDSO

 apacheはさまざまモジュールを追加することにより機能拡張が可能です。モジュールの追加には2つの方法があります。
 ひとつはapacheのデーモンに組み込む方法。処理は早いが、新たに機能を組み込む際にapacheをコンパイルしなければならないといった問題や、メモリを消費するという欠点もあります。
 もうひとつはDSO(Dynamic Shared Object)という方法で、デーモンとは別に用意しておき、機能を利用するときに動的に組み込む方法です。機能を組み込むたびにapacheをコンパイルしなくてもいいのですが、機能を利用する際の動作が遅くなります。
 頻繁に使用し、且つメモリ消費が少ない機能はデーモンに組み込んでも問題ありませんが、それ以外はDSOを用いたほうがいいでしょう。
 なお、apache2.0とapache1.3のモジュールに原則として互換性は無いそうです。

さまざまなコンパイルオプション

 インストールの段階で、モジュールやインストール先を指定する場合、基本的には「./configure」に対してオプションを指定します。
 以下はその一例です。

–prefix
apacheのインストール先。指定しないと「/usr/local/apache2」に入ります。
–with-mpm
マルチプロセスモジュールの指定。環境/OSに応じた設定をするとパフォーマンスがあがります。Windows系用の「–with-mpm=winnt」等もあります。UNIXの場合、「–with-mpm=worker」が安全です。バーチャルホストを使う場合は「–with-mpm=perchild」とかもいいらしいです。
–enable-shared
DSOを有効にします(これって省略可能な気がするけど未確認)。
–enable-deflate(mod_deflate)
前身は「mod_gzip」です。2ちゃんねるの閉鎖騒ぎでやや有名になりましたが、サーバ/クライアント間の通信を圧縮して、転送速度を節約します。圧縮する分CPU負荷もかかりますが、CPUパワーの低いOpenBlockSでテストした時(当時はapache1.3+mod_gzipでしたが)は圧縮の負荷よりも、転送の負荷が軽減が大きかったので、CPUパワーが低くても有効でした。この機能はクライアントも圧縮転送に対応してないとダメですが、サーバがクライアントの情報を認識して自動的に処理してくれるので、ほとんど気にする必要はありません。
–enable-ssl(mod_ssl)
通信の暗号、署名、認証の機能を有効にする。いわゆるhttps。詳細は別の章で解説しますが、OpenSSLとかが必要。
–enable-dav(mod_dav、mod_dav_fs)
WebDAVの機能を有効にします。WebDAVとは私もあまり詳しくないですけど、HTTPを利用してファイル交換が出来るような機能です。ファイル名に日本語を扱うときは注意が必要になります。

 なお、上記のように指定しなくても導入される機能もあります。HTTP通信機能、CGI、SSI、ディレクトリIndex表示、ログ管理等は何も指定しなくても導入されます。
 –enable-xxx(mod_云々系)は、apacheに組み込む、組み込まない、DSOとして組み込むの3タイプの指定が可能です。

--enable-deflate・・・Deflateを組み込む。
--enable-dav=shared・・・WebDAVをDSOとして組み込む。
--disable-include・・・SSI機能を組み込まない。

 以下の記述例は、マルチプロセスモジュールを「worker」でDeflateをDSO、WebDAVをデーモンへ組み込み、SSI機能を組み込まない、またWebDAVを日本語対応する為のmod_enableを後で組み込む為にDSOを有効にすると言った設定です。

$ ./configure --with-mpm=worker --enable-shared --enable-deflate=shared --enable-dav --disable-include

 この後「make」「su」「make install」でインストール完了です。

起動

 基本的にはちゃんと設定してから起動しなければなりませんが、ここでは起動方法を先に説明します。
 起動には「apachectl」を使用します。「httpd」も使用できますが、通常は「apachectl」にしましょう。「apachectl」「httpd」共に「/usr/local/apache2/bin」にあります。

・起動

$ ./apachectl -k start

・終了

$ ./apachectl -k stop

・再起動

$ ./apachectl -k restart
$ ./apachectl -k graceful

「graceful」は起動中(使用中)のプロセスを強制終了しないので安全です(使い終わったら古いプロセスは落ちる)。

設定(httpd.conf)

 apacheの設定はhttpd.confで行います。記述内容はapache1.3の時とさほど違いはありませんが、新たに設定する場合は記述しなおす必要があります。
 httpd.confの所在は「/usr/local/apache2/conf/httpd.conf」です。
※パッケージの場合は「/etc/httpd/…」あたりにある場合もあります。

セクション1:Global Environment

 apacheの基本的な設定です。ほとんどはそのままで大丈夫ですが、パフォーマンスに関わる設定が多いので、負荷の高いサイトでは注意が必要になります。

ServerRoot "/usr/local/apache2"
apache2のシステムがインストールされている個所です。通常は変更する必要はありません。
LockFile logs/accept.lock/ScoreBoardFile logs/apache_runtime_status
 ロックファイルと、スコアボードファイル(apacheの動作状態を記録するファイル)の指定です。「#」の後はコメントアウトなので、書いてないのと同じこと。通常はこのままでOKです。
PidFile logs/httpd.pid
 プロセスIDを記録するファイルの指定です。「/var/lock/httpd.pid」とかもいいかも。起動中に書き直すと「apachectl」で終了できなくなります。

 

Timeout 300/KeepAlive On/MaxKeepAliveRequests 100/KeepAliveTimeout 15
 クライアントとのタイムアウトの指定。キープアライブの指定(コネクション毎の複数の要求を処理する)。キープアライブの上限、タイムアウトの指定。
StartServers 5/MinSpareServers 5/MaxSpareServers 10/MaxClients 150/MaxRequestsPerChild 0
 Apache起動時サーバプロセス数、保持されているサーバプロセス数の最小数、保持されているサーバプロセス数の最大数、起動できるプロセスの最大数。ゼロは無制限です。
Listen 80
 使用するTCPのポート番号です。通常は変更する必要がありません。変更した場合は、アクセスする場合も「http://localhost:8080/」というふうに、明示的にポート番号を指定しなければなりません。
LoadModule
 DSOで読み込むモジュールの指定。「./configure」で指定したものはちゃんと設定されます。記述方法は「LoadModule deflate_module modules/mod_deflate.so」という感じ。

セクション 'Main' server configuration

 通常にWebサーバへアクセスされた場合の挙動に関する設定です。変更の必要が一番多い個所かもしれない。

User nobody/Group #-1
使用するユーザとグループ権限です。apacheにセキュリティの問題が見つかったときや、甘いCGIコードを記述した場合、ここに記述した権限が奪われることがあるので、rootやログイン可能なアカウントを使用しないようにしましょう。
ServerAdmin you@your.address
 管理者のメアド。エラーが表示された場合等に表示される場合がある。
ServerName new.host.name
 サーバの名前を指定します。始めはコメントアウトされてますが、公開サーバを立てるときは必須です。
UseCanonicalName Off
 自己参照する場合に、httpd.confの値を参照する場合はOnにします。Offだとクライアントの情報を利用するらしい。
DocumentRoot "/usr/local/apache2/htdocs"
 ドキュメントルートディレクトリの指定。ここにindex.htmlファイルとかがある場合、「http://localhost/index.html」で、ドキュメントルートのファイルが参照される。
<Directory />〜</Directory>
 ディレクトリに対する権限の付与。別の項で解説します。
UserDir public_html
 各ユーザのユーザルートディレクトリ(~user等)にアクセスされた場合のアクセス先ディレクトリの指定。上記の指定で、userユーザのホームディレクトリが「/home/user」だった場合、「http://localhost/~user/index.html」と指定されると「/home/user/public_html/index.html」が参照される。

 ちなみに「/home/user/public_html/」をドキュメントルート(DocumentRoot)にする場合は、UserDirとは無関係で「DocumentRoot "/home/user/"」ではなく「DocumentRoot "/home/user/public_html/"」とする。
:DirectoryIndex index.html index.html.var:
以下、作成中、、、。

具体的な設定例

 ここでは目的に応じた主な設定例を示します。

概要

 apacheはモジュールも含めて「httpd.conf」で設定します(別のファイルに書いてhttpd.confに取り込むことも出来る)。ここではhttpd.confのさまざまな設定方法を解説しますが、まずその際の注意事項を説明します。

記述個所
 httpd.confは非常に長いので設定の記述個所に迷うことがありますが、基本的にはどこに書いても大丈夫です。悩むようなら似た設定を検索して、そこに列挙するといいでしょう。例えばモジュールをDSOとして組み込む場合はLoadModuleを記述しますが、LoadModuleという文字を検索してそこに記述といいと思います。

 ただし、<Directory 云々>〜</Directory>や、<IfModule 云々>〜</IfModule>のように複数行にわたる設定の場合は、その中に書くのと外に書くのとで大きく意味が違うので注意が必要です。

設定を変更したら「apachectl -t」でシンタックステスト。
 設定変更後にいきなりapacheを再起動した場合、設定が間違っているとエラーで起動しません。必ず事前にテストしましょう。「apachectl」はapacheの「bin」ディレクトリに入ってます。

 また、起動後はちゃんと動作しているか、ログを確認するのも重要です。

mod_deflate(http圧縮)

 ここではDeflate(Apache1.3系ではmod_gzipという名前でした)の設定方法を解説します。Deflateはapacheとブラウザ間の通信を暗号化し、通信トラフィックを軽減します。圧縮の為のCPU負荷が増えますが、通信の為の負荷が軽減するので、結局はCPU負荷も軽減する場合があります(OpenBlockSとかは有効にしたら軽くなった)。当然ながらブラウザ側でも対応していなければならないですが、その辺は自動認識してくれるみたいです。
-mod_deflateをインストールする。
 既にコンパイルの項で解説していますが、apacheをソースからインストールする場合は「./configure」の段階で指定します。

a.DSO無効
$ ./configure --enable-deflate
b.DSO有効
$ ./configure --enable-deflate=shared

-httpd.confの編集・・・LoadModuleの追加
 ./configureで設定した場合はhttpd.confにも追加されているかと思いますが、DSOの場合はLoadModuleを設定しないとダメです。DSOじゃ無い場合は「apachectl -L」で「mod-deflate.c」があるか確認しましょう。

LoadModule deflate_module modules/mod_deflate.so

-httpd.confの編集・・・Deflateを有効にする
 まず、どこを読み込んだときに圧縮を有効にするか、、、「<Directory 云々>」に設定します。

SetEnv gzip_only_text/html 1
SetOutputFilter DEFLATE

 次は圧縮率等の設定。

DeflateFilterNote deflate_compression_ratio
DeflateBufferSize 8096
DeflateMemLevel 9
DeflateWindowSize 15
--DeflateFilterNote:ログに圧縮率を記録する。
--DeflateBufferSize:圧縮を行う単位。8096が規定値。
--DeflateMemLevel:使用メモリー量(1〜9)。高いほうがメモリーを消費するが高圧縮。
--DeflateWindowSize:圧縮ウインドウサイズ(1〜15)。意味はわからないが高いほうがメモリーを消費するが高圧縮。

 ログに圧縮率を出してもあまり利用意義が無いので、動作確認が終わったら設定を切ってもいいと思います。有効にするならちゃんとローテートしましょう。
 次にログの出力設定。通常のapacheのログ同様、LogFormatとCustomLogで指定が出来ます。

LogFormat "%h %l %u %t \"%r\" %>s%b %{deflate_compression_ratio}npct." deflate
CustomLog /var/log/httpd/deflate_log deflate

 この設定で、以下のように出力されます。

xxx.xxx.xxx.xxx - - 27/Jan/2003:12:47:48 +0900 "GET /hogehoge.html HTTP/1.1" 2008585 23pct.

 「23pct.」と言うのが圧縮率です。「-pct.」という出力もありますが恐らく圧縮されてない場合でしょう。apache1.3の時の「mod_gzip」の時に「何バイト以下のファイルは圧縮しない」とかの設定が出来たので、そういう関係だと思います。
※っていうか、mod_deflateでその設定がわからん。

SSL(https)の設定

 ここではApacheにSSL(Secure Socket Layer)を導入する方法を解説します。
 SSLとは、通常のWebサイトへのアクセスの信頼性を向上させる仕組みで、通信の暗号化、認証、署名による証明などの機能を付加します。
※認証に関しては今回解説してません。
 通信が安全な物であるかは第3者機関による証明書が必要です。これは(無料なのもあるみたいですけど)基本的に有料(1サーバあたり数万円/年)なので、とりあえず自前で用意した物を使います(お金ないし、、、)。ECや、会員サイト等の様に信頼性を重視するのであれば、この辺はちゃんと認証機関から入手するなり、セキュリティポリシーを立てるなどしてしっかりとした管理をしましょう。
 ここではあくまで勉強/個人サイトレベルでの解説しかしません。クライアントがサーバが信頼できるものであるか確認できるように、実際の運用では第三者署名も必須になってくるわけです。
 とりあえず、通信経路のデータを暗号化するだけでも盗聴を防ぐことが出来ます。特に一般的に欲利用されている基本認証(ダイアログが出てきてIDとパスワードを入力するやつ)は暗号化されずに通信が行われるので、SSLを組み合わせるのは非常に有効です。
 なお、私はこの暗号/署名の分野はとんと苦手なので、詳しく知りたい方はそれなりの文献や詳しい人に聞いてください(^^;;;。

インストール(その1:OpenSSLを入れる)

※ここではソースからコンパイルする方法を使用していますが、最近はrpmでOpenSSLが入っていることも多いので、RedHat9とFedoraCore5上でrpmでOpenSSLがインストール済みの環境でもテストして見ました。以後の項では、rpmでOpenSSLがインストールされている場合の設定方法も補足として掲載しておきますので、そういう環境の方はOpenSSLのコンパイルは読み飛ばしてかまいません。
 まず、OpenSSLをインストールします。これ自身、頻繁にバージョンアップされてるので、最新のものを入れましょう。OpenSSL Project(http://www.openssl.org/)から入手可能です。
 インストール方法はさほど難しくありません。まずはダウンロード。
※ここを書いてる時点でもバージョンは0.9.7ですが、他のバージョンでもさほど変わりません。

$ wget http://www.openssl.org/source/openssl-0.9.7.tar.gz

 次に解凍。

$ tar zxvf openssl-0.9.7.tar.gz
$ cd openssl-0.9.7

 そしてインストール。
ここで注意ですが、OpenSSL0.9.6までは「/usr/local/openssl」にインストールされましたが、0.9.7では「/usr/local/ssl」に入るようです。

$ ./config

(「./configure」では無く「./config」です)

$ make
$ su
# make install

 これで終わり。
インストール先を変更したいなら、./configにオプションをつければ大丈夫そうですが確認してません。とりあえず、./confgの後にMakefileを編集しても大丈夫だと思います。

インストール(その2:apacheのインストール)

 apacheのインストール方法の詳細は既に解説しているので省きますが、apacheの「./configure」の時点でSSLを有効にするオプションを指定する必要があります。

$ ./configure --enable-ssl --with-ssl=/usr/local/ssl

 「–enable-ssl」はSSLを有効にする設定。「–with-ssl」はOpenSSLがインストールされた個所を指定してます。
※RedHat9でOpenSSLがrpmでインストールされている環境の場合、「–enable-ssl」のみの指定でインストールできました。
 これ以外は通常どおりapacheをインストールすればOKです。
※RedHat9あたり(もしかしたらApacheのバージョンにもよるのかもしれませんが、、、)でmakeするとkssl.hに関連するエラーがでます。これを解決するには「krb5-devel」のrpmをインストールするか、「export CPPFLAGS="-DOPENSSL_NO_KRB5"」でkerberosへの参照を無効にすれば大丈夫みたいです。

設定(その1:仕組み)

d77-NetLabo-apache2.0Sys-labo_apachessl
 ここで解説するSSLの実現方法は上の図のようになっています。
※ファイル名は説明に使うものなので、上図に従う必要はありません。
1,まず、サーバ秘密鍵を作成します。これは大事なものなので、外部に漏れないように大事に保管します。
2,次に証明書署名要求書(CSR)を作成します。これは認証機関に提出するものです。
3,CSRを認証機関で署名してもらいます。実際はベリサインなりの第三者認証機関を用いますが、ここではテスト用の「demoCA」を作成し、それを用いて書名します。
 証明書はこれで完成です。
4,このままapacheに設定しても起動しますが、起動時に秘密鍵のパスワードを要求してきます。そこで、それを必要としないapache起動用の鍵を作成します。
5,そしてapacheの設定ファイルに組み込みます。
6,クライアントでサイトにアクセスすると「不明な認証機関から発行された証明書」として警告が発せられます(自前なので当然ですが)。そこで、demoCAからルート証明書を発行し、それをインストールすることで警告が出ないようにします。

設定(その2:サーバ秘密鍵と署名要求書の作成)

 秘密鍵を作成します。作業は適当にディレクトリを作成してroot権限で行ってください(ただし、作成されたファイルの管理は厳重に行ってください)。
 まず、乱数を発生させる為の種(.rnd)を作成します。乱数の元データはなるべく適当なテキストファイルがいいです。ここではmessagesとaccess_logを利用した例です(実際はもっと多くのファイル、消去可能なファイルがいいです)。
 opensslは/usr/local/sslにあります。

# openssl rand -rand /var/log/messages:/var/log/httpd/access_log -out .rnd 1024

 次に秘密鍵の作成。

# openssl genrsa -des3 -rand .rnd -out server_key.pem 1024

・・略・・

Enter PEM pass phrase:←パスワードを入力
Verifying password - Enter PEM pass phrase:←もう一度パスワードを入力

 これで秘密鍵「server_key.pem」が出来ます。「openssl rsa -in server_key.pem -text」で内容を確認できます。
 次に署名要求書(CSR)の作成。

# openssl req -new -key server_key.pem -out server_csr.pem
Using configuration from /usr/local/openssl/openssl.cnf
Enter PEM pass phrase:←秘密鍵のパスワードを入力
・・略・・
-----
 Country Name (2 letter code) [AU]:←国コードJP(JAかも)
 State or Province Name (full name) [Some-State]:←「県」Kanagawaとか
 Locality Name (eg, city) []:←「市」Sagamiharaとか。
 Organization Name (eg, company) [Internet Widgits Pty Ltd]:←組織名。何でもいいけど見られて恥ずかしくないもの。
 Organizational Unit Name (eg, section) []:←部署。未入力でも可。
 Common Name (eg, YOUR name) []:←サーバのFQDN(重要)。
 Email Address []:←メールアドレス
 ・・略・・
 A challenge password []:←そのままenter
 An optional company name []:←そのままenter

これでCSR(server_csr.pem)が出来上がります。
ここで重要なポイントがあります。
たとえばInternetExplorereは、認証局、サーバ名、期限を確認し、証明書が信頼できるものかを判断します。そのうち、サーバ名はここの「Common Name」が用いられます。これはドメイン名(ここのサイトならd77.jp)ではダメです。サーバのFQDN(ホスト名、サブドメイン名、ドメイン名を連結したフルネーム。ここのサイトならlabo.d77.jp)を指定しないと警告が出ます。

設定(その3:テスト用認証機関の作成と署名)

署名要求書が出来たら、認証機関に提出して署名してもらいます。ここではテスト用に「demoCA」という認証機関を作成し、そこで署名してもらいます。

まず、demoCAの作り方。認証機関もパスワードが必要になります(署名の時に必要)。これは秘密鍵のと一致させる必要はありません。作成には「CA.sh」を用います。「/usr/local/ssl/misc/」にあると思いますが、OpenSSLのバージョンで微妙に違うようなので、探してみてください。

  • RedHat9は「/usr/share/ssl/misc/」に「CA」あります(.shが付いてませんが中身はシェルスクリプトです)。
  • FedoraCore5では「/etc/pki/tls/misc/CA」にありました。ちなみに「rpm -ql openssl | grep CA」とかのコマンドで調べられます。
    なお、入力内容は結構適当でも問題無いですが、見られて恥ずかしくないものの方がいいでしょう。
# CA.sh -newca
※RedHat9は「CA -newca」、FedoraCoreでは「/etc/pki/tls/misc/CA -newca」です。
CA certificate filename (or enter to create)←ここではEnter
・・略・・
Enter PEM pass phrase:←認証機関のパスワード
Verifying password - Enter PEM pass phrase:←もう一回認証機関のパスワード
・・略・・
-----
Country Name (2 letter code) [AU]:←国コードJP(JAかも)
State or Province Name (full name) [Some-State]:←「県」Kanagawaとか
Locality Name (eg, city) []:「市」Sagamiharaとか。
Organization Name (eg, company) [Internet Widgits Pty Ltd]:←組織名。
Organizational Unit Name (eg, section) []:←部署名
Common Name (eg, YOUR name) []:←名前(サーバ名)
Email Address []:←メールアドレス

これで「demoCA(ディレクトリと関連ファイル)」が出来上がります。次に署名します。具体的には「server_key.pem」に署名して「server_id.pem」を作ります。
*FedoraCore5に、apache2.2をソースから入れたところ、「/usr/local/apache2/CA/private」というディレクトリができており、そこがdemoCAの代わりになるようです。その場合、以下の「openssl.cnf」に関わる変更・指定は全てしなくてもよいようです。

まず、openssl.cnfをカレントディレクトリにコピーします。「/usr/local/ssl」にあります。openssl.cnfの内容を確認し、「dir = ./demoCA」を確認します(カレントディレクトリ内にdemoCAが無い場合は、パスを設定しなおす)。
※これもRedHat9は「/usr/share/ssl/」です。
CSR(server_key.pem)もカレントディレクトリに用意します。

署名の前に働き具合を確認。
 # cat demoCA/index.txt
 (署名してなければ何も表示されない)
 # cat demoCA/serial
 01(←初期値)

# openssl ca -config ./openssl.cnf -policy policy_anything -in server_csr.pem -out server_id.pem
※FedoraCore5では「-config ./openssl.cnf」を指定しない。
Using configuration from ./openssl.cnf
Enter PEM pass phrase:←認証機関のパスワード
・・略・・
Certificate is to be certified until [今の時間] (365 days)←証明書の有効期限。
Sign the certificate? [y/n]:←署名していいなら「y」
1 out of 1 certificate requests certified, commit? [y/n]←署名していいなら「y」(念のため再確認)

これで署名済み証明書(server_id.pem)が出来上がります。

働き具合を確認すると内容が変わってます。
 # cat demoCA/index.txt
 V云々
 # cat demoCA/serial
 02
!設定(その4:apache起動用鍵の作成)
このまま設定すると、apacheを起動する時にパスワードを要求してくるので、それが無い様に専用の鍵を作ります。

# openssl rsa -in server_key.pem -out server_key_run.pem

設定(その5:apacheの設定)

設定は基本的に「httpd.conf」に行いますが、SSLを有効にした時点で

<IfModule mod_ssl.c>
Include conf/ssl.conf
</IfModule>

とあるとおり、基本的な内容は「ssl.conf」が書かれています(IncludeはServerRootからの位置なのでconf/が付きます)。
ちなみにssl.confは「<IfDefine SSL>〜<IfDefine>」でくくられてます。何故かこのままだと動かなかったので、私はIfDefineを外してます。設定はほぼそのまま使えます、、、というか私も内容をあまり把握してないので、重要なポイントだけ解説します。

-----ssl.conf
Listen 443(←httpsのポート番号)
 
## SSL Global Context
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl .crl
SSLPassPhraseDialog builtin
SSLSessionCache dbm:logs/ssl_scache
SSLSessionCacheTimeout 300
SSLMutex file:logs/ssl_mutex
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
 
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
 
(↓CGIで環境変数を取る時に値を付加するらしい?)
<Files ~ "\.(cgi|shtml|phtml|php3?)$">
SSLOptions +StdEnvVars
</Files>
<Directory "/home/html/public_html/*/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
 
# SSL Protocol Adjustments:
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0

(↓SSLログの設定。ちゃんとローテートしないとダメです)
# Per-Server Logging:
CustomLog /var/log/httpd/ssl_request_log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

ssl.confの設定は以上。次にSSLを有効にしたサイトにアクセスした際の設定をします。基本的にはVirtualHostにして特定のURLだけ有効にします。そのまま「ssl.conf」に書いてもいいですけど、私はhttpd.confに書いてます。この辺は好みにお任せします。

以下は設定例です。VirtualHostは環境によってかなり異なるので注意してください。

NameVirtualHost [サーバのIP]
<VirtualHost [サーバのIP]:443>
ServerName [serverのFQDN。labo.d77.jpとか]
DocumentRoot [httpsでアクセスした場合のルート]
 
SSLEngine on
(↓証明書の指定)
SSLCertificateFile /usr/local/apache2/conf/ssl/server_id.pem
(↓apache起動用鍵の指定)
SSLCertificateKeyFile /usr/local/apache2/conf/ssl/server_key_run.pem
(↓ログの指定)
ErrorLog /var/log/httpd/error_log
CustomLog /var/log/httpd/access_log combined
</VirtualHost>

apache1.3系の時はsslを有効にする場合、特別な起動オプションが必要でしたが、apache2系は普通に起動すれば有効になります。

設定(その6:ルート証明書の発行)

さて、以上でクライアントからアクセスすると警告が出るもののアクセスできるはずです。警告は署名したところが謎な認証機関であると言う物のはずです(それ以外の警告が出た場合はCSRの作成でサーバ名を間違えたかサーバかクライアントの時計が狂ってます)。
通常はブラウザの設定を見ると幾つかの認証機関が登録されています。当然自前で署名したところで自前のテスト用認証機関はブラウザに登録されていないので、警告が出て当然です。ここではブラウザに認証機関を登録するまでの作業を行います。

まず、以前作成した「demoCA」のディレクトリを確認します。「cacert.pem」というファイルがあるはずなので、それを変換します。

# openssl x509 -inform pem -in cacert.pem -outform der -out cacert.der

これで「cacert.der」が出来上がります。
次にCGIスクリプトを書きます。ファイル名は拡張子がcgiであれば何でもいいですが、ここでは「democert.cgi」とします。

#!/bin/sh
echo "Content-type: application/x-x509-ca-cert"
echo
cat /home/html/cacert.der

「cacert.der」は、上記のとおりフルパス指定すればどこに配置してもいいです。ただし、ブラウザから直接アクセスできる個所に配置するのは止めましょう。

あとはこのCGIにアクセスするとルート証明書をダウンロードできるので、ブラウザにインストールすれば完了です。
※当然、apacheにCGIの設定は必要になります。

ダイジェスト認証(2.2系)

Webサイトにアクセスした際に、限られた利用者のみに限定する認証の仕組みですが、一般的なBASIC認証では、パスワードが暗号化されずにネットワークに流れるため、今回はダイジェスト認証を使ってみます。
なお、ダイジェスト認証の実装はapache2.0と2.2だけでも違うそうな・・・。
そんな訳で、今回は2.2系です。

必要なモジュール

DSOを使わないで、コンパイルからやってみます。

./configure --enable-auth-digest --enable-authn-file --enable-authz-user --enable-authz-owner ・・・

書かなくてもデフォルトで有効になっているモジュールはありますが、まぁ絵面的に書いておきました。
以下、apacheのコンパイルと導入に関しては省略。

ユーザファイルの作成

ファイルの新規作成は以下の通り。パスワードを聞かれるので、user1のパスワードにしたい文字を入れれば/hoge/.userfileにuser1というユーザが作成されます。

 ./htdigest -c /hoge/.userfile realm user1

※新規作成では無く、追加の場合は、-cは不要。
realmは何でもいいです。ただ、httpd.confのAuthNameと一致していないとダメ。また、認証画面にも出てくるので、それっぽい文字がいいでしょう。スペースを入れたい場合はダブルクオーテーションでくくればOKです。
!設定

httpd.confにはだいたい以下のような感じに書きます。

<Directory /hoge>
    …略…
    AuthType Digest
    AuthName "realm"
    AuthDigestProvider file
    AuthUserFile /hoge/.userfile
    Require valid-user
</Directory>

※AuthUserFileはWebからアクセスできないディレクトリに置かないと危険です。

その他

IEだとバグがあるらしく、認証は通るようですが、その先のページでリンクをクリックした際にBat Requestになるようです。とりあえずhttpd.confに以下のように書けば回避できるらしい。
 BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>