それマグで!

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

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

openssl でオレオレ証明書(自己署名証明書)を作りCAを作り、他の証明書リクエストに署名する。

ネットを探してても時間が浪費するので、よく使いそうな機能をまとめておく

オレオレ証明書を作る。

この記事に書いたこと

オレオレ証明書を作る

オレオレ証明書とは、自己署名証明書(第三者の署名を持たない証明書)。自己署名証明書は自分で自分の身分を主張する。似たような事例に「振り込め詐欺」があり、これに因んで、オレオレ証明書という。

手順を書いた。

オレオレ証明書でAliceの証明書を発行する

Aliceの署名に、私が署名して証明書する。

手順は次の通り。

  • Alice の秘密鍵作成
  • Alice の署名リクエストを作成
  • Alice の署名リクエストに署名する

オレオレ証明書で認証基盤(認証局機能)を作る

PKIでのCAの役割をする。署名した発行済証明書を管理する。

  • CA を構成
  • CA として署名する
  • 署名した証明書一覧
  • Revokeを試す。

はじめに。

証明書を使って、「公開鍵」を証明する。逆に考えれば、証明書を発行したことを否定できない。

openssl の準備

現代では、ほとんどの環境で準備とインストールを気にせずに使えると思う。インストール必要なのは、Windowsくらいかも。

最初にバージョンを確認しておく。

openssl version

私が今回用いいたのは次のバージョンです。

$ openssl version
OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)

自己署名証明書オレオレ証明書)の作成

秘密鍵をつくり、公開鍵を導出する。公開鍵を秘密鍵で署名する。署名に秘密鍵で署名する。

秘密鍵作成

openssl genrsa 2048 > privkey.pem

署名リクエストを作成

openssl req -new -key privkey.pem -subj '/C=AU/ST=Some-State/O=OreOre/CN=Ore' -out csr.pem

秘密鍵を使って公開鍵を導出。公開鍵に秘密鍵で署名する。証明書を作る

署名リクエストのSubjectを確認

openssl req -in csr.pem -noout -subject
# -> subject=C = AU, ST = Some-State, O = OreOre, CN = Ore

署名リクエスト(証明書発行リクエスト)の中身を確認する

署名リクエストへ署名

openssl x509 -req -in csr.pem -signkey privkey.pem  -out crt.pem

発行者・被発行者を確認

openssl x509 -in crt.pem -noout -subject -issuer
# -> subject=C = AU, ST = Some-State, O = OreOre, CN = Ore
#    issuer=C = AU, ST = Some-State, O = OreOre, CN = Ore 

Subject(一般的には主体者と訳される)は、「主題・主語・容疑者・被験者・被写体・的(まと)」の意味があり、ここでは「被発行者・対象者・所有者・申請者」の意味で捉えておくといいと思う。

issuer は発行者と訳される。発行社・発行人・発行担当である。ここでは、「証人」と思っておくと良い。

Aliceの証明書を作る

Aliceの証明書を作成する。オレオレ証明書による署名とほぼ同等である。Subjectが変わる。

Aliceの秘密鍵を作成。

openssl genrsa 2048 > alice.privkey.pem

Aliceの署名リクエストを作成

openssl req -new -key alice.privkey.pem \
   -subj '/C=AL/ST=Ice/O=Alice on Ice/CN=Alice wonder'  \
   -out alice.csr.pem

Aliceの証明書に署名する

署名リクエスト(Aliceの自己署名証明書)に署名する

openssl x509 -req  \
  -CA crt.pem  -CAkey privkey.pem \
  -CAcreateserial -CAserial serial \
  -in alice.csr.pem  > alice.crt.pem

発行したAlice の証明書を確認する。

openssl x509 -issuer -subject -noout < alice.crt.pem
## => issuer=C = AU, ST = Some-State, O = OreOre, CN = Ore
##    subject=C = AL, ST = Ice, O = Alice on Ice, CN = Alice wonder

発行者(Issuer)がオレオレになっていることがわかる。

証明書の検証

openssl verify -verbose -CAfile crt.pem alice.crt.pem
# => alice.crt.pem: OK

Alice証明書を、発行者の証明書(オレオレ証明書)で検証する。

CA を構成

PKI 基盤として、オレオレ証明書で CA を構成

openssl ca ## エラーがでるので逐次対応する

対応

mkdir demoCA
mkdir demoCA/private
mkdir ./demoCA/newcerts
cp privkey.pem  demoCA/private/cakey.pem
cp crt.pem  demoCA/cacert.pem
touch demoCA/index.txt
echo 00 > demoCA/serial

対応結果

openssl ca ## エラーが出ないことを確認

この対応は Debian/Ubuntuのopensslのデフォルト設定(/usr/lib/ssl/openssl.cnf) を用いた場合の対応であり、実験を簡単にする目的で行っている。

設定ファイルを指定するのが正しい運用です。 ( $ openssl -config openssl.cnf )

CAとして 署名し証明書を発行

openssl ca -in alice.csr.pem  -policy policy_anything 

証明書に本当に署名するか尋ねられる。

Sign the certificate? [y/n]:

署名した証明書を取り出す

cp demoCA/newcerts/00.pem alice.ca_signed.crt.pem

Aliceの証明書を検証する

openssl verify -verbose -CAfile demoCA/cacert.pem alice.ca_signed.crt.pem
## => alice.ca_signed.crt.pem: OK

CA の発行済の証明書を確認する

証明書を発行したら、シリアル値と発行済の証明書が管理される。

cat demoCA/index.txt
#  V       240311012107Z           00      unknown /C=AL/ST=Ice/O=Alice on Ice/CN=Alice wonder
ls -l demoCA/newcerts/00.pem
# -> -rw-rw-r-- 1 takuya takuya 4381  3月 12 10:21 demoCA/newcerts/00.pem

単純にx509 で署名する場合と違うのは、この管理があるかどうか。

revoke してCRLに書き加える。

特定の証明書をRevokeする。

openssl ca -revoke alice.ca_signed.crt.pem
# Revoking Certificate 00.

結果を確認すると、V→R に変わっている。

cat demoCA/index.txt
# R       240311012107Z   230312012549Z   00      unknown /C=AL/ST=Ice/O=Alice on Ice/CN=Alice wonder

CRLを見る。

echo 00 > ./demoCA/crlnumber
openssl ca -gencrl > crl.txt
openssl crl -text < crl.txt

まとめ

他人の証明書リクエストに「自分の秘密鍵」で署名をつけることができる。

openssl x509 -req  \
  -CA crt.pem  -CAkey privkey.pem \
  -CAcreateserial -CAserial serial \
  -in alice.csr.pem  > alice.crt.pem

これが大事なんだと思う。

追記

オレオレ証明書といえども、振り込め詐欺のようなものではなく、「規格準拠」した正しい証明書である。

署名(リクエスト)に署名するだけとはいえCAとして振る舞う必要がある。

ここで作ったオレオレ証明書はOSへ導入するとそのまま使うことができるが。普通はやらない。

最近はルータの管理画面がhttp で困るので導入するかな。

参考資料