オレオレ証明書設定手順

毎回ググっているので、メモっておく。
参考にしたのは、http://www.stackasterisk.jp/tech/systemConstruction/apache09_03.jsp#3_2
環境は CentOS 5.1 だったと思う。あと Apache2

秘密鍵作成

/etc/pki/tls/private 以下にサーバ用の秘密鍵作成。

[root@gentoo private]# openssl genrsa -des3 -out server.key 1024
Generating RSA private key, 1024 bit long modulus
.....++++++
...++++++
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:

証明書作成

/etc/pki/tls/certs 以下に証明書を作成

[root@gentoo certs]# openssl req -new -x509 -days 3560 -key ../private/server.key -out server.crt
Enter pass phrase for ../private/server.key:
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]:Unknown Locality Name (eg, city) [Newbury]:Unknown Organization Name (eg, company) [My Company Ltd]:Unknown Organizational Unit Name (eg, section) :Unknown Common Name (eg, your name or your server's hostname) :サーバのドメイン Email Address []:Unknown
[root@gentoo certs]#

秘密鍵パスフレーズを解除

Apache 起動時のパスフレーズ入力を不要とするために、/etc/pki/tls/private/server.key のパスフレーズを解除する。
ついでに、パーミッションを変更しておく。いまのところ 600 で動いているっぽい。*1

[root@gentoo private]# openssl rsa -in server.key -out server.key 
Enter pass phrase for server.key:
writing RSA key
[root@gentoo private]# chmod go-rwx server.key
[root@gentoo private]#

複数ホスト/ドメインへの対応

名前ベースのバーチャルホストとSSLを組み合わせたかったのです、普通にやったら出来ないようです。
SSL 通信の開始時点では、Apache はクライアントがどのホストに接続しようとしているのかが判別できません。このため1番目のVirtualHostディレクティブの内容に従い、サーバ証明書を返すらしいです。

この問題を解決する方法として、

  • ワイルドカードを使用する
  • 別名を定義する
  • クライアントからSSL通信開始時にホスト名を送ってもらう

があるようです。

以下のサイトを参考に、別名を定義してバーチャルホスト対応してみたいと思います。
http://websec-memo.blogspot.com/2007/07/virtualhostssl.html
http://d.hatena.ne.jp/defiant/20070919#1190188122

openssl.conf のどこに subjectAltName を追加したらよいのか分からなかったので片っ端から試しました。どうやら、v3_ca セクションに追加すれば署名後の証明書に含まれるみたいです。

[ v3_ca ]
subjectAltName = DNS:*.foo.bar,DNS:*.hoge.fugu

CN に記述した値も subjectAltName に書いたほうが無難みたいです。

各ファイルについて

  • 秘密鍵(server.key)
    • サーバに対応する秘密鍵
    • Apache に読み込ませる
    • x509証明書発行要求の作成に使用する
  • x509証明書発行要求(server.csr)
    • 証明書の元になる情報
    • これに署名することで、証明書が得られる
  • 証明書(server.crt)
    • サーバの証明書
    • Apache に読み込ませる
    • クライアントに送信される

*1:オーナとグループ、root なのになんで Apache から読めてるんだろう? Apache が root 権限で動作してる?(汗