Apache 1.3.17 に mod_ssl を組み込む

SERVER

Apache 1.3.17 に、SSL 保護を実装するためのモジュール mod_ssl を組み込んでみました。


Apache と mod_ssl

UNIX 界で有名な Web サーバ Apache へ、SSL によるセキュリティ接続に対応させるためのモジュールを導入してみることにしました。

SSL とは、Netscape 社が開発した暗号化技術で、TCP レベルでパケットを暗号化することができます。Apache-SSL はこれを利用して Web サーバへ SSL 接続ができるようにするためのものです。

 

今回導入することにしたのは、http://www.modssl.org/ で提供されている mod_ssl というモジュールです。

 

mod_ssl の組み込み

Apache-SSL の導入に先立って、それに必要なソフトウェアを用意します。

ftp://ftp.openssl.org/source/ から、OpenSSL を入手します。FTP サイトから /usr/local/src/ へ openssl-0.9.6a.tar.gz をダウンロードしたら、次の手順でインストールを行います。

cd /usr/local/src

tar xvzf openssl-0.9.6a.tar.gz

 

cd openssl-0.9.6a

 

./configure

make

make install

 

続いて mod_ssl の導入です。

いま使っている Apache が Version 1.3.17 なので、mod_ssl-2.8.0-1.3.17.tar.gz を /usr/local/src/ にダウンロードしました。

 

そしてそれを展開して apache-1.3.17 へ適用します。

なお、Apache 1.3.17 のソースファイルが /usr/local/src/apache-1.3.17/ に、そして OpenSSL 0.9.6a のソースが /usr/local/src/openssl-0.9.6a/ にあるものとして話を進めます。

cd /usr/local/src/

tar xvzf mod_ssl-2.8.0-1.3.17.tar.gz

 

cd mod_ssl-2.8.0-1.3.17

./configure --with-apache=/usr/local/src/apache_1.3.17 --with-ssl=/usr/local/src/openssl-0.9.6a --prefix=/usr/local/apache --with-perl=/usr/bin/perl

そして Apache をコンパイルしなおします。

cd /usr/local/src/apache_1.3.17

 

./configure.status

 

make clean

make

 

 

証明書を発行する [make certificate]

Apache に SSL 接続するために使用する証明書を作成します。

次のような手順で /usr/local/apache_1.3.17/ ディレクトリへ移動して、証明書を作成します。

cd /usr/local/apache_1.3.17

make certificate

すると、SSL Certificate Generation Uitlity が起動しますので、いくつかの質問事項に対して返答していきます。

 

SignatureAlgorithm((R)SA or (D)SA) [R]:

署名のアルゴリズムを選択する場面です。RSA を選択します。

1. Country Name (2 letter code) [XY]:

国名を2文字で指定します。日本ならば JP でしょう。

2. State or Province Name (full name) [Snake Desert]:

県名を入力するようです。

3. Loality Name (eg, city) [Snake Town]:

市を入力するようです。

4. Organization Name (eg, company):

いわゆる組織名の入力です。

5. Organization Unit Name (eg, section) [Webserver Term]:

いわゆる組織の部署名です。

6. Common Name (eg, FQDN) [www.snakeoil.dom]:

Web サーバの URL です。

7. Email Address (eg, name@FQDN) [www@snakeoil.dom]:

問い合わせ先メールアドレスです。

8. Certificate Validity (days) [365]:

証明書の有効期間が何日かを入力します。

Certificate Version (1 or 3) [3]:

証明書のバージョンのようですけど、詳しいことがわからなかったのでディフォルトの 3 を選択してみました。

Encrypt the private key now? [Y/n]:

秘密かぎを作成するかたずねられます。いまここで秘密かぎを作成するならば y と答えます。今回もここで y と答えることにしました。

Enter PEM pass phrase:

パスフレーズの入力です。いわゆるパスワードを入力しましょう。

Verifying password - Enter PEM pass phrase:

パスフレーズのうち間違いがないように、もう一度おなじパスフレーズを入力します。

 

これで作業は完了です。次のようなメッセージが現れて、作成の完了が知らされます。

______________________________________________________________________

RESULT: Server Certification Files

o conf/ssl.key/server.key
The PEM-encoded RSA private key file which you configure
with the 'SSLCertificateKeyFile' directive (automatically done
when you install via APACI). KEEP THIS FILE PRIVATE!

o conf/ssl.crt/server.crt
The PEM-encoded X.509 certificate file which you configure
with the 'SSLCertificateFile' directive (automatically done
when you install via APACI).

o conf/ssl.csr/server.csr
The PEM-encoded X.509 certificate signing request file which
you can send to an official Certificate Authority (CA) in order
to request a real server certificate (signed by this CA instead
of our demonstration-only Snake Oil CA) which later can replace
the conf/ssl.crt/server.crt file.

