ここでは、Apache2.0の新モジュールであるmod_ssl
を使ってSSLによる暗号化について解説していきます。なお、mod_ssl とApache-SSLは別物であることに注意してください。
|
|
■OpenSSLのダウンロード
■OpenSSLのインストール
OpenSSLはデフォルトでは、/usr/local/ssl にインストールされます。デフォルトのインストール先を変更する場合は、--openssldir
で指定します。ここでは、オプションを指定せずにインストールを行います。
$ cd /usr/local/src
$ tar xzvf openssl-0.9.7d.tar.gz
$ cd openssl-0.9.7d.tar.gz
$ ./config
$ make
$ make test
$ su
# make install |
|
■mod_ssl の組み込み
mod_ssl を組み込むにはApache のソースパッケージが置いてあるディレクトリに移動し、再コンパイルします。configure
オプションには、SSLが使えるように、--enable-ssl を付け加えます。その他、必要なモジュールがあれば各自追加してください。なお、mod_ssl
をモジュールとして組み込むだけならば、--enable-ssl だけで構いません。
$ ./configure --with-mpm=worker \
--enable-dav \
--enable-ssl \
--with-ssl=/usr/local/ssl
$ make
$ su
# make install |
|
インストールが終了したら、実際にmod_ssl が組み込まれたかどうか確認します。以下のように、mod_ssl.cが表示されれば正常に組み込まれたことが確認できます。
# /usr/local/apache2/bin/httpd
-l
Compiled in modules:
mod_ssl.c
… |
|
■CA用秘密鍵/証明書の作成
SSL証明書の作成については、詳しくは
OpenSSLのインストールとSSL証明書の作成
を参照してください。まず、前準備としてCA用秘密鍵を作成するにあたって、乱数データファイルを作成しておきます。/var/log/messages
はリアルタイムに変動するファイルなので乱数データの元として利用することができます。
# /usr/local/ssl/bin/openssl
dgst -md5 /var/log/messages > rand.dat
# more rand.dat
MD5(/var/log/messages)= 61781da3ada4542d72205d9ac9cf1bb4
|
|
次に、証明書を格納するための適当なディレクトリを作成しておきます。openssl コマンドを使って先ほどの乱数データファイル(rand.dat)からCA用秘密鍵を作成します。途中、パスフレーズの入力が求められますので予め考えておいてください。パスフレーズには空白も含める事ができます。
$ mkdir /usr/local/apache2/certs
$ cd cert
$ su
# /usr/local/ssl/bin/openssl genrsa -des3
-rand rand.dat 1024 -out ca.key
0 semi-random bytes loaded
Generating RSA private key, 1024 bit long
modulus
.......++++++
..............................++++++
e is 65537 (0x10001)
Enter pass phrase:
Verifying - Enter pass phrase: |
|
上記で作成した秘密鍵を、/usr/local/apache2/conf/ssl.key 以下に保存します。また、root
しか読み書きできないようにパーミッションを600 とします。
# mkdir /usr/local/apache2/conf/ssl.key
# cp ca.key /usr/local/apache2/conf/ssl.key/server.key
# chmod 600 /usr/local/apache2/conf/ssl.key/server.key |
|
次にCA用の証明書を作成します。有効期限は365日とします。
# /usr/local/ssl/bin/openssl req -new -x509 -key ca.key -out ca.crt -days 365
0 semi-random bytes loaded
Generating RSA private key, 1024 bit long
modulus
.......++++++
..............................++++++
e is 65537 (0x10001)
Enter pass phrase:
Verifying - Enter pass phrase:
[root@ns1 cert]# /usr/local/ssl/bin/openssl
req -new -x509 -key ca.key > ca.crt
Enter pass phrase for ca.key:
You are about to be asked to enter information
that will be incorporated
into your certificate request.
What you are about to enter is what is called
a Distinguished Name or a DN.
There are quite a few fields but you can
leave some blank
For some fields there will be a default
value,
If you enter '.', the field will be left
blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Setagaya
Organization Name (eg, company) [Internet
Widgits Pty Ltd]:none
Organizational Unit Name (eg, section) []:none
Common Name (eg, YOUR name) []:linux.kororo.jp
Email Address []:root@kororo.jp |
|
上記で作成した証明書を、/usr/local/apache2/conf/ssl.crt 以下に保存します。また、root
しか読み書きできないようにパーミッションを600 とします。
# mkdir /usr/local/apache2/conf/ssl.crt
# cp ca.key /usr/local/apache2/conf/ssl.crt/server.crt
# chmod 600 /usr/local/apache2/conf/ssl.crt/server.crt |
|
SSL用の設定ファイルである、ssl.conf を開いて秘密鍵と証明書の書格納場所が、上記で説明したPATH
と同じであることを確認しておいてください。
# vi /usr/local/apache2/conf/ssl.conf
SSLCertificateFile /usr/local/apache2/conf/ssl.crt/server.crt
SSLCertificateKeyFile /usr/local/apache2/conf/ssl.key/server.key
|
|
最後に、Virtual Host 用の設定を行っておきます。
<VirtualHost _default_:443>の箇所は、IPアドレス指定しないと、正常にhttps://~で始まるページが表示されなかった(空白で表示されてしまう)ので、
サーバーのIPアドレス:443
の書式で記述するようにしてください。
# vi /usr/local/apache2/conf/ssl.conf
<VirtualHost 172.16.50.2:443>
DocumentRoot "/home/kororo/public_html"
ServerName linux.kororo.jp:443
ServerAdmin root@kororo.jp
ErrorLog /usr/local/apache2/logs/error_log
TransferLog /usr/local/apache2/logs/access_log
|
|
■秘密鍵のパスフレーズを削除
秘密鍵のパスフレーズがあると、システム再起動後、パスフレーズを入力しないとApacheが起動してきてくれません。セキュリティ的には好ましくはありませんが、ここでは、パスフレーズを削除する方法について説明します
# cd /usr/local/apache2/conf/ssl.key
# cp server.key server.key.bak
# openssl rsa -in server.key.bak -out server.key |
|
■Apache の起動
以上の編集を終えたらApache を起動させますが、注意したいのは、通常のapachectl start
ではなく、
apachectl startssl となります。
# /usr/local/apache/bin/apachectl
startssl |
|
■Apache の自動起動設定
自動起動設定ファイルもSSLでApache が起動できるように書き直さなくてはなりません。ここでは、Fedora
Core1 についていた起動ファイルをコピーして編集していきます。おそらく、大抵のシステムでは以下のような設定で問題ないでしょう。もし、自分の環境と異なる箇所があれば適宜修正してください。テキストファイル
こちら。
#!/bin/bash
#
# Startup script for the Apache Web Server
#
# chkconfig: - 85 15
# description: Apache is a World Wide Web
server. It is used to serve \
# HTML files and CGI.
# processname: httpd
# pidfile: /usr/local/apache2/logs/httpd.pid
# config: /usr/local/apache2/conf/httpd.conf
# Source function library.
. /etc/rc.d/init.d/functions
if [ -f /etc/sysconfig/httpd ]; then
. /etc/sysconfig/httpd
fi
# This will prevent initlog from swallowing
up a pass-phrase prompt if
# mod_ssl needs a pass-phrase from the
user.
INITLOG_ARGS=""
# Set HTTPD=/usr/sbin/httpd.worker in
/etc/sysconfig/httpd to use a server
# with the thread-based "worker"
MPM; BE WARNED that some modules may not
# work correctly with a thread-based MPM;
notably PHP will refuse to start.
# Path to the apachectl script, server
binary, and short-form for messages.
apachectl=/usr/local/apache2/bin/apachectl
httpd=${HTTPD-/usr/local/apache2/bin/httpd}
prog=httpd
RETVAL=0
# check for 1.3 configuration
check13 () {
CONFFILE=/usr/local/apache2/conf/httpd.conf
GONE="(ServerType|BindAddress|Port|AddModule|ClearModuleList|"
GONE="${GONE}AgentLog|RefererLog|RefererIgnore|FancyIndexing|"
GONE="${GONE}AccessConfig|ResourceConfig)"
if grep -Eiq "^[[:space:]]*($GONE)"
$CONFFILE; then
echo
echo 1>&2 " Apache 1.3 configuration
directives found"
echo 1>&2 " please read /usr/share/doc/httpd-2.0.48/migration.html"
failure "Apache 1.3 config directives
test"
echo
exit 1
fi
}
# The semantics of these two functions
differ from the way apachectl does
# things -- attempting to start while
running is a failure, and shutdown
# when not running is also a failure.
So we just do it the way init scripts
# are expected to behave here.
start() {
echo -n $"Starting $prog: "
check13 || exit 1
daemon $httpd
-D SSL $OPTIONS
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch /usr/local/apache2/logs/httpd.lock
return $RETVAL
}
stop() {
echo -n $"Stopping $prog: "
killproc $httpd
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f
/usr/local/apache2/logs/httpd.lock /usr/local/apache2/logs/httpd.pid
}
reload() {
echo -n $"Reloading $prog: "
check13 || exit 1
killproc $httpd -HUP
RETVAL=$?
echo
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status $httpd
RETVAL=$?
;;
restart)
stop
start
;;
condrestart)
if [ -f /usr/local/apache2/logs/httpd.pid
] ; then
stop
start
fi
;;
reload)
reload
;;
graceful|help|configtest|fullstatus)
$apachectl $@
RETVAL=$?
;;
*)
echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|fullstatus|grac
eful|help|configtest}"
exit 1
esac
exit $RETVAL
|
|