Apache2.2.4でwarning

多分Apache2.2以降だけだと思うが、ソースからインストールして起動する際に、

[warn] (2)No such file or directory: Failed to enable the ‘httpready’ Accept Filter

と出ることがある。
だからと言って動作に問題は出ないのだが気になるので調べたところ、適正に設定を行えばソケットの最適化をやってくれるらしい。

具体的には、通常サーバに対してリクエストを送信するとまずApacheとのソケット通信を開始してデータを送ります。これをOS側でクライアントからのリクエストが完了するのを待って初めてApacheへ接続しApacheのコネクション数の節約を行うようです。

FreeBSDの場合、デフォルトでこのような機能を組み込んだいないため、カーネルにロードしてあげます。

対象モジュール:
/boot/kernel/accf_http.ko

カーネルにロード
# kldload accf_http.ko

起動時に読み込むようにloader.confに追加
# echo ‘accf_http_load=”YES”‘ >> /boot/loader.conf

多彩なバーチャルホスト

この前、SUEXEC対応でインストールしたので、各バーチャルホストで別々のユーザ設定。SSLのバーチャルホストをやってみたいと思います。

./configure –prefix=/usr/local/apache
–enable-module=so
–enable-ssl
–enable-suexec
–with-suexec-docroot=/home
–with-suexec-uidmin=1000
–with-suexec-gidmin=1000

実はwith-suexec-docrootでやっぱり後悔して/homeで再インストしました。

VirtualHostディレクティブの中で
SuexecUserGroup uid gid
を設定するとSUEXECが有効になります。このときに気をつけるのは、Apacheをインストールした後にAppacheのUserとGroupは変更しないこと。SuexecUserGroupで指定するuidとgid(idじゃなく名称でも良い)は–with-suexec-uidminと–with-suexec-gidminの値を超えていること。そして実際にCGI等を配置するディレクトリは–with-suexec-docrootで指定したディレクトリ内にあることです。

次に、IPベースとネームベースの両方を用いたバーチャルホスト設定をしてみました。
※但し現在はグローバルを1個だけしか振ってないのでポートで分けた。

NameVirtualHost *:80
NameVirtualHost *:8080
ServerName vhost1.exsample.com:80
ServerAlias vhost1.exsample.com:80
ServerName vhost2.exsample.com:80
ServerAlias vhost2.exsample.com:80
ServerName vhost3.exsample.com:8080
ServerAlias vhost3.exsample.com:8080
ServerName vhost4.exsample.com:8080
ServerAlias vhost4.exsample.com:8080

ざっとこんな感じSSL側もNameVirtualHostを入れることによってサブドメイン毎に表示を分けることができましたがサーバ認証はどうしても最初のディレクティブで設定したものが使用されてしまう。SSL側だけはIPベースのバーチャルホストにしないと問題がでそうだ。

バーチャルホストについても本当のIPベースとネームベースの複合もやりたいので、追加を行ってみます。

Apache自己認証SSLサーバの構築

【CAを立てない場合】
1. Apache用サーバ秘密鍵(パスワード付き)の作成
# openssl genrsa -des3 -out server.key -rand /var/log/maillog 1024

2. 証明書発行要求(CSR)を作成
# openssl req -new -key server.key -out server.csr

3. 自己署名
# openssl x509 -req -days 365 -signkey server.key -out server.crt -in server.csr

4. 自動起動できるように秘密鍵のパス入力を省略させる
# cp server.key server.key.bak
# openssl rsa -in server.key.bak -out server.key

5. Apacheのconfigで下記を設定する。
# サーバ証明書
SSLCertificateFile /usr/local/apache/conf/server.crt
# サーバ秘密鍵
SSLCertificateKeyFile /usr/local/apache/conf/server.key
【プライベートCAを立てて認証する場合】

1. 認証局の秘密鍵の作成
CA関連のファイルを保存するディレクトリを作成
# mkdir /etc/ssl/ca
# cd /etc/ssl/ca

2. 認証局の秘密鍵を作成
# openssl genrsa -rand /var/log/maillog -out ca.key 1024

3. 自己署名してCA証明書発行
# openssl req -new -x509 -days 365 -key ca.key -out ca.crt
これで出来上がったca.crtがCA証明書です。

4. CAの設定
今回一時的な使用のためコンフィグのコピーを作成
# cp /etc/ssl/openssl.cnf /etc/ssl/ca/
# cd /etc/ssl/ca/
# mkdir newcerts
# mkdir crl
FreeBSDの場合、素ではdemoCAが無かったので別途ソースを入手してindex.txtやserialファイルをコピーしました。

5. CAでサーバ証明書の発行
# cp /usr/local/apache/conf/server.csr /etc/ssl/ca/
# openssl ca -config /etc/ssl/ca/openssl.cnf -in server.csr -days 365 -keyfile ca.key -cert ca.crt -out server-ca.crt

6. 出来たサーバ証明書とCA証明書をコピー
# cp server-ca.crt /usr/local/apache/conf/
# cp ca.crt /usr/local/apache/conf/

7. Apacheで設定変更
# サーバ証明書
SSLCertificateFile /usr/local/apache/conf/server-ca.crt
これで下記のBタイプになります。

8. CA証明書の情報を表示するなら以下の設定を有効にしてもOK
#SSLCertificateChainFile /usr/local/apache/conf/ca.crt
ここで下記のCタイプになります。

9. クライアント認証を行うなら以下も有効に
#SSLCACertificatePath /usr/local/apache/conf
#SSLCACertificateFile /usr/local/apache/conf/ca.crt

これで
A. サーバ自己署名
B. プライベートCA署名
C. プライベートCA署名、CA証明書情報あり
の3通りの設定ができます。でもIE7で見たら
A. 証明書が信用できないエラー
B. 証明書はOK,CAが見つからないエラー
C. 証明書はOK,CAが信用できないエラー
どれも証明書エラーで大差なかったです。

今度はプラウザにインポートした時にどうなるかを検証します。
A. サーバ証明書兼CAなので正常になる
B. CA証明書がないのでインポートが無意味
C. CA証明書がないのでインポートが無意味

BとCで正常化するには別途CA証明書をエクスポートしてインストールする必要があるようです。
以上より単純にセキュアサイト開発するだけなら自己署名のみの方がいいですね。