2022 09 22

"やってる"ぽい記事でも書くか。

Twitterでカッコつけて仕事してないアピールしてたら、ガチで何もしないでサボっているとみんなに思われている節があり、悔しい(自業自得過ぎる)ので。。。

 

 

てことで、先週、寝る前に軽く勉強した内容をメモ代わりに残しておく。

 

すごい昔に電子証明書の知識を(一部だけ)身に着けたんだけど、最近活用してなさ過ぎて忘れそうなので、作成経験のない楕円曲線証明書を作ってみた。

(なんか名前が難しそうなので勉強になるかなと思ったけど、いざ作ってみたらめちゃめちゃ簡単に作れてしまったため、ほとんど復習にしかならなかったのは後の話。)

 

ちなみに、ズルしていろんな方の記事を参考にさせていただいているので、調べたらもっとわかりやすい記事がたくさん出てきます。

 

 

☆そもそも楕円曲線証明書ってなんだよ☆

〇調べてみた。

楕円曲線暗号とは、楕円曲線上の離散対数問題と呼ばれる数学上の問題を安全性の根拠とする暗号。1985年に暗号学者のビクター・ミラー(Victor Miller)氏とニール・コブリッツ(Neal Koblitz)氏が独立にほぼ同時に考案した。楕円曲線DSA(ECDSA)や楕円曲線Diffie Hellman鍵交換(ECDH)などに応用されている。

うーーーーん前半がサッパリよくわかんねぇけど、暗号化アルゴリズムにECDSAやECDHを採用した証明書なら楕円曲線証明書と呼んで差し支えないってことかもな。

 

なんとなく暗号化アルゴリズムをECDSAに指定するだけでも良さそうなので、ぶっちゃけもうこの時点で作成できてしまいそうなのだけれど「ECDSAなら確実に楕円曲線証明書って言えるの?」という不安要素があったり「特定の楕円曲線暗号方式を使いたい時はどうすれば?」という疑問もあるので、確実性を担保するためにも別の方法で作成してみたい。

 

 

楕円曲線証明書をつくるぞ☆

〇調べてみた。

どうやら、openssl ecparamで秘密鍵を作成するときにオプション-nameのvalに楕円曲線の種類を直接指定できるらしい。

超簡単だった笑

 

〇やってみる

手順を思い出したいので、ルート証明書(自己証明)→サーバ証明書の簡単なチェーン作成。

昔に自宅PCへOpensslをインストールしたので事前準備いらず。神。

 

とりあえず自己証明書から。

今回はprime256v1を採用。

# openssl ecparam -name prime256v1 -genkey -out testroot.key

 

できたものを確認。

# openssl ecparam -text -noout -in testroot.key
ASN1 OID: prime256v1
NIST CURVE: P-256

 

お~~~~~。オブジェクト識別子が指定した楕円曲線暗号になってる。ちゃんとできた。

ところでNIST CURVEってなんだろ。。

 

 

・ついでなので調べてみる

P-256
256-bit prime field Weierstrass curve.
Also known as: secp256r1 prime256v1

いや日本語で頼む。。。。

まぁどうやら、楕円曲線ってのはパターンがいくつかあって、それのP-256ってやつがprime256v1(もしくはsecp256r1)と呼ばれているように見える。たぶん。

 

 

さて本題に戻る。

 

ここからは基本の流れ。

いつも通りCSRの作成。

# openssl req -new -key testroot.key -out testroot.csr -subj "/C=hoge/ST=huga/L=hage/O=matakamino/OU=hanashi/CN=shiterootCA"

中身の確認はめんどいので省く(仕事の時はちゃんとやろうね)。

 

ルート証明書の作成。

# openssl x509 -req -in testroot.csr -out testroot.crt -signkey testroot.key -days 3650 -sha256

 

これでルートCA(自己証明)の準備はOK。

 

 

ここからサーバ証明書を作るが、ここでも当然、暗号アルゴリズム楕円曲線暗号(今回はprime256v1)で作成する。

 

秘密鍵

# openssl ecparam -name prime256v1 -genkey -out testsrv.key

 

CSR

# openssl req -new -key testsrv.key -out testsrv.csr -subj "/C=hoge/ST=huga/L=hage/O=matakamino/OU=hanashi/CN=shitesrvIP"

 

証明書。

# openssl x509 -req -CAkey testroot.key -CA  testroot.crt -CAcreateserial -in testsrv.csr -out testsrv.crt -days 3650 -sha256

ここのお作法がだいぶ忘れかけだった。

当然ルートCAに認証してもらうので、ルートCAの秘密鍵と証明書を引っ張ってくる。

オプションはそれぞれ-CAkeyと-CA。

で、作成しておいたサーバCSR君に出てきてもらって認証を受けてもらう。

オプションは-in。

 

せっかくなのでPKCSも作っとこ。

# openssl pkcs12 -export -out testsrv.p12 -inkey testsrv.key -in testsrv.crt

 

★できあがり★

 

 

☆まとめ☆

簡単!

名前はクソむずいし、引用した文に書かれていた暗号化の(数学的な)方式はサッパリわからんままだけど、作成自体は思ったより容易。

やはり、証明書の仕組みさえ理解していれば直感的に操作ができるのがOpensslのいいところ。

 

秘密鍵を作成する際に-nameの後ろを変更するだけでいろいろな楕円曲線暗号を扱えるので、シェルスクリプト化したいときにも楽々作成可能。

 

おまえさいこうだよ。これからも仲よくしような。

 

 

おしまい。