概要
今や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`"
-
openssl
のreq
コマンドを使います- 秘密鍵と証明書を一度に生成します
- 使いまわすわけではないので、証明書が出来てしまえばCSRは不要なので生成しません
-
-nodes
はnode
の複数形ではなく、no DES
= 秘密鍵を暗号化しない です -
-newkey rsa:2048
でRSA
で2048bit
の秘密鍵を生成を指定します -
-keyout privkey.pem
で生成した秘密鍵の保存先の指定します -
-x509
で証明書の生成を示す-
req
コマンドはデフォルトだとCSR
生成
-
-
-sha256
でSHA256
の証明書が生成されます- デフォルトだと
SHA1
なので気をつけてください
- デフォルトだと
-
-days 1
で有効日数を指定する- 0日や1日未満での指定はできないけど
-days -1
とすれば遡った指定もできる(必要性はないだろうけど)
- 0日や1日未満での指定はできないけど
-
-out chain.pem
で生成した証明書の保存先を指定します -
-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)