Apache SSL設定あれこれ | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

Webサイトのセキュリティを考慮するなら、SSLにて通信を行うように設定するようにするのが定石です。

特に個人情報を入力するフォームなどでは、SSLにて保護しておかないとその情報がそのままネットワーク上に流れてしまいます。


SSLの設定を行う方法ですが、大きく2つの流れがあります。

1つは、信頼できる認証局から発行される証明書をWebサーバーに設定する方法。

もう1つは、独自の認証局を立てて証明書を独自に発行する方法。

同然、後者は信頼できないものなので、SSLにて通信が暗号化できたからといってユーザーにとって安心できる通信が確保できているわけではありません。

幾ら通信が暗号化できているからといって、その暗号化通信を証明・認証している機関がどこのものかわからない怪しいものであれば、ユーザーは不安に思います。


前者の使い道は、サイト自体がセキュアである必要があり、インターネット上に公開し不特定多数人に利用してもらう場合など、後者の使い道は、前者のテスト用としてサイトを構築する過程で利用したり、イントラネットで利用されるサイトで(一応)セキュアを確保しておくために利用したりします。


まず初めに、信頼できる認証局から発行される証明書をインストールする一般的な手順を解説します。

信頼できる認証局から証明書を発行してもらう場合は、有料となりその上、証明書自体に有効期間が存在します。

値段は、その認証局により異なってきますし、有効期限も1年のみのところもあれば2年などある程度長い有効期限で取得できるものもあります。

また、SSLの暗号化自体が万が一破られた場合や、暗号化の鍵が改ざんされたりした場合などに、保障してくれるサービスを提供してるところもあります。

(実際、破られる事はまず無いと思いますのであまり考慮しなくても良いと思いますが)


証明書の取得・設定までの流れは大まかに下記の通りです。


1. 署名リクエスト(CSR)の作成

2. CSRを元に証明書を作成を要求

3. 証明書が発行

4. 証明書をWebサーバーに設定


Aapcheを利用した場合の、導入方法を解説します。

導入の際には、各認証局ごとに導入手順の詳細が解説されているはずですのでそちらをご確認ください。



SSL導入手順


1. 署名リクエスト(CSR)の作成


CSRとは、認証局に提出する未署名の証明書です。未署名というのは、その証明書が正規のものでは無いということです。認証局はこのCSRに対して、正規のものと認めて署名を行います。


$ /usr/local/bin/openssl req -new > ./my_server.csr

Generating a 1024 bit RSA private key
.++++++
............................++++++
writing new private key to 'privkey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:   ・・・ パスフレーズを入力
-----
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]:Tokyo  ・・・ 都市
Locality Name (eg, city) [Newbury]:Shibuyaku       ・・・ 市町村
Organization Name (eg, company) [My Company Ltd]:hogehoge    ・・・ 企業名
Organizational Unit Name (eg, section) []:Information System   ・・・ 部署名
Common Name (eg, your name or your server's hostname) []:www.hogehoge.com ・・・ FQDN
Email Address []:webserver@hogehoge.com               ・・・ E-Mail
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:                    ・・・ リターンキー
An optional company name []:                   ・・・ リターンキー

Opensslのパスは、各々インストールされているパスを指定してください。

不明な場合は、


$ which openssl

とすれば、パスが返ってくるはずです。

返って来なければOpensslがインストールされていない可能性がありますので、まずOpensslをインストールしましょう。


ここで行っていることは、my_server.csrというCSRファイルを作成しています。

その際に、証明書を設定する環境の情報を入力しています。

最初に入力するパスフレーズは、要するにパスワードの事です。

秘密鍵を保護するためで、この設定したパスフレーズ無しで秘密鍵を利用する事はできません。


CSRを作成した際に、作成コマンドを実行したディレクトリ以下に、「privkey.pem」というファイルが作成されます。

これは、作成したサーバー上の秘密鍵になりますので、証明書が発行されるまで上書きしたり、なくしてしまわないように注意しましょう。

(特に同じコマンドを同一ディレクトリ上で2度実行しないように注意しましょう)

作成したCSRと秘密鍵は2つで1つです。

異なるCSRから同じ秘密鍵を作る事はできません。

これをなくすと、最初から申請のやり直しになってしまいます。



2. CSRを元に証明書を作成を要求


これは、認証局ごとに異なりますが、大体はWeb上で申請します。

1.で作成したCSRの内容を、認証局に送ります。

(Web上のTEXTAREAに貼り付けて申請したり)


続いて、申請するための書類などを記入し認証局に郵送したりします。

もちろん、代金の入金処理なども必要になります。



3. 証明書が発行


全ての事務処理が完了すると、証明書が発行されます。

発行通知はメールで、証明書自体の発行は、Webからダウンロードできるパターンが多いようです。

ここで、ダウンロードした証明書を「hogehoge.crt」として設定するWebサーバーにFTPなどを使ってアップロードします。



4. 証明書をWebサーバーに設定


1. でCSRを作成する際にできた秘密鍵「privkey.pem」と3.でダウンロードした証明書(hogehoge.crt)をWebサーバーに設定します。

1.で作成したCSR(my_server.csr)は必要ありません。このCSRはあくまで未署名のもので、最終的に認証局で署名したものが3.で証明書として発行されているからです。


privkey.pemとhogehoge.crtを適当な場所に保存します。


例)

