sslを利用したセキュアサイトの構築

 Apache2から、標準でmod_sslが利用できるようになった。mod_sslをインストールしたセキュアサーバを運用するには、認証局と呼ばれる証明書発行期間から証明書を取得しなければならない。この機関は、証明書の持ち主が証明書に書かれている情報のとおりであることを保証する責任を担う。逆を言えば、アクセスしてくるユーザはアクセスしてくるユーザは証明書発行機関を信用する必要があるのである。
 しかし、OpenSSLではテスト用の証明書を作成できる。ここでは、テスト用の証明書(デジタルID)を作成する方法を簡単に解説する。

1.前準備

1-1 Apacheの設定

 Apache2では、コンパイルする際、--enable-sslオプションをつけるとmod_sslが有効になる。

# ./configure --enable-so --enable-ssl

 --enable-sslオプションを付けていなかったら、コンパイルしなおそう。

1-2 証明書作成用スクリプトの準備

 証明書の作成にはOpenSSLのperlスクリプトを利用する。これはopenssl-perlパッケージに含まれているので、openssl-perlがインストールされていなければ、次のようにインストールしておく。

# yum -y install openssl-perl

 インストール後、スクリプトファイル(/etc/pki/tls/misc/CA.pl)をviで開き、以下を修正する。
 ※CA.plの格納場所はディストリビューションによって違うので、注意!!

$CATOP="./demoCA";

 上記修正にOpenSSLが対応するよう、OpenSSLの設定ファイル(/etc/pki/tls/openssl.cnf)をviで開き、以下を修正する。

[ CA_default ]

dir      = ./demoCA       # Where everything is kept

1-3 証明書を格納するディレクトリの準備

 続いて、各ファイルを格納するディレクトリを作成する。場所は安全なところならどこでも良いので自分で決める。

# mkdir /root/sslfiles
# cd /root/sslfiles

2.プライベートCAの作成

 自分で作ったサーバ証明書を認証するための、プライベートCAを作成する。

2-1 CA用証明書・CA用秘密鍵の作成

 自分がテスト用の認証局となるための新しいCA階層を作成する。作成にはCA.plスクリプトを利用する。

# /etc/pki/tls/misc/CA.pl -newca

 認証局の情報を登録するメッセージが表示される。例えば次のように登録する。なお、入力したくなければドット「.」を入力すると、そのフィールドは空になる。

