※弊社記事はたぶんにPRが含まれますので
話半分で受け取ってください。

とある博物館の売店の営業は無事に終了しました。

CentOS5でSSLを設定する

 特に何もしない場合、インターネット上を流れるデータは暗号化されていない状態でやりとりされます。言い換えると、HTTPでは平文で情報がやりとりされます。でも、それだとパスワードのやりとりをする際に第三者にそれを盗み見られる可能性が発生します。そこで、SSLを使って、通信を暗号化する必要が出てきます。
 というわけで今回はSSLを設定してHTTPSが使えるようにしたいと思います。

 SSLを設定するには、

  • サーバ
  • クライアント
  • CA(Certification Authority; 認証局)

の3つが関係してきます。

 サーバとSSL通信を行うにはまず、サーバからデータを暗号化するための鍵を受けとる必要があります。そして、「サーバから送られてきたこの鍵はまさしくそのサーバの鍵である」と言うことを証明してくれるのがCAです。(別の人が偽物の鍵を送ってきている可能性もあるため。)

 ただ、CAのサービスは多くの場合有料(年間数千円から数万円)です。そのため、たとえば、自分しか使う事はないであろう、オレオレブログの管理画面への通信を暗号化したい、と言う場合は、CAの料金がちょっと高く感じるかもしれません。
 そんな、「どうせ自分しか使わないけど、パスワードくらいは暗号化しときたいよなぁ」なんて場合に、自分でCA(プライベートCA)を立てたり、自分で自分を証明したり(自己署名)することがあります。これがいわゆる、「オレオレ証明書」。無料です。
 公のCAを利用するより安全性は劣るが、HTTPで平文をやりとりするよりはマシ、と言う感じ。

オレオレ証明書の作り方

 今回は自分で自分を証明する自己署名での「オレオレ証明書」の作り方をまとめます。あくまでオレオレ証明書なので、不特定多数相手のサービスではちゃんと公のCAを利用してね。

 以下はサーバ上でルートに化けてから作業しています。

1. 鍵などを保存するディレクトリの設定

 鍵は別にサーバ上のどこにあっても良いようですが、更新する際の手間を考えると、どこか分かりやすい場所にまとめておいた方が良いと思います。
 ここでは /etc/httpd/conf/ssl というディレクトリに鍵やら証明書やらをまとめて突っ込むことにします。もちろん、別のディレクトリにしても問題はありません。

 以降はそのディレクトリの中で作業をするので、まずはそのディレクトリに移動します。

# cd /etc/httpd/conf/ssl

2. サーバの秘密鍵の作成

 サーバの秘密鍵 server.key を作成します(分かりやすければファイル名は別に何でも良いです)。

# openssl genrsa -des3 1024 -out server.key
Enter pass phrase:(任意のパスワード)
Verifying - Enter pass phrase:(任意のパスワード)

「-des3」は暗号化の方式に「トリプルDES」という方式を利用するという意味で、「1024」は1024バイトの鍵を作成するという意味です。
 暗号化方式は他にもいろいろあるようですが、今のところ、全てのSSL(TLS)のバージョンでトリプルDESが利用出来るので、トリプルDESを指定することが多いみたいです。

2.5. 秘密鍵のパスワードを解除(オプション)

 前の手順でパスワードを設定したばかりですが、このままだとApacheを再起動するたびにパスワードの入力を求められることになります。これだとApacheの自動起動が難しくなるので、以下のようにして秘密鍵のパスワードを解除してしまうこともできます。

# openssl rsa -in server.key -out server.key
Enter pass phrase for server.key:(秘密鍵のパスワード)

3. CSR(証明書署名要求)の作成

 オレオレ証明書の場合、必ずしもCSRファイルを作成する必要はないですし、KEYファイルからいきなりCRTファイル(証明書)を出力することも出来ます。
 でも、ここでCSRを作っておくとCRTを更新する際にちょっとだけ手間が省けます(CRTは期限があり、定期的に更新する必要があります)。また、CAを利用する場合もCSRが必要となるので(CSRをCAに送って、CAにCRTを発行してもらう)、ここでCSRを作成しておくと後の管理がちょっとだけ楽になるかもしれません。

 CSRファイルを作成するには以下のように入力します。

# openssl req -new -key server.key -out server.csr

 作成の途中でいくつかの入力項目が現れます。項目は以下の通り。

Country Name (2 letter code) [GB]:JP (2文字の国名)
State or Province Name (full name) [Berkshire]:Niigata (都市名)
Locality Name (eg, city) [Newbury]:Nagaoka (都市名)
Organization Name (eg, company) [My Company Ltd]:icoro (組織名)
Organizational Unit Name (eg, section) []:section 9 (部署名)
Common Name (eg, your name or your server's hostname) []:www.icoro.com (サーバのFQDN)
Email Address []:info@icoro.com (メルアド)

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:(証明書を破棄する時に必要になるパスワード)
An optional company name []:(別の組織名の入力)

 Common Nameは「あなたの名前かサーバのホスト名」とありますが、普通はサーバのFQDN(Fully Qualified Domain Name; 完全修飾ドメイン名。サイトに接続するときのURLとほぼ同じ)を入力するみたいです。
 また、最後に出て来る(かもしれない)2つの ‘extra’ attributes は空欄にしておいてくれ、というCAが多いので、特に用事がなければ空欄のままにしておくのがベターだと思います。

4. CRT(証明書)の発行

 以下のように入力して、CRTファイル(証明書)の発行します。

# openssl x509 -req -days 365 -signkey server.key -in server.csr -out server.crt

 「-days」で証明書の有効期限を変えることが出来ます。たとえば、「-days 3650」にすれば、有効期限は3650日、つまり約10年となります。デフォルトでは365日みたいです。

 このコマンドはCRTファイルを更新する際も使用します。更新する際、CSRファイルがあれば(かつ、項目に変更がなければ)、再度、国名やら組織名やらを入力する手間がなくなるので、ちょっとだけ楽になります。

5. Apacheの設定

 作成した秘密鍵とCRTをApacheに設定します。CentOS5、Apache2.xの場合、/etc/httpd/conf.d/ssl.conf の中にある SSLCertificateFile と SSLCertificateKeyFile の値を以下のように変更します(鍵と証明書を別の場所に置いている場合はその場所に変更します)。

SSLCertificateFile /etc/httpd/conf/ssl/server.crt
SSLCertificateKeyFile /etc/httpd/conf/ssl/server.key

6. Apacheの再起動

# service httpd restart

certwatchで証明書の期限を通知してもらう

 CRTには遅かれ早かれ期限がやってくるわけですが、その期限がいつなのか覚えておくのは難しいですし(年単位のスパンならなおさら)、かといって、ちょいちょい期限をチェックするというのもなにかバカらしいです。

 「certwatch」というユーティリティを使えば、期限が近づくと(デフォルトだと30日前に)お知らせしてくれます。これは便利ですね。
 「certwatch」を使うには、「crypto-utils」というパッケージをインストールします。

# yum install crypto-utils

 これだけです。
 期限が近づくと以下のようなメールがルート宛てに送られてきます。

################# SSL Certificate Warning ################

Certificate for hostname 'www.icoro.com', in file:
/etc/httpd/conf/ssl/server.crt

The certificate needs to be renewed; this can be done
using the 'genkey' program.

Browsers will not be able to correctly connect to this
web site using SSL until the certificate is renewed.

##########################################################
Generated by certwatch(1)

参考

Network Security with OpenSSL: Cryptography for Secure Communications (English Edition)

  • メーカー:O'Reilly Media
  • カテゴリ:Kindle版
  • 発売日:2009/02/09

関連する記事