# mv privkey /etc/httpd/conf/ssl.key/
# mv hogehoge.crt /etc/httpd/conf/ssl.crt/

次に、保存した秘密鍵、証明書をApacheに設定します。

設定ファイル(1系ならhttpd.conf、2系ならssl.conf)を開き該当箇所を編集します。


# 認証局から発行された証明書をセット
SSLCertificateFile /etc/httpd/conf/ssl.crt/hogehoge.crt

# 秘密鍵をセット
SSLCertificateKeyFile /etc/httpd/conf/ssl.key/prikey.pem

# 場合によっては、中間証明書をセットする必要があります。
SSLCertificateChainFile /etc/httpd/conf/ssl.crt/ca-bundle.crt

※ 中間証明書は、証明書が発行された際に一緒にダウンロードできます。

  これは認証局によっては必要ない場合がありますので、その認証局のサポートのページで確認してください。


最後にApacheを再起動します。


例)

# /etc/init.d/httpd restart

起動時に、パスフレーズを入力するように求められますのでCSRを作成した際に入力したパスフレーズを入力します。

毎回起動時にパスフレーズを入力するのが手間だったり、OS起動時にこのままだと自動起動しないのでパスフレーズを自動的にApacheに渡してあげる方法を紹介します。

手順はシンプルで、パスフレーズを出力するシェルスクリプトを作成し、Apacheがそれを実行するようにセットするだけです。

まず、パスフレーズを出力するシェルスクリプトを作成します。


# vi pp.sh

------- pp.sh ------
#!/bin/sh
echo "XXXXXX";
-------------------

※ 「XXXXXX」は、パスフレーズです。


ファイル編集後は、実行権限を付与しておきます。


# chmod 700 pp.sh

次に、適当な場所に保存します。


# mv pp.sh /etc/httpd/conf/ssl.private/

次に、Apacheに上記のシェルスクリプトを起動時に実行するように設定します。

設定ファイル(1系ならhttpd.conf、2系ならssl.conf)を開き該当箇所を編集します。


SSLPassPhraseDialog exec:/etc/httpd/conf/ssl.private/pp.sh

編集後は、Apacheを再起動しパスフレーズが求められない事を確認します。


設定した証明書が正常に機能しているかどうかは、Webサイトにアクセスすれば一目で分かります。

信頼できる認証局により証明書が発行されていれば、そのままアクセスできますがそうで無い場合は、警告画面が表示されます。


□ IEの場合


SSLアラートIE


□ FireFoxの場合


SSLアラートFireFox


きちんと証明書を確認する方法もあります。

IEやFireFoxの場合は、SSLで保護されたサイトにアクセスした場合、右下に鍵のマークが表示されるのでそれをダブルクリックすると証明書の状態が表示されます。


□ IEの場合


証明書確認IE


□ FireFoxの場合



証明書確認FireFox