自己署名証明書の生成方法


概要

今やLetsEncryptもあるのであまり必要なくなりましたが、自己署名の証明書(オレオレ証明書)を作ろうと思うといつもopensslのコマンドが分からずネットで検索していたので備忘録として残します。

CA無しのパターンとCAも生成するパターンで、CA無しはワンライナーで書きました。
普段はCA無しでも「秘密鍵」を作って、「CSR」を作って、「証明書」を作るという3段階だったんですが、よくよくコマンドを見るとそれを一括でやれるようになってることを知ったので、ワンライナーにしてみました。

CA無しの自己署名証明書(ワンライナー)

$ openssl req -nodes -newkey rsa:2048 -keyout privkey.pem -x509 -sha256 -days 1 -out chain.pem -subj "/C=JP/ST=Tokyo/L=Shinjuku-ku/O=EXAMPLE CORPORATION/OU=EXAMPLE DEPARTMENT/CN=`curl ifconfig.co`"
  1. opensslreq コマンドを使います
    • 秘密鍵と証明書を一度に生成します
    • 使いまわすわけではないので、証明書が出来てしまえばCSRは不要なので生成しません
  2. -nodesnode の複数形ではなく、 no DES = 秘密鍵を暗号化しない です
  3. -newkey rsa:2048RSA2048bit の秘密鍵を生成を指定します
  4. -keyout privkey.pem で生成した秘密鍵の保存先の指定します
  5. -x509 で証明書の生成を示す
    • req コマンドはデフォルトだと CSR 生成
  6. -sha256SHA256 の証明書が生成されます
    • デフォルトだと SHA1 なので気をつけてください
  7. -days 1 で有効日数を指定する
    • 0日や1日未満での指定はできないけど -days -1 とすれば遡った指定もできる(必要性はないだろうけど)
  8. -out chain.pem で生成した証明書の保存先を指定します
  9. -subj "/C=.../ST=.../L=.../O=.../OU=.../CN=..." はCSRを生成する場合に指定するのと同じで証明書の情報です

CA有りの自己署名証明書

$ # (2017/05/25 更新)

$ #echo -n "00" > /etc/pki/CA/serial # 要らなくなりました
$ #echo -n "" > /etc/pki/CA/index.txt # 要らなくなりました

$ # オレオレ中間CAの生成
$ openssl req -x509 -sha256 -days 3650 -subj "/C=JP/ST=Tokyo/L=Shinjuku-ku/O=EXAMPLE CORPORATION/OU=EXAMPLE DEPARTMENT/CN=My Private CA" -nodes -newkey rsa:2048 -keyout cakey.pem -out chain.pem

$ # 自身のIPに対するCSRと秘密鍵の生成
$ openssl req -subj "/C=JP/ST=Tokyo/L=Shinjuku-ku/O=EXAMPLE CORPORATION/OU=EXAMPLE DEPARTMENT/CN=`curl ifconfig.co`" -nodes -newkey rsa:2048 -keyout privkey.pem -out csr.pem

$ # オレオレ認証局による証明書の生成
$ openssl x509 -req -sha256 -days 3650 -in csr.pem -CA chain.pem -CAkey cakey.pem -set_serial 1 -out fullchain.pem

本来、初めの2つのコマンドは最初に一度だけ実行するもので、証明書を生成する度にこれらのファイルの内容が更新されていきます。
ただ ansible に組み込むときはそれが地味に面倒なので、毎回初期化しちゃえばいいと思います。
それで困ることってほとんど無いかなって思ってますがどうなんでしょうか..?

→ オプションでシリアルNo指定する方法(-set_serial 1)があったので2つのコマンドはコメントアウトしました(2017/05/25)

あと今回はCAと証明書でCSRを使いまわしてるからこういうコマンドになってますが、普通はCAと証明書は違うCSRだと思います
→ CSR使いまわさないで作るように修正しました(2017/05/25)