自己署名証明書を作る

証明書は、鍵とセットで作る

前の回で読んだ証明書には公開鍵が入っていました。ということは、証明書を作るには先に鍵のペアが要ります。作る手順は2段構えです。

  1. 秘密鍵と公開鍵のペアを作る
  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

前の回と同じ読み方です。subjectissuer がどちらも 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 md5

2つの出力が一致すれば対になっています。SSH の鍵で ssh-keygen -y を使ったのと同じ考え方です。

手を動かす

自分のサイト用の秘密鍵と自己署名証明書を作り、権限を締め、中身と対応を確かめます。

ヒント

  • 1. openssl req -x509 -nodes -days 365 -newkey rsa:2048 で鍵と証明書を同時に作る
  • 2. -keyout と -out で置き場所を指定する
  • 3. -subj "/CN=mysite.local" で名乗る名前を渡す
  • 4. chmod 600 /etc/ssl/private/mysite.key で秘密鍵を締める
  • 5. openssl x509 -noout -subject -issuer -dates の出力を /root/mysite-cert.txt に保存する

8 項目で採点します