CA機能使わずにCSR署名する。
openssl の証明書の署名を見ていると、openssl ca
を使わずに、CSRにサインする方法を知った。
openssl x509 -req -in my_cert_req.pem \ -days 365 -CA ca_cert.pem \ -CAkey ca_private_key.pem \ -CAcreateserial -out my_signed_cert.pem
使っているコマンド
openssl x509 -req
openssl x509 で リクエストを扱う。え?これは知らなかった。
-req By default a certificate is expected on input. With this option a PKCS#10 certificate request is expected instead, which must be correctly self-signed. X.509 extensions included in the request are not copied by default. X.509 extensions to be added can be specified using the -extfile option.
なるほど、openssl caのCA機能が内部的に使ってるものっぽい、これを使って署名リクエストへ自分の証明書で検証可能か署名を作るわけか。
試してみる。CSRに署名する
自己署名な証明書を作って、次にCSRに署名する。
最初に秘密鍵と自己署名証明書を作る。
CAとして振る舞うことができる自己署名証明書を作る。
次のコマンドを貼り付けると、CA証明書ができる。
openssl genrsa -out myCA.key openssl req -new -subj "/C=JP/ST=Kyoto/O=my/CN=MyCA" -key myCA.key -out myCA.csr openssl req -text < myCA.csr openssl x509 -req -in myCA.csr -signkey myCA.key -out myCA.crt
上記の流れを1回のコマンド起動で終わらせることができる。
openssl req -nodes -new -x509\ -days 365\ -subj "/C=JP/ST=Kyoto/O=my/CN=MyCA" \ -newkey rsa:4096\ -keyout myCA.key \ -out myCA.crt
( -nodes は no des の意味。パスフレーズによる暗号化をスキップする)
秘密鍵作成・リクエスト・自己署名を1行で終わらせられた。便利。
自己署名証明書を確認
openssl x509 -text -noout < myCA.crt
コピペで実験用の自己署名証明書が作成できて便利ですよね。
CSRに署名する(自己署名CAから証明書を発行)
次に、証明書を発行する。さきほど作った自己署名証明書を用いて、別の鍵の署名リクエスト(CSR)にサインする。
openssl req -new -nodes -x509 \ -subj "/C=JP/ST=Kyoto/L=Kyoto City/O=acid/CN=raspi3.lan" \ -newkey rsa:4096\ -keyout server.priv.key \ -days 365 \ -CA myCA.crt \ -CAkey myCA.key \ -CAcreateserial \ -out server.crt
これは、以下の手順と同じである。 任意の公開鍵を作る。次に署名リクエストを作る。
openssl genrsa -out server.priv.key
署名リクエストを作る。
openssl req -new \ -subj "/C=JP/ST=Kyoto/L=Kyoto City/O=acid/CN=raspi3.lan" \ -key server.priv.key \ -out server.csr
ファイルができた
ls server.* server.csr server.priv.key
openssl x509 -req\ -in server.csr \ -days 365 \ -CA myCA.crt \ -CAkey myCA.key \ -CAcreateserial \ -out server.crt
ファイルができた
ls server.* server.crt server.csr server.priv.key
署名した証明書を確認する。
openssl x509 -text -noout < server.crt
自己署名CAのシリアルが作られている。
$ cat myCA.srl 7C10C866EA0EFF73C4C957981DC32D9F2884F769
次のようなディレクトリ構造になった。
$ ls -l 合計 28 -rw-rw-r-- 1 takuya takuya 1090 3月 27 14:15 myCA.crt -rw-rw-r-- 1 takuya takuya 940 3月 27 14:15 myCA.csr -rw-rw-r-- 1 takuya takuya 1679 3月 27 14:15 myCA.key -rw-rw-r-- 1 takuya takuya 41 3月 27 14:18 myCA.srl -rw-rw-r-- 1 takuya takuya 1131 3月 27 14:18 server.crt -rw-rw-r-- 1 takuya takuya 980 3月 27 14:17 server.csr -rw-rw-r-- 1 takuya takuya 1675 3月 27 14:17 server.priv.key
openssl ca によるCA機能だとわかりにくい部分がなくて良い。CAを使うと、証明書の発行と失効管理が煩わしい。
なので、実験用にCA署名が必要な証明書を作ならこの記事の方法が手軽でよい。署名作成する言う点もわかりやすい。
まとめ
2行あればCAとサーバー証明書を作れる
## myCA 作成 openssl req -nodes -new -x509\ -days 365\ -subj "/C=JP/ST=Kyoto/O=my/CN=MyCA" \ -newkey rsa:4096\ -keyout myCA.key \ -out myCA.crt ## myCAでserver.keyを作って署名 openssl req -new -nodes -x509 \ -subj "/C=JP/ST=Kyoto/L=Kyoto City/O=acid/CN=raspi3.lan" \ -newkey rsa:4096\ -keyout server.priv.key \ -days 365 \ -CA myCA.crt \ -CAkey myCA.key \ -out server.crt
CSRや鍵作成のあたりをすっとばせるのは、実験には便利だよね。
参考資料
- https://stackoverflow.com/questions/21297139/how-do-you-sign-a-certificate-signing-request-with-your-certification-authority
- https://stackoverflow.com/questions/21297139/how-do-you-sign-a-certificate-signing-request-with-your-certification-authority#68854352
2023-06-12
sudo つけやすいように、シェルのリダイレクト処理を out
に書き直し。
冗長な言い回しを見直し。