<< イントロダクション
PostgreSQL セットアップ


9. 通信暗号化

OpenSSLとmod_sslを使用して、Apache2.0でSSL(Secure Socket Layer)通信を利用可能にします。

9.1 OpenSSL セットアップ

ダウンロードでOpenSSLモジュールを解凍すると、OpenSSL作業ディレクトリが作成されていますので、作業ディレクトリに移動して、以下のコマンドを投入し、OpenSSLをセットアップします。

# cd openssl-0.9.7d

# ./config
# make
# make test
# make install

これで、OpenSSLモジュールは、/usr/local/sslディレクリ(デフォルト)にインストールされます。

9.2 mod_ssl セットアップ

Apache2.0では、標準でmod_sslモジュールが組み込まれていますので、Apacheを停止した後(Apacheが起動されている場合)、以下のコマンドを投入し、Apacheを再コンパイルして取り込みます。
なお、Apache2.0.xからApache2.0.41以降にアップグレードする際には、設定ファイル(httpd.conf等)、ログ等は以前の状態が維持されるため、バックアップは必ずしも必要ではありません。(ただし、予期せぬ事態に備えてバックアップはお薦めします)

# /etc/rc.d/init.d/httpd stop  ・・・Apacheが起動している場合

# cd /usr/local/download/httpd-2.0.49

# ./configure --prefix=/usr/local/apache2 --enable-so --enable-ssl --with-ssl=/usr/local/ssl
# make
# make install
    ここで、configureコマンドのオプションについて簡単に説明します。(--prefix、--enable-soは、「4.2 Apache2.0 セットアップ」を参照してください)
  • --enable-ssl : SSL(Secure Socket layer)サポート付加(mod_sslモジュール組み込み)
  • --with-ssl : OpenSSLがインストールされているディレクトリ
上記で、Apacheにmod_sslモジュールを組み込みました。
Apacheを起動し、mod_sslモジュールの組み込みを確認します。

# /etc/rc.d/init.d/httpd start

# /usr/local/apache2/bin/httpd -l
	・
	・
	mod_ssl.c
	・

9.3 プライベート認証局の作成

OpenSSLを使用して、プライベート認証局(CA:Certification Authority)を作成します。

9.3.1 秘密鍵の作成

秘密鍵を生成します。
秘密鍵生成のseedとなる乱数ファイルは、任意なテキストファイルでかまいませんが、ここではOpenSSLのメッセージダイジェスト計算機能(MD5)を使用して、Apacheの設定ファイルから作成します。

# cd /usr/local/ssl/bin

# ./openssl dgst /usr/local/apache2/config/* > rand.dat

次に、OpenSSLのRSAパラメタ生成機能を使用して、秘密鍵を作成します。

# ./openssl genrsa -rand rand.dat -out privkey.pem -des3 2048

Generating RSA private key, 2048 bit long modulus
	・
Enter pass phrase for privkey.pem: [パスフレーズ入力]
                  ← パスワードを入力します。本パスワードは以降の手順で必要となります。
