Apache2 を SSL に対応

* Secure Sockets Layer (SSL)

* Apache 2.0 を SSL対応にするために必要なモジュール

Apache2 (HTTP Server) http://httpd.apache.org/download.cgi
OpenSSL http://www.openssl.org/source/
openssl-0.9.7c.tar.gz

上記のモジュールをダウンロードして SSL対応の Apache を作る場合、ソースそのものが改ざんされていないかチェックしておくと良いでしょう。MD5, PGP Signatures が用意されているので、改ざんされていないかモジュールを調べておくことをお勧めします。

* モジュールの作成

まず、はじめに OpenSSL をインストールする必要があります。 デフォルトコンフィグレーションでは、/usr/local/ssl ディレクトリーに各モジュールがインストールされます。
# gzip -dc openssl-0.9.7c.tar.gz | tar xf -
# cd openssl-0.9.7c
# ./config
(ダイナミックライブラリを作りたければコマンドラインオプション shared を指定しておく [ ./config shared ])
(その際にダイナミックライブラリのサーチパス[ldconfig, crle, etc]をきちんと設定する)
# make
# make test
# make install
# cd ..
Apache 2 のソース( httpd-2.0.47.tar.gz)を展開し、SSL を有効にするようにコンフィグレーションします。
# gzip -dc httpd-2.0.47.tar.gz | tar xf -
# cd httpd-2.0.47
# ./configure --enable-so --enable-ssl --with-ssl=/usr/local/ssl
# make
# make install

* 証明書や認証キーの作成

商用利用するためには、本当に信頼のおける環境なのかを相手に証明するために、ベリサインのような公の認証機関が発行した証明書を利用します。証明書等を入手したら、Apache の設定ファイル(/usr/local/apache2/conf/ssl.conf)を編集し登録します。

SSLCertificateFile
SSLCertificateKeyFile
SSLCACertificateFile
SSLCARevocationFile

ベリサインの証明書を登録する方法はここから。説明では ssleayコマンドを利用していますが openssl コマンドを利用する。

しかし、経路暗号化のためだけに利用するならそれほどシリアスになる必要はありません。そこで、自分で証明した証明書を作って登録してしまいます。

【証明書の作成】

openssl コマンドを利用して公開鍵証明書作成、CSR(Certificate Signing Request:証明書要求)の作成、CSR に署名し apache に登録することで利用できるようになります。

証明書等はどこに作っても良いが、管理しやすいように /usr/local/apache2/conf に作成します。openssl コマンドを起動する上で必要となる設定ファイル(openssl.cnf)を作成します。以下は、最低限修正していくと便利な部分のみ記述しておきます。次回利用するのに以下の変更以外に default とついた部分を修正しておくと良いでしょう。

# cd /usr/local/apache2/conf
# mkdir ca
# cd ca
# cp /usr/local/ssl/openssl.cnf .
# edit openssl.cnf
  #RANDFILE = $ENV::HOME/.rnd
  RANDFILE = private/.rnd
  ...
  #dir     = ./demoCA
  dir      = .

openssl.cnf に従って必要なファイルとディレクトリーを作成します。その後、opensslコマンドを利用して証明書を作成します。ここでは、適当なファイルやディレクトリーを作って乱数の seed にしています。

# echo 01 > serial
# touch index.txt
# mkdir certs crl newcerts private
# /usr/local/ssl/bin/openssl md5 * > private/.rnd
# /usr/local/ssl/bin/openssl req -x509 -new -config ./openssl.cnf \
> -keyout private/cakey.pem -out cacert.pem
Using configuration from ./openssl.cnf
Generating a 1024 bit RSA private key
........++++++
................................++++++
writing new private key to 'private/cakey.pem'
Enter PEM pass phrase:<パスフレーズを入力>
Verifying password - Enter PEM pass phrase:<確認のため同じパスフレーズを入力>
-----
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) []:Tokyo
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Co.
Organizational Unit Name (eg, section) []:Baz Section
Common Name (eg, YOUR name) []:www.example.com
Email Address []:webmaster@example.com
 
# /usr/local/ssl/bin/openssl req -new -config ./openssl.cnf \
> -keyout private/site-cert.key -out site-cert.pem
Using configuration from ./openssl.cnf
Generating a 1024 bit RSA private key .....++++++ .........++++++ writing new private key to 'private/site-cert.key' Enter PEM pass phrase:<パスフレーズを入力> Verifying password - Enter PEM pass phrase:<確認のため同じパスフレーズを入力> ----- 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) []:Tokyo Organization Name (eg, company) [Internet Widgits Pty Ltd]]:Example Co. Organizational Unit Name (eg, section) []:Baz Section Common Name (eg, YOUR name) []:www.example.com Email Address []:webmaster@example.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:<CR> An optional company name []:<CR> # /usr/local/ssl/bin/openssl ca -config ./openssl.cnf \ > -in site-cert.pem -out site-cert.crt Using configuration from ./openssl.cnf Enter pass phrase for ./private/cakey.pem:<パスフレーズを入力> Check that the request matches the signature Signature ok Certificate Details: Serial Number: 1 (0x1) Validity Not Before: Jun 18 03:02:44 2003 GMT Not After : Jun 17 03:02:44 2004 GMT Subject: countryName = JP stateOrProvinceName = Tokyo organizationName = Example Co. organizationalUnitName = Baz Section commonName = www.example.com emailAddress = webmaster@example.com X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 51:A6:61:B4:E8:FB:FB:9E:9B:FF:5B:FA:A7:7A:9A:BD:09:F7:7B:A6 X509v3 Authority Key Identifier: keyid:61:2B:A8:0E:88:D8:C9:27:A3:D4:3A:2E:02:FD:AF:D6:40:0E:DD:A0 DirName:/C=JP/ST=Tokyo/L=Toshima/O=Example Co./OU=Baz Section/ CN=Admin/emailAddress=webmaster@example.com serial:00 Certificate is to be certified until Jun 17 03:02:44 2004 GMT (365 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated #
Country Name 2文字の国コードを入力
State or Province Name 州、県の名前を入力(CAのように省略しない)
Locality Name 市の名前を入力
Organization Name 組織の名称を入力(特殊な文字はなるべく避ける & -> and)
Organizational Unit Name セクション名を入力
Common Name サーバーの別名ではなく、セキュアサーバーの本当の名前(有効なDNS名)を入力
Email Address Webマスターやシステム管理者の電子メールアドレスを入力