WARNING: Do not use this for real-life/production systems

 

サイトを公開する

では、サイトを公開してみます。

今回はとりあえず組み込むことが目的なので、時間の都合上 SSL の設定はすべてディフォルトに任せてしまうことにします。また、話を簡単にするために、新規インストール状態を想定し、/usr/local/apache が存在していないものとします。

make install

とすると、先ほど作成した証明書といっしょに Apache が /usr/local/apache にインストールされます。

あとは、

/usr/local/apache/bin/apachectl startssl

と入力することで、SSL をサポートした Apache が起動しました。その際、現状の設定では証明書を作成したときのパスフレーズの入力する必要があります。

 

CA の証明書を発行する [CA] [OpenSSL]

OpenSSL をつかって、認証局の証明書を発行するまでをやってみます。

まず、証明書などを保存する場所の準備です。今回は /etc/secure/ というディレクトリを用意することにしました。そして次のような階層でディレクトリを作成します。

/
     + etc/
          + secure/
               + ca/
                    + conf/
                    + certs/
                    + newcerts/
                    + crl/
                    + private/
               + certs/
                    + apache/
                         + private/

これができたら、まずは認証局 (CA) の証明書を作成します。

それに先立って、認証局のデータベースを初期化する必要があるそうです。認証局のディレクトリは先ほど作成したディレクトリの /etc/secure/ca/ です。ここに、次のような処理で、index.txt と serial を作成します。

cd /etc/secure/ca

 

touch index.txt

echo 01 > serial

これで、空っぽの index.txt ファイルと 01 という内容の serial ファイルが作成されます。

続いて認証局の証明書を作成します。作業はすべて /etc/secure/ca/ でやっていることにします。

cd /etc/secure/ca

/usr/bin/openssl genrsa -out private/ca.key -rand $A:$B:$C:$D 1024

まずはこれで CA の秘密かぎを作成します。

上記の $A, $B, $C, $D の4つは、なにか適当な大き目のファイルを指定してあげます。これをもとになにかランダム性を出すようなので。既存のファイルであれば何でもいいようです。

続いて証明書です。上記の秘密かぎをつかって、次のように作成します。

/usr/bin/openssl req -new -x509 -key private/ca.key -out certs/ca.crt

すると次のような問い合わせがなされるので、適当に返答します。

 

Country Name (2 letter code):

国名です。アルファベット2文字で指定するので、日本ならば JP となります。

State or Province Name (full name):

日本だと都道府県名にあたるようです。KANAGAWA といったように指定します。

Locality Name (eg, city):

日本だと市区町村名でしょうか。YOKOHAMA といったように指定すればよさそうです。

Organization Name (eg, company):

組織名です。

Organizational Unit Name (eg, section):

部署名などを指定するようです。

Common Name (eg, YOUR name):

認証局の名前でしょうか。インターネット・ホスト名や、電子メールアドレスなどを指定すればいいようです。

Email Address []:

認証局への連絡先アドレスでしょう。

 

これらの必要個所を入力すると、/etc/secure/ca/certs/ca.crt という名前の CA の証明書が出来上がります。

また、認証局の設定状況をファイルにしたものも用意します。内容的に細かいことがわからないのですが、以下のようなものを /etc/secure/ca/conf/ca.conf に用意しました。

[ ca ]

default_ca =default_ca

x509_extensions =usr_cert

 

[ default_ca ]

dir =/etc/secure/ca

certs =$dir/certs

crl_dir =$dir/crl

#CA_DB =

new_certs_dir =$dir/newcerts

certificate =$certs/ca.crt

serial =$dir/serial

crl =$crl_dir/ca.crl

private_key =$dir/private/ca.key

database =$dir/index.txt

#RANDFILE =

default_days =30

#default_startdate =

#default_enddate =

default_crl_days =30

#default_crl_hours =

default_md =md5

#preserve =no

policy =policy_match

x509_extensions =x509v3_extensions

#crl_extensions =

#msie_hack =

 

[ policy_match ]

countryName =optional

stateOrProvinceName =optional

organizationName =optional

organizationalUnitName =optional

commonName =supplied

emailAddress =optional

 

[ usr_cert ]

basicConstraints=CA:FALSE

nsCertType =sslCA,emailCA,server,client,email,objsign

#nsCertType =objsign

#nsCertType =client,email

#nsCertType =client,email,objsign

#nsComment ="OpenSSL Generated Certificate"

subjectKeyIdentifier=hash

authorityKeyIdentifier=keyid,issuer:always

 

[ x509v3_extensions ]

subjectKeyIdentifier=hash

basicConstraints =CA:true

nsCertType =sslCA,emailCA,server,client,email,objsign