Verifying - Enter pass phrase for privkey.pem: [上記パスフレーズ再入力]

    ここで、genrsaコマンドのオプションについて簡単に説明します。
  • -rand : 乱数ファイル名
  • -out : 秘密鍵ファイル名
  • -des3 : 暗号化方式
  • 2048 : 秘密鍵のビット数(2048以上が推奨値

  • ※ 第三者認証機関に提出するCSRを作成する場合、キーサイズ(秘密鍵のビット数)に制限がある認証機関もありますので、認証機関に確認した後、作成してください。

9.3.2 CSR(認証局への申請書)の作成

CSR(認証局への申請書)を作成します。
以下のコマンドを投入すると、パスフレーズに続いて、国コード(JP)等の入力要求になります。

# ./openssl req -new -key privkey.pem -out cert.csr

Enter pass phrase for privkey.pem: [上記パスフレーズ入力]
	・
Country Name (2 letter code) [AU]: JP
	・
	・

    ここで、reqコマンドのオプションについて簡単に説明します。
  • -key : 秘密鍵ファイル名
  • -out : CSR(申請書)ファイル名

9.3.3 証明書の作成

以下のコマンドを投入し、プライベート認証局で証明書を作成します。

# ./openssl x509 -in cert.csr -out cacert.pem -req -signkey privkey.pem

Signature ok
subject=/C=JP・・・
Getting Private key
Enter pass phrase for privkey.pem: [上記パスフレーズ入力]

    ここで、x509コマンドのオプションについて簡単に説明します。
  • -in : CSR(申請書)ファイル名
  • -out : 証明書ファイル名
  • -req : -inオプションで指定されたCSRの内容で、パスフレーズ入力後、証明書ファイルを出力
  • -signkey : 秘密鍵ファイル名
以上で、プライベート認証局の作成が完了しました。

● 認証キー(秘密鍵):privkey.pem
● 証明書(公開鍵):cacert.pem

9.4 Apacheの設定

ApacheのSSL定義ファイルを編集し、上記で作成した認証キー、証明書を登録します。
なお、上記設定のままでは、Apacheの起動毎にパスフレーズ入力を促しますので、Apacheを自動起動できるようパスフレーズを解除します。

# mv privkey.pem privkey.pem.org

# ./openssl rsa -in privkey.pem.org -out privkey.pem

Enter pass phrase for privkey.pem.org: [上記パスフレーズ入力]

次に、上記で作成した認証キー、証明書をApacheディレクトリ配下に移動し、SSL定義ファイルの編集を行ないます。

# mkdir /usr/local/apache2/conf/ssl

# mv /usr/loca/ssl/bin/*.pem /usr/local/apache2/conf/ssl

# vi /usr/local/apache2/conf/ssl.conf

89行目付近
ServerName new.host.name:443
	↓
ServerName localhost:443・・・WWWサーバ名を指定します

110行目付近
SSLCertificateFile /usr/local/apache2/conf/ssl.crt/server.crt
	↓
SSLCertificateFile /usr/local/apache2/conf/ssl/cacert.pem・・・証明書ファイル名を指定します

118行目付近
SSLCertificateKeyFile /usr/local/apache2/conf/ssl.key/server.key
	↓
SSLCertificateKeyFile /usr/local/apache2/conf/ssl/privkey.pem・・・認証キーファイル名を指定します

以上で、ApacheのSSL定義ファイルの設定が終了しました。
最後に、ApacheをSSL対応で起動するコマンドが、

# /usr/local/apache2/bin/apachectl sslstart

に変更になるため、Apacheの自動起動の設定変更を行ないます。

# cd /etc/rc.d/init.d
# vi httpd

以下のスクリプトを記述します。

#!/bin/sh
#
# Startup script for the Apache 2.0 Web Server
#
# chkconfig: 345 85 15
# description: Starts and Stops the Apache 2.0 Web server. 
# processname: httpd
# pidfile: /var/run/httpd.pid
# config: /usr/local/apache2/conf/httpd.conf

# Source function library.
. /etc/rc.d/init.d/functions

# See how we were called.
case "$1" in
  start)
	if [ -f /usr/local/apache2/bin/apachectl ]; then
		echo -n "Starting httpd: "
変更>	daemon "/usr/local/apache2/bin/apachectl start"
			↓ 以下の内容に変更
		daemon "/usr/local/apache2/bin/apachectl sslstart"
		echo
		touch /var/lock/subsys/httpd
	fi
	;;
  stop)
	if [ -f /usr/local/apache2/bin/apachectl ]; then
		echo -n "Shutting down httpd: "
		daemon "/usr/local/apache2/bin/apachectl stop"
		echo
		rm -f /var/lock/subsys/httpd
		rm -f /var/run/httpd.pid
	fi
	;;
  status)
	status httpd
	;;
  restart)
	if [ -f /usr/local/apache2/bin/apachectl ]; then
		echo -n "Restarting httpd: "
変更>	daemon "/usr/local/apache2/bin/apachectl restart"
			↓ 以下の内容に変更
		$0 stop
		$1 start
		echo
	fi
	;;
  *)
	echo "Usage: $0 {start|stop|restart|status}"
	exit 1
esac

exit 0

これでマシン起動後、自動的にApacheがSSL対応で起動します。
起動後、ブラウザから
https://localhost/
にアクセスし、プライベート認証局が正しく設定されていることを確認します。

<< イントロダクション
PostgreSQL セットアップ

更新履歴
OpenSSL 0.9.7c