火曜日, 5月 24, 2005

Debian GNU/Linux でSSLを利用する

SSLの設定です。
といっても openssl + Apache の場合ですのであしからず。

まずは乱数の種を作ります。
コンピュータでは完全な乱数(random)を作るのはなかなか難しいんですよね。それで乱数系列と同じ特性をもつ疑似乱数(pseudo-random)系列を生成するアルゴリズム(random number generator)が用意されてます。
ただ、アルゴリズムなので入力が同じなら当然結果も同じです。初期値を変えないと毎回同じ疑似乱数列が出力されてしまうわけですね。
そこで、種(seed)を用意するわけです。これは基本的になんでもいいんですが、ここでは/usr/binにあるファイル名を使います。
------------------------------------------------------
# openssl md5 /usr/bin/* > rand.dat
------------------------------------------------------
これで/usr/bin以下のファイル名とそのハッシュ値がrand.datに書き込まれます。

これを使って乱数を発生させて秘密鍵を作ります。
------------------------------------------------------
# openssl genrsa -rand rand.dat -des3 1024 > key.pem
------------------------------------------------------
"1024"は鍵の長さです。"-des3"は秘密鍵を暗号化する方法にTriple-DESを使うという意味です。

今度は秘密鍵を使ってCSR(署名要求 - Certificate Signing Request -)を作成します。しつこいですね。一度で全部作れよ!とか思います。ベルトコンベアなイメージです。
------------------------------------------------------
# openssl req -new -key key.pem -out csr.pem
------------------------------------------------------
国名(JP)、都道府県(Tokyo)、市区町村(Taito)、会社(*** Ltd.)、部署(system-1)を入力します。common nameにはSSLを使うドメインを入力します。あとの3つは何も入れなくてもいいです。
括弧の中は僕の使ったものです。部署は数字を入れておくと、あとでWebサーバを分散させるときに便利です。

あと、common nameにはワイルドカードが使える場合があります。
*.kumicho.net
のようなcommon nameにしておくとa.kumicho.netでもb.kumicho.netでも使える、といった感じです。便利ですね。
ただ、クライアントによっては「"*"と"a"が一致しない」なんて文句をいう場合があります。LDAPのクライアントはそう言ってました。IEやFirefoxは大丈夫みたいです。
あと、CAcertでは文句を言われなかったけど、Verisignなんかもそうなのかは知りません。

といった感じで作ったCSRを認証局に送れば証明書が送られてきます。証明書をcert.pemなんて名前にして保存。
Apacheの設定ファイルに
-------- sites-available/blogger --------------------
SSLCertificateKeyFile ssl/key.pem
SSLCertificateFile ssl/cert.pem
-----------------------------------------------------
なんて書けば使えるようになります。
起動時のパスフレーズの入力を省略したい方はこちら

ちなみに複数の証明書を使いたい場合には名前ベースではなく、IPベースのバーチャルホストを使わないといけません。
ApacheがSSLを使って接続するためには、どの証明書を使うか知るために名前を知らないといけない。けれど、そのHTTPリクエストの前にSSLでの接続が成立していなくてはいけない、なんてことが起こるからです。卵が先か、ニワトリが先か。。。

0 件のコメント: