手順としては以下のようになる。なるんです。
- 秘密鍵の生成
- CSR の作成
- 証明書の発行
ただ、何を言っているのかさっぱりわからねーぜ、というのが普通なので順を追って説明する。単純化のために中間 CA のことは省くよ。
理屈
先に概念を書いておく。実際の手順はしたのほうに。
インターネットの簡単な構造
大体こう。
[ユーザー] <-> [中継がいっぱい] <-> [サーバー]
サーバーと情報をやりとりするときには、だいたいプロバイダーや中継先が入る。
秘密鍵とはなにか
片方で鍵をかけるともう片方でしか開けられない、というふたつの鍵が存在する。 A でかけると B でだけあけることが、 B でかけると A でだけあけることが可能になる。
情報をやりとりしたいひとに片方を教えておいて、もう片方はまわりには秘密にしておくと、配達員さんに中身をみられないことにあたまのいいひとが気づいた。
向こうからなにか送ってもらうとき、こんな感じになる。
- 自分が教えた鍵で情報に鍵をかけてもらう
- 配達員さんに情報を配達してもらう
- 秘密にしておいた鍵で情報の鍵をあける
2 番で配達員さんは中をのぞくことができない。そういう鍵だからだ。
こっちからなにか送るときは全部逆だ。送りたい先のひとから教えてもらった鍵で情報に鍵をかける。
ここで秘密にしておく鍵、というのがそのまま秘密鍵だ。そしてまわりに教える鍵を公開鍵と呼ぶ。配達員さんはうえのほうで言ってた中継先にあたる。
サーバーが秘密鍵を持っている、つまり公開鍵を配ると何がうれしいのか、というとサーバーに情報を送ってもらうときに配達員さんには見られないことを保証できる。ネット上で買い物するときに住所やクレジットカード番号をサーバーだけに知らせることができる、というわけ。
ここらへんは「公開鍵暗号」というキーワードで調べるといろいろ出てくる。
サーバー証明書とはなにか
あるサーバーから配られた公開鍵が本当にそのサーバーのものなのかを見分ける必要がある。わるいひとが公開鍵をすりかえてしまうとわるいひとにだけ情報を見られてしまう。
ある公開鍵が本当に情報をやりとりしたいサーバーのものだと信頼できる証がサーバー証明書だ。
信頼というのが曲者で、端的に言うと信頼できるひとが「これは信頼できる !!」と言ったものはユーザーにとっても信頼できるだろうということになっている。
ここでいう「信頼できるひと」がどんなものかというと「私はひとを信頼するときにこういうことに気をつけていますし、私自身うそをつきません」ということを有限実行しているひとのこと。実際の世界ではこのひとを認証局という。
サーバー証明書には信頼できると言ったひとの名前が書かれている。そこでユーザーはサーバー証明書を受け取ると、その名前のひとが信頼できるかを確かめるのだが、実はユーザーはすでに「信頼できるひと」リストを持っている。このリストにサーバー証明書に書かれている名前があるかを調べる。こうすることでサーバーが信頼できるかを確かめている。
こういった考え方を「信頼モデル」と呼ぶ。
CSR とはなにか
さて、じゃあ自分のサーバーを信頼されるようにするにはどうするか。
「信頼できるひと」に頼むのが自然だ。だけどただ頼むだけじゃそのひとだって信頼できるかわからない。自分のサーバーについての書類の提出を求められる。
「書類」にはどこに住んでいるか、名前はなんというか、連絡先はどこか、やりとりする際の封の仕方などが書かれている。「信頼できるひと」はこの書類を見ていろいろ調べる ( らしい ) 。そしてそのひとの基準に合致したサーバーに対して信頼できる証を発行する。
ここでいう「書類」が CSR にあたる。 Certificate Signing Request の略。直訳だと証明書署名申し込みみたいな感じになる。 CSR を作って認証局に出すと、認証局がいろいろ調べたあとにサーバー証明書を発行してくれる、というながれ。
実践
Mac OS X Mavericks にデフォルトで入っている OpenSSL 0.9.8y を使う。
認証局を確認する
利用する認証局を確認する。
有名どころにたのむのであればその会社の指示に従って CSR まで作成、申し込みをする。
自分とこで認証局を作るのであれば以下で。
CSR を作る
まず秘密鍵から。
# generate random data
dd if=/dev/urandom of=urandom.dat count=1024 bs=1024
# generate AES 256 bits private key
openssl genrsa -aes256 -rand urandom.dat 2048 > server.key
# remove pass phrase from the private key
openssl rsa -in server.key -out server.key
server.key が秘密鍵。パスフレーズを外すのはサーバーデーモンの立ち上げを自動化する際にいちいち尋ねられると面倒だから。スーパーユーザーでないとサーバーデーモンを立ち上げたりできないのでまぁこれでも問題ないだろう。
次、 CSR 。
# create CSR for 10 years
openssl req -new -days 3650 -key server.key -out server.csr
rm urandom.dat
証明書に署名してもらう
ここまでできたら上で作った server.csr を認証局に送って署名してもらう。
自前でやる場合は以下のように。