Plesk Obsidianリリース記念!Plesk最大7カ月無料キャンペーン

2012/10/5

【実証】WebサーバーにSSLを使った暗号化通信を導入しよう

次期クラウドサービスβ版とは?

GMOクラウド株式会社の芦田です。これまでWebサイトやメールサーバーの構築方法などを解説してきましたが、いずれの場合も暗号化されたセキュアな通信手段については触れませんでした。しかし、実際にWebサービスを展開する上では暗号化への対応は避けては通れません。そこで今回は、OpenSSLとApacheを使ってhttpsプロトコルによる暗号化通信ができるようにしてみます。

1 OpenSSL と mod_ssl の導入

Apacheで暗号化通信を行うためには、OpenSSLとmod_sslモジュールを組み合わせて使います。仮想サーバー作成時にLAMPPテンプレートを使用している場合には、すでにOpenSSLとmod_sslモジュールはインストールされた状態になっていると思います。もしOpenSSLがインストールされていない(「/usr/bin/openssl」コマンドがない)場合は、yumを使って次のようにインストールできます。
[root@kumolabo-test ~]# yum -y install openssl mod_sslモジュールがインストールされていない(「/etc/httpd/modules/mod_ssl.so」ファイルがない)場合には、yumを使って次のようにインストールできます。
[root@kumolabo-test ~]# yum -y install mod_ssl

2 サーバー用秘密鍵と CSR の作成

Apacheで暗号化通信を行うためには、認証局から発行してもらったサーバー証明書を発行してもらう必要があります。その申請のためにはCSR(証明書署名要求: Certificate Signing Request)と呼ばれる申請用ファイルを用意しなければなりません。また、サーバー証明書とは別にサーバー用秘密鍵が必要です。CentOSでは、スクリプトによってCSRとサーバー用秘密鍵のファイルを同時に作成することができます。スクリプトは/etc/pki/tls/miscディレクトリにあります。ここで、「CA -newreq」というコマンドを実行し、必要事項を入力してください。

[root@kumolabo-test ~]# cd /etc/pki/tls/misc
[root@kumolabo-test misc]# ./CA -newreq
writing new private key to ‘newkey.pem’ 
Enter PEM pass phrase:                     <ー【パスフレーズを入力】
Verifying – Enter PEM pass phrase:     <ー【同じパスフレーズを入力】
-- 
Country Name (2 letter code) []:       <ー【国名を2文字で入力(JP)】
State or Province Name (full name) []:       <ー【県名を入力(Tokyo)】
Locality Name (eg, city) []:               <ー【都市名を入力(Shibuya-ku)】
Organization Name (eg, company) []:       <ー【企業名を入力】
Organizational Unit Name (eg, section) []:    <ー【部署名を入力(WebManager)】
Common Name (eg, your name or your server’s hostname) []:       <ー【ホスト名を入力(kumolabo-test.example.com)】
Email Address []:               <ー【メールアドレス名を入力】
Please enter the following ‘extra’ attributes to be sent with your certificate request A challenge password []:       <ー【パスワードを入力】
An optional company name []:         <ー【追加の企業名を入力】
Request is in newreq.pem, private key is in newkey.pem

パスフレーズはApacheの起動時などに毎回要求されます。また、発行される証明書はここで入力したホスト名で利用する場合のみ有効なので、間違えないようにしましょう。このコマンドで、次の2つのファイルが生成されます。

  • CSR: /etc/pki/tls/misc/newreq.pem
  • サーバー用秘密鍵: /etc/pki/tls/misc/newkey.pem

このうち、newkey.pemの方は「key.pem」に名前を変更して任意の場所(例えば/usr/local/conf/ssl /private/ディレクトリ)に配置しておきます。配置場所はどこでもいいのですが、秘密鍵は漏洩したら意味がなくなってしまうので、アクセス権など をしっかり管理する必要があります。

newreq.pemで大事なのは「—–BEGIN CERTIFICATE—–」から「—–END CERTIFICATE—–」までの部分です。認証局への申請時にはこの部分に記載された内容が必要になります。
※なお、GMOクラウド PublicにはSSLサーバー証明書を発行するオプションも用意されています。

3 サーバー証明書と認証局証明書の配置

認証局による審査が通過すればサーバー証明書が発行されます。重要なのは、発行された内容の「—–BEGIN CERTIFICATE—– 」から「—–END CERTIFICATE—–」の部分です。この部分をコピーしてファイルに保存します。今回では、「/usr/local/conf/ssl/cert.pem」というファイルに保存しました。
もうひとつ、認証局のルート証明書または中間証明書も必要です。これは申請を行った認証局で公開されているはずなので、それを取得してください。内容はサーバー証明書と似た形式で、—–BEGIN CERTIFICATE—–」と「—–END CERTIFICATE—–」に囲まれた文字の羅列になっているので、これをコピーしてファイルに保存します。今回の例では、「/usr /local/conf/ssl/inca.pem」というファイルに保存しました。

4 Apache とファイアウォールの設定

サーバー証明書などの必要ファイル一式が用意できたら、Apacheの設定ファイルを編集します。SSLの設定は「/etc/httpd /conf.d/ssl.conf」に記述します。このファイルのうち、下記の箇所を編集し、必要な情報を記入してください。ServerNameは認証局で認証を受けたサーバー名でなければいけません。

DocumentRoot “/var/www/html”                        #<ーコメントアウトをはずす
ServerName kumolabo-test.example.com:443    #<ーコメントアウトをはずしてサーバー名を修正
SSLCertificateFile /usr/local/conf/ssl/cert.pem     #<ーサーバー用証明書
SSLCertificateKeyFile /usr/local/conf/ssl/private/key.pem   #<ーサーバー用秘密鍵
SSLCACertificateFile /etc/pki/CA/cacert.pem       #<ー認証局のルート証明書または中間証明書
httpsによる通信はデフォルトで443番ポートを使用するので、仮想サーバーのファイアウォールの設定でこのポートに対するアクセスを許可しておく必要があります。

以上の設定が完了したらhttpdを再起動します。SSLを適用すると、httpdの起動時にパスフレーズを問われるようになります。ここでサーバー用秘密鍵の作成時に指定したパスフレーズを入力します。

[root@kumolabo-test ~]# /etc/rc.d/init.d/httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd: Apache/2.2.3 mod_ssl/2.2.3 (Pass Phrase Dialog)
Some of your private key files are encrypted for security reasons.
In order to read them you have to provide the pass phrases.
Server kumolabo-host.example.com:443 (RSA)
Enter pass phrase:         <ー【パスフレーズを入力】
OK: Pass Phrase Dialog successful.  
	  [  OK  ]

httpdが起動したら、Webブラウザからアクセスしてみましょう。「https://kumolabo-test.example.org/」のようにhttpsからはじまるURLでのアクセスができるようになっているはずです。 サーバー証明書は、ひとつ取得してしまえばApacheだけでなくSMTPサーバーやPOP/IMAPサーバーなど、他のアプリケーションでも利用することができます。いろいろなサービスで暗号化通信を導入にチャレンジしてみましょう。


コラム一覧へ