[root@www sslfiles]# /etc/pki/tls/misc/CA.pl -newca
CA certificate filename (or enter to create)
何も入力せずEnter
Making CA certificate ...
Generating a 1024 bit RSA private key
...................++++++
...........................++++++
writing new private key to './demoCA/private/cakey.pem'
Enter PEM pass phrase:CA用パスワードを入力
Verifying - Enter PEM pass phrase:CA用パスワードを再度入力
-----
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) [GB]:JP
State or Province Name (full name) [Berkshire]:Aichi
Locality Name (eg, city) [Newbury]:Nagoya
Organization Name (eg, company) [My Company Ltd]:AndoKomuten Private_CA
Organizational Unit Name (eg, section) []:Customer Center
Common Name (eg, your name or your server's hostname) []:組織名またはサーバーのホスト名
Email Address []:管理者メールアドレス
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:何も入力せずEnter
An optional company name []:何も入力せずEnter

-------- OpenSSLのバージョンが 0.9.8x の場合、以下に続く

Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:CA用パスワードを入力
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number:
            86:b2:47:f0:a4:20:c0:d3
        Validity
            Not Before: Jun  8 05:41:37 2007 GMT
            Not After : Jun  7 05:41:37 2010 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = Aichi
            organizationName          = AndoKomuten Private_CA
            organizationalUnitName    = Customer Center
            commonName                = AndoKomuten Private_CA
            emailAddress              = root@andokomuten.jp
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                F8:8B:F6:2F:6D:EF:EF:12:B7:92:3B:A2:2A:A3:CE:57:C6:C4:3C:68
            X509v3 Authority Key Identifier:
                keyid:F8:8B:F6:2F:6D:EF:EF:12:B7:92:3B:A2:2A:A3:CE:57:C6:C4:3C:68
                DirName:/C=JP/ST=Aichi/O=AndoKomuten Private_CA/OU=Customer Center/CN=AndoKomuten Private_CA/emailAddress=root@andokomuten.jp
                serial:86:B2:47:F0:A4:20:C0:D3

            X509v3 Basic Constraints:
                CA:TRUE
Certificate is to be certified until Jun  7 05:41:37 2010 GMT (1095 days)

Write out database with 1 new entries
Data Base Updated
[root@www sslfiles]#

 以上で、demoCAの下にCA証明書(cacert.pem)と、demoCA/privateの下にCAの秘密鍵が作成される。

 OpenSSL 0.9.7系は、CA証明書としてcacert.pemがそのまま使える。
 が、OpenSSL 0.9.8xの場合、以下のコマンドを実行し、CA証明書の部分だけを切り出したcacert.crtを作成し、こちらをCA証明書として利用する。

# openssl x509 -in demoCA/cacert.pem -out demoCA/cacert.crt

2-2 CA証明書をInternet Explorerにインストールするためファイルの作成

 次に、以下のコマンドを実行し、CA証明書をInternet Explorerにインストールするためのファイル ca.der を作成する。

# openssl x509 -inform pem -in demoCA/cacert.pem -outform der -out demoCA/ca.der
# chmod 755 demoCA/ca.der

 作成したca.derを、WebSiteなどからダウンロードできるようにしておく。このファイルをダウンロードして実行すると、作成したCA証明書がInternet Explorerにインストールされる。

3.サーバ証明書の作成

 サーバ証明書の作成を行う。このサーバ証明書はホスト名毎に作成するため、ホスト名が同じであれば、Apacheだけでなく、メールサーバやFTPサーバなどにも使える。同一マシンで複数のホスト名を使っている場合、ホスト毎にサーバ証明書の名前を変えて作成する。

3-1 サーバ証明書発行リクエストの作成

 まず、サーバ証明書を発行してもらうためのリクエストファイルの作成を行う。sslfilesの中にいることを確認し、次のコマンドを実行する。

# /etc/pki/tls/misc/CA.pl -newreq-nodes

 Webサイトの情報を登録するメッセージが表示される。例えば次のように登録する。
 ※Organization NameをCA証明書と同じにすると、動作がおかしくなるので必ず変更すること!!

[root@www sslfiles]# /etc/pki/tls/misc/CA.pl -newreq-nodes
Generating a 1024 bit RSA private key
.......++++++
.........++++++
writing new private key to '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) [GB]:JP
State or Province Name (full name) [Berkshire]:Aichi
Locality Name (eg, city) [Newbury]:Nagoya
Organization Name (eg, company) [My Company Ltd]:AndoKomuten WebSite
Organizational Unit Name (eg, section) []:Customer Center
Common Name (eg, your name or your server's hostname) []:ホスト名
Email Address []:管理者メールアドレス

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:何も入力せずEnter
An optional company name []:何も入力せずEnter
Request is in newreq.pem, private key is in newkey.pem
[root@www sslfiles]#

 以上で、demoCAと同レベルにリクエストファイル(newreq.pem)と、秘密鍵(newkey.pem)が作成される。

3-2 サーバ証明書の発行

 正式な証明書を発行するには、証明書発行リクエストファイル(newreq.pem)を日本べりサイン株式会社などの正式な認証局に送って署名してもらう。ここではテスト用に証明書を発行するするので、自分が認証局と仮定して、次のように自己署名する。

# /etc/pki/tls/misc/CA.pl -sign

 署名するためのメッセージが表示されるので、それぞれ次のように登録する。

[root@www sslfiles]# /etc/pki/tls/misc/CA.pl -sign
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:CA用パスワードを入力
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number:
            86:b2:47:f0:a4:20:c0:d4
        Validity
            Not Before: Jun  8 06:32:54 2007 GMT
            Not After : Jun  7 06:32:54 2008 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = Aichi
            localityName              = Nagoya
            organizationName          = Andokomuten WebSite
            organizationalUnitName    = Customer Center
            commonName                = ホスト名
            emailAddress              = 管理者メールアドレス
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                84:96:FB:FC:AA:F7:3D:EB:C7:CD:A7:A5:5C:0D:31:98:98:5A:62:87
            X509v3 Authority Key Identifier:
                keyid:F8:8B:F6:2F:6D:EF:EF:12:B7:92:3B:A2:2A:A3:CE:57:C6:C4:3C:68

Certificate is to be certified until Jun  7 06:32:54 2008 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
Signed certificate is in newcert.pem
[root@www sslfiles]#

 以上で、newcert.pemというサーバ証明書が作成される。このままでは利用できないので、以下のコマンドを実行し、サーバ証明書だけを切り出す。

# openssl x509 -in newcert.pem -out server.crt

 作成された server.crt が、正しいサーバ証明書である。このサーバ証明書は、Apache等のWebサーバや、ProFTPDなどのFTPサーバでそのまま利用できる。

3-3 メールサーバ用サーバ証明書の作成

 メールサーバ用のサーバ証明書は、以下のコマンドを実行し、サーバ証明書と秘密鍵から作成する。

# (cat server.crt;cat newkey.pem) > mail.pem

4.セキュアサイトの設定

 作成したサーバ証明書を、Apacheのセキュアサイトに利用する方法を紹介する。

4-1 作成したファイルを配置する

 作成したサイト証明書と秘密鍵を配置する。

# mkdir /usr/local/apache2/conf/ssl.crt
# mkdir /usr/local/apache2/conf/ssl.key
# cp server.crt /usr/local/apache2/conf/ssl.crt/
# cp newkey.pem /usr/local/apache2/conf/ssl.key/server.key

 配置したら、SSLの設定ファイル(/usr/local/apache2/conf/ssl.conf)において、サーバ証明書と秘密鍵の設定を確認する。

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

4-2 Apacheの再起動

 サイト証明書と秘密鍵の設置が終わったら、Apacheを再起動する。通常の起動スクリプトではSSL機能付きでApacheを起動できないため、とりあえず次のように起動する。

# /etc/rc.d/init.d/httpd stop ←起動スクリプトを使って停止
# /usr/local/apache2/bin/apachectl startssl ←SSLオプション付きでApacheを起動

4-3 動作確認

 クライアントPCから通常通り、ブラウザで以下のようにURLを指定し、通常のページが表示されるかを確認する。

http://サーバのIPアドレス

 表示されれば、URLを以下のように変更し。セキュアサイトが表示されるかを確認する。

https://サーバのIPアドレス

 セキュアサイトがどのページを表示するかといった指定を行っていないため、通常のサイトと同じページが表示されるが、セキュリティで保護されたページであることを示すメッセージが表示されたはずである。
 この警告メッセージを表示したくなければ、2−2で作成したca.derファイルをインストールすればよい。なお、Internet Explorerの6までは、ca.derファイルをダブルクリックして実行し、そのままインストールを進めればよいが、Internet Explorerの7では、インストールの途中で証明書の格納場所を「信頼されたルート証明機関」に指定しなければならない。

4-4 Apache起動スクリプトの修正

 起動スクリプトによるApacheの開始でSSLが有効になるように、起動スクリプト/etc/rc.d/init.d/httpdを次のように修正する。

・
・
・
start() {
        echo -n $"Starting $prog: "
        check13 || exit 1
        daemon $httpd $OPTIONS -DSSL
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch /var/lock/subsys/httpd
        return $RETVAL
}
・
・
・

 修正したら、起動スクリプトを使ってApacheを起動し、SSLサイトが表示できるかを確認する。

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

4-5 セキュアサイト用環境の設定

 通常、SSLを使ったページは別のディレクトリに配置して利用する。その設定を行うには、ApacheのSSL設定ファイル(/usr/local/apache2/conf/ssl.conf)を編集する。viでssl.confを開き、セキュアサイト用のコンテンツを配置するディレクトリや、ログファイルなどの設定を必要に応じて指定する。

##
## SSL Virtual Host Context
##

<VirtualHost _default_:443>

#   General setup for the virtual host
DocumentRoot "セキュアサイトのコンテンツを置くディレクトリ"
ServerName ホスト名:443
ServerAdmin 管理者メールアドレス
ErrorLog /usr/local/apache2/logs/error_log
TransferLog /usr/local/apache2/logs/access_log

 ログファイルをhttpd.conf内の設定と違うファイル名にすれば、通常のサイトとSSLのサイトと別のログファイルで管理できる。必要に応じて変更しよう。
 設定を保存したら、Apacheを再起動し、指定したディレクトリにファイルを用意し、クライアントからアクセスできるかどうかを確認する。


[ TOP ]