自己署名証明書を作る
証明書は、鍵とセットで作る
前の回で読んだ証明書には公開鍵が入っていました。ということは、証明書を作るには先に鍵のペアが要ります。作る手順は2段構えです。
- 秘密鍵と公開鍵のペアを作る
- 公開鍵と名前をまとめて、署名を付けた証明書にする
正式な証明書を取るときは、2つ目を発行元にやってもらいます。今回は自分でやります。だから自己署名です。
1行で作る
手順は2段ですが、コマンドは1つにまとめられます。
openssl req -x509 -nodes -days 365 \
-newkey rsa:2048 \
-keyout /etc/ssl/private/mysite.key \
-out /etc/ssl/certs/mysite.crt \
-subj "/CN=mysite.local"指定の意味は次のとおりです。
req— 証明書を要求する形式を扱う道具-x509— 要求書ではなく、署名済みの証明書そのものを出す。これが自己署名にあたる-nodes— 秘密鍵にパスフレーズを付けない。付けると nginx の起動のたびに人が入力を求められる-days 365— 有効期間-newkey rsa:2048— 鍵のペアも同時に新しく作る-keyoutと-out— 秘密鍵と証明書の置き場所-subj— 対話で聞かれる項目をその場で渡す
-subj を省くと、国名や組織名を1つずつ聞かれます。大事なのは最後の CN で、ここにこの証明書が名乗るドメイン名を書きます。ここが接続先の名前と食い違うと、暗号化はできても本人確認に失敗します。
秘密鍵の権限を締める
chmod 600 /etc/ssl/private/mysite.key証明書は誰に見られても構いません。むしろ配るものです。秘密鍵は逆で、漏れたらその時点で通信を復号されます。SSH の鍵と同じ扱いをしてください。/etc/ssl/private というディレクトリが最初から用意されているのは、そこに置くと決まっているからです。
作ったものを確かめる
openssl x509 -in /etc/ssl/certs/mysite.crt -noout -subject -issuer -dates前の回と同じ読み方です。subject と issuer がどちらも CN = mysite.local になっているはずです。自分で自分を保証している、という形が、そのまま出力に現れます。
有効期限も見ておいてください。-days に書いた日数がそのまま notAfter になっています。証明書は必ず切れます。運用で最も多い事故のひとつが期限切れで、正式な証明書でも同じです。切れた瞬間、訪問者全員に警告が出ます。
鍵と証明書が対になっているか
うまく設定できないときの定番の原因が、鍵と証明書の取り違えです。別々に作ったものを組み合わせてしまうと、nginx が起動しません。同じものから出たかどうかは、それぞれの中身を要約した値を見比べれば分かります。
openssl x509 -noout -modulus -in /etc/ssl/certs/mysite.crt | openssl md5
openssl rsa -noout -modulus -in /etc/ssl/private/mysite.key | openssl md52つの出力が一致すれば対になっています。SSH の鍵で ssh-keygen -y を使ったのと同じ考え方です。
手を動かす
自分のサイト用の秘密鍵と自己署名証明書を作り、権限を締め、中身と対応を確かめます。