Schi Heil と叫ぶために

hiroakiuno's blog

Debian GNU/Linux 4.0 etch に今さら Apache 1.3 を入れて SSL でアクセスできるようにするまで

仕事で新たなチームができたので WWW & 共有ファイルサーバーが欲しいねという依頼があり、何年かぶりに Debian でサーバーを構築している。イントラで使うサーバーなのだが Web や Samba の認証に Windows ドメインのアカウントが使えるといいねーということで、未だに自分の中で理解が深まらない Windows ネットワークの勉強になるかもしれないと手を上げてみた。

ただ、蓋を開けてみると

  • それに必要なアプリケーションが SSL 通信を求めるのだが、そのくせ Apache 2.2 系に対応していない
  • さすがに Apache 2.0 系には対応しているとのことだが、etch の正式パッケージには 2.2 系に移行しており Apache 2.0系が見当たらない

という状況。Sarge の apt-line を追加したりソースからコンパイルしたりで強引に 2.0 系を入れるか、それとも古いけど 1.3 系を用いるかしばし考えた後、やはり apt でわけが分からなくのが嫌だったのでしぶしぶ Apache 1.3 を用いることにした。

以下は Debian GNU/Linux 4.0 etch に今さら Apache 1.3 を入れて SSL でアクセスできるようにするまでの作業ログで、ググればなんぼでも見つかる情報だろうが、SSL っていまいち良く分かっていなかったので 自分の頭の整理をかねて整理しておく。Apache の他にも色々整理できたら公開してみようと思う。

準備

名残惜しいが既に入れていた Apache 2.2 にはさよならする。

# aptitude purge apache2

代わりに Apache 1.3 と mod-ssl をインストール。

# aptitude install apache
# aptitude install libapache-mod-ssl
# aptitude install libapache-mod-ssl-doc

サーバー証明書の申請とインストール

ところで SSL 通信というのは、実際の通信の暗号化には共通鍵(クライアントがランダムに発生させるもの)を用いているのだが、通信の最初にその共通鍵を安全に受け渡すために公開鍵暗号(すなわち公開鍵と秘密鍵)が用いられるというものである。その際、サーバーは自身がまともな存在であることを示すための証明書を添える。その証明書はあらかじめサーバーに組み込んでおくもので、以下はその証明書をどうやって作成しサーバーに組み込むのかという話である。

証明書作成までの流れは以下のとおり。証明書は正式には CA 局に申請するものだが、ローカルな用途では自分で CA 局も兼ねてしまう自作自演のパターンもある。

  1. 秘密鍵の作成
  2. CSR (認証機関に証明書を発行してもらうための申請書) の作成
  3. CA局に証明書を発行してもらいインストール

詳しくて分かりやすい解説がこちらにあるので、ここでは CSR というのが Certificate Signing Request の略で「1 の秘密鍵に対応する公開鍵 + その他情報」をまとめた CA 局ごとに異なるフォーマットであることを補足しておく。私の場合は Web から申請した。

こちらの解説では openssl を用いて順番に作成する方法を説明しているが、Debian には mod-ssl-makecert というパッケージがあり、これを利用するとこれらの設定が一気に行える。ちなみにmod-ssl-makecert は libapache-mod-ssl パッケージに含まれており、Apapce 2.2系の apache2-ssl-certificate に相当する。mod-ssl-makecert を用いると上記はそれぞれ

  1. /etc/apache/ssl.key/server.key(秘密鍵) の作成
  2. /etc/apache/ssl.csr/server.csr(申請書に添える公開鍵) の作成
  3. /etc/apache/ssl.crt/server.crt(証明書) のインストール

と言い換えられる。

# mod-ssl-makecert

聞かれた質問に答えるだけで、1 から 3 が同時に作成されるが、ここでのポイントは server.csr は server.key を元に作られ、server.crt は sever.key を元に作られるという関係。基本的に、

の通りだが(後者は中国語のページだがほとんど英語だし設定画面そのもの)、一点だけ自分が迷った次の質問について補足。

What type of certificate do you want to create?

  1. dummy     (dummy self-signed Snake Oil cert)
  2. test      (test cert signed by Snake Oil CA)
  3. custom    (custom cert signed by own CA)
  4. existing  (existing cert)

Use  dummy     when you are a vendor package maintainer,
     test      when you are an admin but want to do tests only,
     custom    when you are an admin willing to run a real server
     existing  when you are an admin who upgrades a server.

your choice: 

実は 1-4 の違いが十分に理解できていない。特に 2 と 4 の違いが分かってない。CA 局に証明書を発行してもらう場合は、server.crt は CA 局が作成するものに置き換えるので別に 2.test でも同じ話なのではないかという疑問。ちなみに 3. custom を選択すると Country Name などを入力する質問が2回繰り返される。1回目が request for CA で、2回目が request for server なので、つまり自作自演のやり方。一方、2.test の場合は request for CA が省略される。ただ server.crt は一応作成されその中身が www.snakeoil.dom になっている。www.snakeoil.dom とは実在しないダミードメインらしい。こちら を参考のこと。

いずれにしても server.csr を元にした CSR を CA 局に送ると正式な証明書が送られてくるので、それを /etc/apache/ssl.crt/server.crt として保存する。

Apache の設定

mod-ssl.conf と vhost.conf を /etc/apache/conf.d にコピーする。

# cp /usr/share/doc/libapache-mod-ssl-doc/examples/mod-ssl.conf /etc/apache/conf.d
# gzip -d /usr/share/doc/libapache-mod-ssl-doc/examples/vhost.conf.gz
# cp /usr/share/doc/libapache-mod-ssl-doc/examples/vhost.conf /etc/apache/conf.d

あとは vhost.conf の SSLCertificateFile と SSLCertificateKeyFile の行をそれぞれ

SSLCertificateFile /etc/apache/ssl.crt/server.crt
SSLCertificateKeyFile /etc/apache/ssl.key/server.key

とするだけ。conf.d に置いたスクリプトは自動的に読み込まれるので特別インクルードする必要はない(http.conf の最後の方にInclude /etc/apache/conf.d とある)。

Apache の再起動

実はここが一番はまった。何回 /etc/init.d/apache reload や /etc/init.d/apache restart を実行しても、ブラウザから見える証明書が www.snakeoil.dom のままでいっこうに正しいものにならなかった。どうやら

/etc/init.d/apache stop
/etc/init.d/apache start

としないと有効にならないらしい(参照)。勘弁してください。

以上で、https:/localhost/ にめでたく正しい証明書付きでアクセスできる。