設定は大文字小文字などの区別がありますので、間違えないように気をつけましょう。間違えると、次の CRL ファイルの作成時や、署名依頼書から証明書を作成するときなどにエラーが発生します。

 

あと、CRL ファイルの作成も行います。なにやら目的はわかりませんけど、Revocation (廃止) とかいった意味があるようです。

/usr/bin/openssl ca -gencrl -config conf/ca.conf -out ca.crl

これで CRL ファイルが出来上がります。うまくいかない場合は /etc/secure/ca/conf/ca.conf の記述に間違いがないか調べてみるといいでしょう。

 

サイトの署名依頼書を発行する [SITE] [OpenSSL]

続いてサイトの署名依頼書(?)を発行してみることにします。

これは、認証局にサイトの証明書に署名してもらうためのもので、サイトの証明書は第三者機関であるはずの CA によって署名されることで信頼性を獲得できます。

 

発行先のディレクトリは /etc/secure/certs/apache/ 以下のディレクトリを使用することにします。ディレクトリの構造に関しては、上記を参照してください。

まずはサイト側の秘密かぎを作成します。作業はすべて /etc/secure/certs/apache/ でやっていることにします。

cd /etc/secure/certs/apache

/usr/bin/openssl genrsa -out private/site1.key -rand $A:$B:$C:$D 1024

まずはこれで CA の秘密かぎを作成します。

上記の $A, $B, $C, $D の4つは、なにか適当な大き目のファイルを指定してあげます。これをもとになにかランダム性を出すようなので。既存のファイルであれば何でもいいようです。

 

続いて署名依頼書の作成です。先ほどの秘密かぎを使って、次のような手順で作成します。

/usr/bin/openssl req -new -key private/site1.key -out site1.csr

すると次のような問い合わせがなされるので、適当に返答します。

 

Country Name (2 letter code):

国名です。アルファベット2文字で指定するので、日本ならば JP となります。

State or Province Name (full name):

日本だと都道府県名にあたるようです。KANAGAWA といったように指定します。

Locality Name (eg, city):

日本だと市区町村名でしょうか。YOKOHAMA といったように指定すればよさそうです。

Organization Name (eg, company):

組織名です。

Organizational Unit Name (eg, section):

部署名などを指定するようです。

Common Name (eg, YOUR name):

今回はサイトの証明書なので、そのサイトの URL を www.ez-net.jp のように指定します。

Email Address []:

連絡先の電子メールアドレスでしょう。

A challenge password []:

なにかのパスワードのようですけど、今回は何も入力しなくていいようです。

An optional company name []:

組織名のオプションでしょうか・・・。とくに入力する必要はなさそうでした。

 

これらの必要個所を入力すれば署名依頼書の作成が完了します。/etc/secure/certs/apache/site1.csr という名前のファイルがが出来上がりました。

 

サイトの証明書を発行する [CA] [OpenSSL]

サイト側から提示された署名依頼書を使って、サイトの証明書を発行します。

署名依頼書が /etc/secure/certs/ ディレクトリに保存されているものとした上で、/etc/secure/ca/ ディレクトリ内で作業しているものとします。

/usr/bin/openssl ca -batch -config conf/ca.conf -out ../certs/apache/site1.crt -infile ../certs/apache/site1.csr

これで、サイトの署名依頼書から、サイトの証明書が /etc/secure/certs/apache/site1.crt に出来上がりました。もしエラーがあるような場合、/etc/secure/ca/conf/ca.conf に間違いがある可能性があるので確認しましょう。

 

これで証明書の発行は完了です。

これらの証明書を有効にするには、/etc/secure/ca/certs/ca.crl と /etc/secure/ca/certs/ca.crt も必要のようなので、それらを含めた次の4つを Web サーバ側に用意します。

  • /etc/secure/ca/certs/ca.crl
  • /etc/secure/ca/certs/ca.crt
  • /etc/secure/certs/apache/site1.crt
  • /etc/secure/certs/apache/private/site1.key

これらが上記のとおりのディレクトリにある場合、SSL のファイル指定として次のようにします。

SSLCertificateFile /etc/secure/certs/apache/site1.crt

SSLCertificateKeyFile /etc/secure/certs/apache/private/site1.key

SSLCACertificateFile /etc/secure/ca/certs/ca.crt

SSLCARevocationFile /etc/secure/ca/certs/ca.crl

そのほか適切な SSL 設定を行えば、正常に SSL が使えることと思います。

なお、公的な認証局を CA としていない場合、サイトを見るたびに安全性を指摘されます。それを解消するにはブラウザなどに認証局を登録する必要があります。

Internet Explorer の場合、「インターネットオプション」 の 「コンテンツ」 に用意されている 「証明書」 というボタンから、ca.crt ファイルを、「信頼されたルート証明機関」 の 「レジストリ」 ストアにインポートしてあげればいいみたいです。