2009年7月4日土曜日

OpenSSL で自己署名証明書を作成する

SSL を使って暗号化通信をするためには,公開鍵証明書が必要になる.(なんで公開鍵証明書が必要かとか,SSL の仕組みの話については,参考文献を参照してね.僕がちゃんとした解説をする自信がないのでw)なので,SSL を使いたいときは,証明書を準備する必要がある.知ってる人もいると思うけど,この証明書ってのがタダじゃない.有名な VeriSign で発行してもらうと,一番安いものでも85,050円/年もするのだ.

自宅サーバで SSL を使いたいだけのために,こんな大金は支払えないので,自己署名証明書というものを作成する.俗に,オレオレ証明書ともいうらしい.そのニュアンス通り,「僕がこの人間は僕だと言うから,この人間は僕です.」という論理になるような証明書のこと.(VeriSign の証明書なら,「VeriSign がこのサーバがサーバ A だと言うから,このサーバはサーバ A です.」というようになる.)本来は,どっかに証明してもらわなければならないんだけど,自宅サーバの SMTP や IMAP に接続するときに SSL を使用したいということなら,自己署名証明書でもいいよねということで,今回のエントリの内容になるわけ.

FreeBSD 7.1-RELEASE での自己署名証明書のつくりかたはこんなかんじ.UNIX 系 OS ならどれでも同じ.

1. ディレクトリ作成&移動
証明書を置くディレクトリを適当な場所に作成し,そのディレクトリに移動する.
# mkdir /usr/local/certs
# cd /usr/local/certs

2. マスク設定
作成される証明書が,ほかのユーザから読まれないようにマスクを設定する.つまり,所有者だけが読める (-rw-------) ファイルが生成されるようにする.
# umask 066

3. 秘密鍵と証明書を作成
openssl req コマンドで新しく (new) 1年間 (-days 365) 有効な X509 証明書 (x509) を暗号化しないで (nodes) 作成する.秘密鍵が key.pem で,証明書が cert.pem になる.いくつか質問事項(下記のは,Mac OS X 上でやったものを貼付けたのだったりするw)に答えると作成される.Common Name の項目が重要で,ここにサーバのホスト名 (FQDN) を入力する.例えば,この証明書をメールサーバで使用すると仮定し,メールクライアントの設定で,IMAP サーバの項目に lucifer.legna.org と入力するなら,Common Name も lucifer.legna.org にしなければならない.
$ openssl req -new -days 365 -x509 -nodes -keyout key.pem -out cert.pem
Generating a 1024 bit RSA private key
.................................................++++++
........................++++++
writing new private key to 'key.pem'
-----
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) [AU]:JP
State or Province Name (full name) [Some-State]:Hokkaido
Locality Name (eg, city) []:Sapporo
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Legna
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:lucifer.legna.org
Email Address []:root@legna.org

自己署名証明書はこんなかんじで簡単につくれる.証明書の内容を表示するには,次のコマンドを入力すればいい.textオプションは,テキストで表示するオプションで,証明書の詳細まですべて表示してくれる.noout オプションは,証明書を出力しないというオプションだ.証明書を出力してもそのままじゃ人間には理解できないからね.(cat などで中身を表示してみればわかるが,ASCII 文字がめちゃくちゃに並んでいるようにしか見えない.)
$ openssl x509 -text -noout < cert.pem 
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
ea:56:42:a9:71:18:04:78
Signature Algorithm: sha1WithRSAEncryption
Issuer: C=JP, ST=Hokkaido, L=Sapporo, O=Legna, CN=lucifer.legna.org/emailAddress=root@legna.org
Validity
Not Before: Jul 3 14:16:18 2009 GMT
Not After : Jul 3 14:16:18 2010 GMT
Subject: C=JP, ST=Hokkaido, L=Sapporo, O=Legna, CN=lucifer.legna.org/emailAddress=root@legna.org
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (1024 bit)
Modulus (1024 bit):
00:ba:eb:0a:6d:b7:43:26:50:eb:c9:4a:91:5b:a3:
8f:ec:3c:11:5d:93:59:7d:3d:4a:b2:af:6f:cf:26:
84:7c:b9:fa:43:53:98:f5:48:70:d5:18:97:87:f1:
14:bd:b1:e2:26:16:8a:6c:d2:11:f2:3a:c5:81:19:
3f:ed:72:0d:ee:7d:69:b8:7c:9d:8b:53:e1:f4:43:
4e:75:0d:2e:d6:a7:1b:2f:8c:27:6a:e0:f6:cc:48:
94:10:bf:5c:26:ff:bd:6b:a5:a0:e8:eb:01:0f:c0:
04:09:9e:03:09:7c:b8:25:82:9d:49:25:a7:83:d4:
35:e2:15:4d:bc:52:c3:db:8d
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
CB:00:73:E3:4D:59:10:14:B7:EF:35:A2:E6:78:55:84:B4:7E:A3:55
X509v3 Authority Key Identifier:
keyid:CB:00:73:E3:4D:59:10:14:B7:EF:35:A2:E6:78:55:84:B4:7E:A3:55
DirName:/C=JP/ST=Hokkaido/L=Sapporo/O=Legna/CN=lucifer.legna.org/emailAddress=root@legna.org
serial:EA:56:42:A9:71:18:04:78

X509v3 Basic Constraints:
CA:TRUE
Signature Algorithm: sha1WithRSAEncryption
5b:b6:d5:42:9c:e8:23:1e:0c:e4:ec:f6:13:02:0d:cc:09:d9:
90:68:ee:7e:f6:5d:75:f1:1c:28:5d:91:de:46:d0:7c:46:30:
9d:65:fa:b2:01:04:12:5c:a5:6d:44:c9:2f:3f:b7:1e:a0:d4:
5c:52:4a:e5:d5:0c:bb:3f:56:e3:2d:89:27:ef:77:22:0c:ec:
96:94:0b:53:69:b8:14:75:d5:b1:08:5f:a2:86:44:60:f6:6b:
b4:e7:dd:12:32:2a:a3:ab:51:97:c4:45:e5:8d:96:e7:e1:ad:
10:cd:13:7e:38:06:16:5d:34:db:e7:95:76:34:d9:10:e8:e2:
32:1a

とりあえず,これがあれば SSL を使用して暗号化通信ができるようになる.さらに,Namecheap で RapidSSL という格安のサーバ証明書を取得する方法について,近々エントリを書く予定.価格も10.95ドル/年(2009年7月4日現在の為替で,1050円くらい!)と出してもいい値段だし,きちんとした機関が証明してくれるので,ブラウザやメールクライアントで SSL で接続しても,証明書が認証できないから危険かもしれないなんて警告はでなくなる♪お楽しみに〜.

参考文献:
Wikipedia Secure Sockets Layer

0 件のコメント: