Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。

SSL通信

ここでは、ApacheとTomcatの環境で、SSLに対応させる方法について解説します。他ページでは、Windows環境でのインストール方法について説明していますが、ここではLinux環境をペースに説明している点に注意してください。

実行環境
  • ・Red Hat Enterprise Linux 4
  • ・Tomcat 7.0.23
  • ・JDK 1.6.0
  • ・Apache 2.2.22
  • ・OpenSSL 1.0.1c

概要

WebサーバにApache、サーブレットコンテナにTomcatを使用し、両者の連携にTomcat Connectors(mod_jk)を使用している環境を想定しています。
Apache、Tomcat、Tomcat Connectors(mod_jk)のインストール、設定については、以下の関連するサイトなどを参照の上設定してください。

以下の手順で、SSLへの対応を行います。

  1. ApacheをSSLに対応させる。
  2. OpenSSLをインストールする。
  3. 公開鍵/秘密鍵のペアとデジタル証明書を作成する。
  4. ApacheにSSLの設定を行う。

1. ApacheをSSLに対応

ApacheにSSLの設定をするためには、mod_sslが有効になっている必要があります。mod_sslが有効になっているかを調べるためには、「$ /usr/local/apache2/bin/httpd -l」コマンドを使用します。「mod_ssl.c」が表示されない場合は、mod_sslが有効になっていません。

$ /usr/local/apache2/bin/httpd -l
Compiled in modules:
-----
-----
mod_ssl.c  # 表示されれば、mod_sslが有効になっています。
-----
-----

mod_sslが有効になっていない場合は、mod_sslを有効にして、Apacheを再コンパイルする必要があります。最新のApacheをインストールする場合は、以下のサイトから最新版をダウンロードしてください。
http://httpd.apache.org/download.cgi

Apache_ダウンロード

古いApacheがインストールされている場合は削除を行います。既にhttpd.confにApacheの設定をしている場合は削除する前にバックアップを取っておきましょう。

# rm -rf /usr/local/apache2

mod_sslを指定して最新のApacheを再コンパイル、インストールします。

# gunzip httpd-2.2.22.tar.gz
# tar xvf httpd-2.2.22.tar
# cd httpd-2.2.22
# ./configure --enable-ssl  # mod_sslを指定して再コンパイル
# make
# make test
# make install
# make clean

バックアップをとっていたhttpd.confを参照するなどし、Apacheの設定を元に戻しておきましょう。

mod_sslが有効になっているかの確認を行います。「$ /usr/local/apache2/bin/httpd -l」コマンドで、「mod_ssl.c」が表示されれば、mod_sslは有効になっています。

2. OpenSSLのインストール

SSLを利用するためには、OpenSSLというソフトウェアが必要になります。Linux環境ではほとんどの場合は、OpenSSLが事前にインストールされています。「$ openssl version」のコマンドを実行すると、インストールされているOpenSSLのバージョンが確認できます。
以下のサイトから最新版のOpenSSLのダウンロードを行います。
http://www.openssl.org/source/

OpenSSL_ダウンロード

古いOpenSSLの削除を行います。

# rm -rf /usr/bin/openssl
# rm -rf /usr/include/openssl

最新版のOpenSSLのインストールを行います。

# gunzip openssl-1.0.1c.tar.gz
# tar xvf openssl-1.0.1c.tar
# cd openssl-1.0.1c
# ./config
# make
# make test
# make install
# make clean

OpenSSLのコマンドを実行できるようにするため、環境変数PATHにopensslの実行ファイルのディレクトリ「/usr/local/ssl/bin」を設定します。

# PATH=$PATH:/usr/local/ssl/bin
# export PATH

3. 公開鍵/秘密鍵のペアとデジタル証明書の作成

SSLを利用するためには、公開鍵/秘密鍵のペアとデジタル証明書が必要です。生成するファイルは、server.key(秘密鍵)、server.csr(CSRファイル:公開鍵+証明書申請情報)、server.crt(デジタル証明書)の3つです。
SSLで利用されている公開鍵基盤(PKI)については以下のサイトを参照するなどしてください。

秘密鍵の作成

秘密鍵の作成を行います。本ページでは、2048bit鍵長の秘密鍵を作成する方法を記載しています。
作成の際、パスフレーズの入力が求められます。パスフレーズは後で利用しますので覚えておいてください。

# openssl md5 * > rand.dat
# openssl genrsa -rand rand.dat -des3 2048 > server.key
 
Enter pass phrase:  # パスフレーズを入力
Verifying - Enter pass phrase:  # パスフレーズ(確認)を入力

秘密鍵を該当ディレクトリ「/usr/local/apache2/conf/ssl.key」に保存します。

# mkdir /usr/local/apache2/conf/ssl.key
# cp server.key /usr/local/apache2/conf/ssl.key/server.key
# chmod 600 /usr/local/apache2/conf/ssl.key/server.key

CSRの作成

作成した秘密鍵を元にCSRの作成を行います。
CSRは、認証局(Verisign、GeoTrust等)からデジタル証明書を取得するときに必要です。公開鍵の情報の他に、組織名や所在地等の情報が含まれています。