【作成したキーを Apache に登録】

作成した証明書や認証キーにあわせて Apache の設定ファイル(/usr/local/apache2/conf/ssl.conf)を編集します。

  SSLCertificateFile /usr/local/apache2/conf/ca/site-cert.crt
  SSLCertificateKeyFile /usr/local/apache2/conf/ca/private/site-cert.key

として証明書等を登録することができます。

* 起動

Apache を SSL 対応として起動させる際は、start ではなく startssl コマンドラインオプションを使用します。

Apache の設定ファイルである /usr/local/apache2/conf/httpd.conf をチェックします。Solars で既に HTTP サーバーが起動している場合、それを停止するか、新しくインストールした Apache の ポートを変更する。特に Listen, User, Group, ServerName といったディレクティブはチェックしてください。

  # edit /usr/local/apache2/conf/httpd.conf
ディレクティブ 説明
Listen httpd (HTTPサーバー) が、監視するポートを指定します。
User httpd (HTTPサーバー)を起動するときのオーナーを指定します。
Group httpd (HTTPサーバー)を起動するときの group を指定します。#-1 に設定されていてうまく動作しないときがあるので、nobody など実際に許可を与えたいグループに設定します。
ServerName httpd (HTTPサーバー)を起動するホストとポートを指定します。DNS に登録されていない場合、IP Address を指定します。

また、デフォルトの charset が ISO-8859-1 なので自分の作った各ページに charset をきちんと書いていないと文字化けすることがあります。日本語がメインのサイトならば、以下の設定にすると良い。

# DefaultLanguage nl
# デフォルト言語を ja にする
DefaultLanguage ja
 
#LanguagePriority en da nl et fr de el it ja kr no pl pt pt-br ltz ca es sv tw
# リストのオーダーを ja を先頭にする
LanguagePriority ja en da nl et fr de el it kr no pl pt pt-br ltz ca es sv tw
 
# AddDefaultCharset ISO-8859-1 コメントアウト
# AddDefaultCharset EUC-JP   または、ISO-2022-JP, EUC-JP, shift_jis に設定

同じように、SSL の設定ファイルである /usr/local/apache2/conf/ssl.conf をチェックします。SSL サーバーは、Virtual Host として動作するようになっているので、<VirtualHost _default_:443> ... </VirtualHost> で囲まれた部分をチェックする必要があります。最低でも以下の部分をチェックして設定するホストに合わせてください。

  # edit /usr/local/apache2/conf/ssl.conf
DocumentRoot "/usr/local/apache2/htdocs"
ServerName www.example.com:443
ServerAdmin you@example.com

設定が終わったら、チェックします。

  # /usr/local/apache2/bin/apachectl configtest
  Syntax OK
  # 

実際に起動します。うまく動作しないようなら、/usr/local/apache2/logs/error_log ファイルをチェックすることでほとんどの問題が解決できます。

# /usr/local/apache2/bin/apachectl startssl
Apache/2.0.47 mod_ssl/2.0.47 (Pass Phrase Dialog)
Some of your private key files are encrypted for security reasons.
In order to read them you have to provide us with the pass phrases.
Server www.example.com:443 (RSA) Enter pass phrase:<パスフレーズを入力> Ok: Pass Phrase Dialog successful. #

Apache を SSL 対応で起動するたびに、パスフレーズを聞いてくるので OS 起動時に自動的に起動することができません。そこで、パスフレーズをはずしてしまいます。

# /usr/local/apache2/bin/apachectl stop
# cd /usr/local/apache2/conf/ca/private
# cp -p site-cert.key site-cert.key.org
# /usr/local/ssl/bin/openssl rsa -in site-cert.key.org -out site-cert.key
Enter pass phrase for site-cert.key.org:<パスフレーズを入力>
writing RSA key
# /usr/local/apache2/bin/apachectl startssl

* 動作確認

実際にブラウザーからサーバーにアクセスし、SSL が機能しているか確認します。ここで、注意することがあります。通 常、URL は http://www.example.com/ と指定しますが、SSL の場合、https://www.example.com/ というふうに httpsとなります。これまでの設定では、通信中のデータを暗号化する程度に利用するなら問題ないが、クレジット番号を利用するような場合、ベリサインのようなそれなりに信用のある機関に証明書を発行してもらうことをお勧めします。