SSLを使ってセキュアなWebページを作成するための方法を見ていきます。

ApacheからSSLを使用する

ApacheでSSLを利用するには以下のソフトウェアが必要です。

ソフトウェア 概要
OpenSSL SSLを利用するために必要なソフトウェア
mod_ssl OpenSSLを使ってApacheをSSLに対応させるモジュール

以降、それぞれのソフトウェアのインストール方法から見ていきます。

OpenSSLのインストール

OpenSSLはCentOSをデフォルト設定でインストールした場合は既にインストールされています。まず、OpenSSLがインストールされているかどうか確認しましょう。

# rpm -qa | grep openssl
openssl-1.0.1e-42.el6.i686

上記のようにgrepの結果が出力されれば、既にインストールされています。もし、何も出力されていなければインストールされていません。その場合は、以下コマンドでインストールします。

# yum install openssl

OpenSSLのバージョンも確認しておきましょう。

# openssl version
OpenSSL 1.0.1e-fips 11 Feb 2013

mod_sslのインストール

mod_sslはOpenSSLを使ってApacheをSSLに対応させるモジュールです。Apacheのモジュールもyumを使用してインストールできます。

# yum install mod_ssl
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
 * base: ftp.jaist.ac.jp
 * extras: ftp.jaist.ac.jp
 * updates: ftp.jaist.ac.jp
Setting up Install Process

 ~ 省略 ~

Installed:
  mod_ssl.i686 1:2.2.15-47.el6.centos

Complete!

インストールされたかどうか以下コマンドで確認します。

# rpm -qa | grep mod_ssl
mod_ssl-2.2.15-47.el6.centos.i686

grepの結果が出力されれば、無事にインストールされています。

サーバー証明書の作成

ApacheでSSLを使えるようにするためには、サーバー証明書を作成しApacheに組み込む必要があります。証明書の作成はOpenSSLのコマンドを使用します。

# cd /etc/pki/tls/certs/
# make server.crt
umask 77 ; \
        /usr/bin/openssl genrsa -aes128 2048 > server.key
Generating RSA private key, 2048 bit long modulus
.......+++
..+++
e is 65537 (0x10001)
Enter pass phrase:
Verifying - Enter pass phrase:
umask 77 ; \
        /usr/bin/openssl req -utf8 -new -key server.key -x509 -days 365 -out server.crt -set_serial 0
Enter pass phrase for server.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) [XX]:JP
State or Province Name (full name) []:Aichi
Locality Name (eg, city) [Default City]:Nagoya
Organization Name (eg, company) [Default Company Ltd]:Person
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:www.test.com
Email Address []:test@test.com

これで秘密鍵「server.key」とサーバー証明書「server.crt」が作成されました。ただ、このままでは秘密鍵を使用する都度、パスフレーズが要求されます。つまり、Apacheの起動の際、毎回パスフレーズを入力しないといけません。セキュリティ上の観点からはこのままの方が望ましいですが、ここでは秘密鍵のパスフレーズを解除します。

# mv server.key server.key.bak
# openssl rsa -in server.key.bak -out server.key
Enter pass phrase for server.key.bak:
writing RSA key

これで、パスフレーズは解除されました。

秘密鍵「server.key」とサーバー証明書「server.crt」が同じディレクトリに保存されていますが、管理上、秘密鍵は以下のディレクトリに移動させます。

# mv /etc/pki/tls/certs/server.key /etc/pki/tls/private/server.key

ApacheにSSL設定をする

サーバー証明書と秘密鍵を生成したら、それらをApacheに組み込む作業を行ないます。SSLに関する設定は「/etc/httpd/conf.d/ssl.conf」に記述することにします。

# cd /etc/httpd/conf.d/
# vi ssl.conf

 ~ 省略 ~

Listen 443

 ~ 省略 ~

<VirtualHost _default_:443>

ServerName www.sample.com:443

SSLCertificateFile /etc/pki/tls/certs/server.crt

SSLCertificateKeyFile /etc/pki/tls/private/server.key

 ~ 省略 ~

</VirtualHost>

「<VirutalHost _default_:443>」というように記述すると、他の仮想ホスト設定に該当しないリクエストをすべてここで受け付けるようになります。

サーバー証明書と秘密鍵のパスはそれぞれ以下ディレクティブで指定します。

SSLCertificateFile SSLサーバ証明書の保存ディレクトリ
SSLCertificateKeyFile 秘密鍵の保存ディレクトリ

以上で「ssl.conf」の設定は完了です。
あとはApacheを再起動させ、設定を反映させます。

# /sbin/service httpd restart
Stopping httpd:                                 [  OK  ]
Starting httpd:                                 [  OK  ]

httpsでテストページにアクセスする

早速、SSLのWebサーバーに接続してみます。プロトコルはhttpのかわりにhttpsを指定します。
セキュリティ証明書警告画面

正式なサーバー証明書ではない旨のメッセージが表示されます。本来、証明書はCAで証明されたものを使用する必要がありますが、今回は自分で署名をする証明書(オレオレ証明書)を使っているので、この警告が出力されます。

「このサイトの閲覧を続行する」をクリックし、次に進めます。
テストページ

Webページが表示されれば、httpsでのアクセスに成功したことになります。