Apache2 を SSL に対応
Secure Sockets Layer (SSL)
ブラウザーと Web サーバー(httpd)との通信は、Hyper Text Transfer Protcol (HTTP) と呼ばれるプロトコルでデータをやり取りします。しかし、生データが流れるためインターネットショッピング等をする際に、個人情報が漏れるなどセキュリティー上不具合が生じます。そこで、データを暗号化する 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 (Apache-SSL) SSLCertificateChainFile (Apache+mod_SSL)
ベリサインの証明書を登録する方法はここから。説明では ssleayコマンドを利用していますが openssl コマンドを利用する。
openssl genrsa -des3 -out domain.key 1024 # プライベートキーを作成 openssl req -new -key domain.key -out domain.csr # RSAプライベートキーでCSRを作成 ※ 作成する際、< > ~ ! @ # $ % ^ * / ( ) ? . , &の文字は使用できません。
しかし、経路暗号化のためだけに利用するならそれほど神経質になる必要はありません。そこで、自分で証明した証明書を作って登録してしまいます。
【証明書の作成】
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
別の方法として、きちんとパスフレーズを取得するように設定するには、SSLPassPhraseDialogを設定します 。
<IfModule ssl_module>
SSLPassPhraseDialog exec:/usr/local/apache2/bin/ssl-passwd.sh
</IfModule>
/usr/local/apache2/bin/ssl-passwd.shの内容は単純にパスフレーズをエコーするだけのスクリプトになります。このスクリプトは、他人に参照されないようにしないといけないけどね・・・
#!/bin/sh echo "<パスフレーズを入力>" exit 0
動作確認
実際にブラウザーからサーバーにアクセスし、SSL が機能しているか確認します。ここで、注意することがあります。通 常、URL は http
://www.example.com/
と指定しますが、SSL の場合、https
://www.example.com/
というふうに httpsとなります。これまでの設定では、通信中のデータを暗号化する程度に利用するなら問題ないが、クレジット番号を利用するような場合、ベリサインのようなそれなりに信用のある機関に証明書を発行してもらうことをお勧めします。