いまさらですが、デスクトップで作業ログを取っているhiki用のapacheサーバのSSL化を試みてみました。
参考にしたドキュメント
具体的にピンポイントで参考になったところはないのですが、以下のようなサイトを参考にしました。
- l-w-i.net プライベート認証局(CA)を構築して証明書の発行を行なう
- help.ubuntu.com HTTPD - Apache2 Web Server
- help.ubuntu.com forumserverapache2SSL
はじめに
opensslを使う点ではどのドキュメントも同じなのですが、その中での手順は断定的に書かれているものも少なくありません。 しかし実際には環境に依存しているため、そのままの手順では使えないのではないかと感じました。 またドキュメントが書かれた時期によっても、作法に違いがあるようです。
今回はCA.plを使用し、できるだけ環境に依存しないように心がけましたが、徹底できてはいないと思います。 しかし、/etc/ssl/openssl.cnfファイルはデフォルトのままにして書き換えていません。
CA局の準備
この作業では次のファイルを準備する事が目標です。
- demoCA/cacert.pem
- demoCA/private/cakey.pem
$ /usr/lib/ssl/misc/CA.pl -newca
内部で実行されているopensslコマンド
CA.plスクリプトの内部ではOPENSSL環境変数でopensslコマンドを指定する事が可能です。通常は複数バージョンがインストールされた環境などを意識していると思うのですが、今回はこれを流用してみようと思います。
$ env OPENSSL="echo $ openssl" /usr/lib/ssl/misc/CA.pl -newca
$ openssl req -new -keyout ./demoCA/private/cakey.pem -out ./demoCA/careq.pem
$ openssl ca -create_serial -out ./demoCA/cacert.pem -days 1095 -batch -keyfile ./demoCA/private/cakey.pem -selfsign -extensions v3_ca -infiles ./demoCA/careq.pem
CA局の期限のデフォルト(3年)を延長するために、/etc/ssl/openssl.cnfファイルを書き換えるようアドバイスしているサイトもあります。 直接コマンドを打てばその必要はなく、-days 3650のように適当な日数を指定する事で可能です。
また作業の最後で間違ったPEMパスフレーズを入力するなどして、CA.pl -newcaの実行に失敗した場合には、既にdemoCAディレクトリが存在するため、やり直しができません。そんな場合でも、最後の1行を実行することで準備したcareq.pemを活かすことができます。
Apacheサーバ用のSSL鍵ファイルの準備
今回の作業では次のファイルを作成します。 念のためファイル名は任意なので、適当に読み替えても問題ありません。
- server_key.pem
- server_cert.pem
前準備:CA.plコマンドの実行
作業は引き続き、"demoCA"ディレクトリがみえるディレクトリで行ないます。
$ /usr/lib/ssl/misc/CA.pl -newreq $ /usr/lib/ssl/misc/CA.pl -sign
一連の作業ではCA局と似たような情報を入力しますが、common nameをサーバのFQDNにする以外は基本的に何を入力しても問題にはなりません。CA局と同じように入力しても良いですし、まったく違うドメインの情報でも良いです。
具体的な作業時の注意点は次のようなところでしょうか。
- "-newreq"時に入力するPEMキーのパスフレーズはなんでも良いですが、覚えておいてください。
- "-sign"時の最後に入力を求められるPEMキーのパスフレーズは、最初に作成したCA局のものです。
この作業を終えた段階では、まだ目的のファイルはありません。 次でサーバの秘密鍵"newkey.pem"に設定されているパスフレーズがなくても、秘密鍵の情報がみえるようにします。
ファイルの作成
$ openssl rsa < newkey.pem > server_key.pem
ここで入力するパスフレーズは、先ほど「覚えておいて」と書いた"CA.pl -newreq"実行時に入力したものです。
サーバが起動時に秘密鍵を読み込めるようにserver_key.pemにはパスフレーズの設定されていませんから、必要のない人には公開しないようにします。もともと秘密鍵はそういうものですけどね。
次にserver_cert.pemを準備します。これはそのまま。
$ cp newcert.pem server_cert.pem
ここまでの作業で2つの鍵ファイルが準備できたので、このファイルをapache2サーバに組み込んでいきます。
内部でのopensslの実行
先程と同じように、CA.plの内部で発行されたopensslコマンドを確認する事ができます。
$ openssl req -new -keyout newkey.pem -out newreq.pem -days 365
Request is in newreq.pem, private key is in newkey.pem
$ openssl ca -policy policy_anything -out newcert.pem -infiles newreq.pem
Signed certificate is in newcert.pem
この2つの出力から、newreq.pem, newkey.pem, newcert.pemの3つのファイルが作成される事がわかります。 またサーバの秘密鍵の寿命を延したければ、/etc/ssl/openssl.cnfを書き換えてもよいですが、コマンドラインで-daysに続いて任意の日数を設定する事も可能です。
ただし、ここでcakey.pemを指定せずにCSRファイルに署名されるのは、/etc/ssl/openssl.cnfファイルにprivate_key = $dir/private/cakey.pem
という一行が入っているからです。
apache2用設定ファイルの編集
mod_ssl自体はapache2.2-commonに含まれているので、apache2サーバが起動していれば追加の作業は限られています。
mod_sslの有効化
直接シンボリックリンクを張っても良いのですが、コマンドを使ってみます。
$ sudo a2enmod ssl
念のためシンボリックリンクファイルが存在する事を確認しておきます。
$ ls -al /etc/apache2/mods-enabled/ssl.*
lrwxrwxrwx 1 root root 26 2010-02-13 17:44 /etc/apache2/mods-enabled/ssl.conf -> ../mods-available/ssl.conf
lrwxrwxrwx 1 root root 26 2010-02-13 17:44 /etc/apache2/mods-enabled/ssl.load -> ../mods-available/ssl.load
設定ファイルの配置と準備
mod_ssl自体は有効になって、ポート443にSSL接続する事は可能になりました。 次はどんなコンテンツを返せば良いのかといった設定する必要があります。
とりあえず最低限で考えて、デフォルトの443用設定を次のようにしました。
NameVirtualHost *:443
<virtualhost *:443>
ServerAdmin webmaster@example.org
SSLEngine On
SSLCipherSuite RSA:!EXP:!NULL:+HIGH:-MEDIUM:-LOW
SSLCertificateFile /etc/apache2/server_cert.pem
SSLCertificateKeyFile /etc/apache2/server_key.pem
DocumentRoot /var/www/
<directory />
Options FollowSymLinks
AllowOverride None
</directory>
</virtualhost>
やはり同じようにコマンドで、/etc/apache2/sites-enabled/ディレクトリ以下にシンボリックリンクを作成します。
$ sudo a2ensite ssl
鍵ファイルの配置
設定ファイルに合せてファイルを配置します。
$ cp server_cert.pem /etc/apache2 $ cp server_key.pem /etc/apache2
また勝手にサーバを立てらてしまうかもしれませんからパーミッションにも気を配っておきましょう。
$ sudo chmod 400 /etc/apache2/server_*.pem
設定の反映
最終的にはapacheのプロセスをリスタートする事で、SSL接続が可能になります。
$ sudo /etc/init.d/apache2 restart
さいごに
今回は自分の環境を守る事を考えて、少ない手順でそれなりに動く作業手順を残す事を目的にしました。 ただし具体的なパラメータについては、common name以外は触れていません。
CA.plスクリプトを使ったサイトでは具体的にどんな値を入力するのか説明されていますし、内容自体には意味がないからです。とはいえ、できるだけ現実的な値を設定するのがお勧めです。
またsslファイルの中で設定しているSSLCipherSuiteパラメータの値については、それなりに議論があると思います。明示的に設定をしていてもデフォルトのパラメータのを書いたサイトが多いようでした。
サーバ側でクライアントを選択するような設定は良くないかもしれませんが、いまさらSSLv2はないですよね。それに自分が使う事を考えると、SSLv2で接続するクライアントやライブラリがあるかもしれないので、テストを兼ねて厳しい設定にしておきました。
CA.plに限らず、フレームワークを使う場合には、裏でどんなコマンドが発行されているのかを確認しておくのがお勧めです。
0 件のコメント:
コメントを投稿