それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

CA管理機能使わずにCSR署名する。コピペでつくる自己署名な証明書。

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や鍵作成のあたりをすっとばせるのは、実験には便利だよね。

参考資料

2023-06-12

sudo つけやすいように、シェルのリダイレクト処理を out に書き直し。

冗長な言い回しを見直し。