# openssl req -new -key server.key -out server.csr
Enter pass phrase for newkey.pem:  # パスフレーズの入力が求められますので入力します。
 
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) []:Chiyoda
Organization Name (eg, company) [Internet Widgits Pty Ltd]:GeoTrust Japan, Inc.
Organizational Unit Name (eg, section) []:System1
Common Name (e.g. server FQDN or YOUR name) []:www.example.co.jp
Email Address []:
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

公開鍵情報の入力で求められる項目

Country Name サイトを運営する組織の国名。
State or Province Name サイトを運営する組織の都道府県名。
Locality Name サイトを運営する組織の区町村名。
Organization Name サイトを運営する組織の組織名。認証局が指定する値がある場合はそれを入力します。
Organizational Unit Name サイトを運営する組織の部門名。認証局が指定する値がある場合はそれを入力します。
Common Name SSLを使うサイトのURL。
Email Address メールアドレス。入力不要。
A challenge password 証明書を破棄する場合に必要になるパスワード。入力不要。
An optional company name 別の組織名がある場合、その組織名の入力。入力不要。

デジタル証明書の取得

CSRを作成したら、認証局(VerisignGeoTrust等)へ送信し、デジタル証明書を発行してもらいます。
認証局にデジタル証明書を発行してもらうのは有料です。テスト環境などで利用するために自分で作成する場合は、「# openssl x509 -in server.csr -days 365 -req -signkey server.key > server.crt」でデジタル証明書を作成します。作成の際、パスフレーズの入力が求められます。

デジタル証明書を該当ディレクトリ「/usr/local/apache2/conf/ssl.crt」に保存します。

# mkdir /usr/local/apache2/conf/ssl.crt
# cp server.crt /usr/local/apache2/conf/ssl.crt/server.crt
# chmod 600 /usr/local/apache2/conf/ssl.crt/server.crt

中間CA証明書の取得

ほとんどの認証局(VerisignGeoTrust等)では、中間CA証明書のインストールが求められています。該当の認証局のマニュアルを参照の上、中間CA証明書を取得してください。取得したら、中間CA証明書を該当ディレクトリ「/usr/local/apache2/conf/ssl.ca」に保存します。
中間CA証明書のファイル名は、認証局指定のファイル名にあわせ、修正してください。
テスト環境などで擬似的な環境を構築する場合は、必ずしも中間CA証明書は必要ではありません。

# mkdir /usr/local/apache2/conf/ssl.ca
# cp geotrustca.crt /usr/local/apache2/conf/ssl.ca/geotrustca.crt
# chmod 600 /usr/local/apache2/conf/ssl.ca/geotrustca.crt

4. ApacheにSSLの設定

ssl.confの設定

Apacheの「/usr/local/apache2/conf/conf.d」ディレクトリ配下にssl.confがありますので、それを変更して、SSLの設定を行います。
サーバのIPアドレス、ServerName(サーバのURL)、ServerAdmin(Apacheのエラーメッセージが表示されたときに表示する連絡先メールアドレス)の設定を行います。

<VirtualHost xxx.xxx.xxx.xxx:443>
-----
ServerName www.example.co.jp:443
ServerAdmin admin@example.co.jp
-----

秘密鍵(server.key)、デジタル証明書(server.crt)、中間CA証明書(geotrustca.crt)を読み込む設定を行います。コメントアウトされていますので、コメントアウトを外し、各証明書を指定します。
中間CA証明書を取得していない場合は、中間CA証明書の設定は不要です。

SSLCertificateKeyFile /usr/local/apache2/conf/ssl.key/server.key
SSLCertificateFile /usr/local/apache2/conf/ssl.crt/server.crt
SSLCACertificateFile /usr/local/apache2/conf/ssl.ca/geotrustca.crt

Tomcat上のSSL通信を行いたいURLパスをJkMountで指定します。「JKMount [Tomcat上のSSLで通信したいURLパス] [mod_jk.confのworker.listに指定されている値]」の書式で指定します。
以下は、Tomcat上のURLパス(/bbs)にSSL通信を行う場合の設定です。

JkMount /bbs* ajp13

httpd.conf

httpd.confファイルにssl.confファイルを読み込むように設定を行います。

Include conf/conf.d/ssl.conf

秘密鍵のパスフレーズの削除

Apacheの再起動のたびに秘密鍵のパスフレーズの入力を求められますので、以下のコマンドを実行し、パスフレーズの削除を行います。

# cd /usr/local/apache2/conf/ssl.key/
# cp server.key server.key.bak
# openssl rsa -in server.key.bak -out server.key
Enter pass phrase for server.key.bak:   # パスフレーズを入力します。

以上で設定は終了です。Apacheを再起動し、SSL通信が行えるか確認してください。
認証局から正式なデジタル証明書を発行してもらわず、自分で作成した場合は、ブラウザにアラートが表示されます。「このサイトの閲覧を続行する(推奨されません)。」などのメッセージを選択し、アラートを無視し接続を続行してください。SSL通信で接続できることが確認できます。

17SSL通信