見出し画像

【日記を書く19日目】秘密鍵と公開鍵少しわかる

れみです。最近niji jouneyで画像生成にハマってます。面白いですね。gpt-4を使った文章生成は仕事で触ってて、かなりストレスだったんですが、画像は純粋にすごいなと思います。

昨日の記事

今日は、秘密鍵と公開鍵、自己署名証明書について。いや正直まだぼんやりです。ちょっと調べたことを文章にしてみようかなと。

きっかけは業務でsalesforceのOAuth 2.0 JWT bearer token flowを使った認証を使うことになったからです。

サーバー間インテグレーション用の OAuth 2.0 JWT ベアラーフロー
https://help.salesforce.com/s/articleView?id=sf.remoteaccess_oauth_jwt_flow.htm&type=5

こちらのドキュメントを見つつ、noteに詳しく投稿している方がいました。

とりあえず見よう見まねでやってみたら、特に詰まることもなく、アクセストークンを取得することができました。しかし、証明書をsalesforceに登録し、こちらはJWTを秘密鍵で署名したものを送る、というフローをよくよく考えると、これどうやってsalesforceで検証してるんだ?という気持ちになりました。

なんでかというと、公開鍵暗号方式のよく聞く暗号化と複合化の流れとしては

  1. 受信者が公開鍵と秘密鍵を生成する

  2. 送信者が公開鍵を使ってメッセージを暗号化する

  3. 受信者が秘密鍵を使ってメッセージを復号する

が多いのではないでしょうか。少なくとも自分はこれまでざっくりとした知識で、こういうもんだと思ってました。

しかし、今回の認証では、まず秘密鍵を使って署名し、証明書(公開鍵)を使って検証しています。言うなれば、これまでよく聞いていた公開鍵・暗号鍵の使い方と逆な感じがしました。ここが、自分の疑問になったところです。

ちなみに自分がSHIFT Groupさんの記事を見ながらとりあえず実行してみたとき、opensslのコマンドが実際に何をやっているのかすらわからないまま、手を動かしていました。その中に、秘密鍵を作成する手順として以下を紹介していました。

③以下のコマンドを実行します。

openssl genrsa -des3 -passout pass:SomePassword -out server.pass.key 2048

実行した結果として、server.pass.keyファイルが作成されます。 コマンドの中の「SomePassword」には、任意のパスワード文字列を設定してください。

④以下のコマンドを実行します。

openssl rsa -passin pass:SomePassword -in server.pass.key -out server.key

実行した結果として、server.keyファイルが作成されます。

https://note.com/shift_tech/n/n4fae1b65675f

そして、これをみて自分は出力された秘密鍵であるserver.keyを使うのに、SomePasswordという文字列が必要なんだ、という勘違いをしてしまいます。salesforceとやりとりするアプリケーションはNode.jsで実装していたのですが、秘密鍵を表現するオブジェクトを作る過程で、server.keyの文字列と、パスフレーズまで指定していました。

これが全く意味のないことをしていると知ったのは、数ヶ月後の話です。それが今日の話だったのですが。

正しくは、3番では「指定した暗号化方式で暗号化された秘密鍵」を生成していたんですね。その暗号化方式がdes3(今では弱すぎて使うのは良くないらしいです)だったというわけです。なので、Node.js側でserver.pass.keyを使う場合は、暗号化方式であるdes3と一緒にパスフレーズを指定しないと、秘密鍵を複合できないが、server.keyを使ってる場合は、これが秘密鍵そのものだからパスフレーズの指定なんてする必要がない、意味がないことをしていました。

ようやくあやふやのまま進めていた部分の謎が1つ解決しました。意味わからなかったんですよね。これそもそもなんのパスフレーズなの、という。

そして、残りは秘密鍵を使ったJWTの署名と、証明書を使ったJWTの検証です。純粋に知らなかったですが、ざっくりとこれがデジタル署名ってやつなんですね。RSAの仕組みを使えば、証明書に含まれる公開鍵を使って、署名前のデータが複合できるんですかね?ここら辺はいろんなブログや紹介記事では表現にばらつきがあって、正確な理解をするにはRSAについてちゃんと調べないとわからなそうです。

とりあえず、秘密鍵で署名されたデータを公開鍵を使って検証することができるらしい、ことを認めたら、自分の疑問は解消されました。

いや、難しいですね。正直、証明書と公開鍵の関係もまだぼんやりしてます。証明書の中に公開鍵のデータが丸っと含まれてるのだろうか。まだまだ知らないことだらけですね。継続してRSAについて調べていきます。

さて、今日はここまで。




この記事が気に入ったらサポートをしてみませんか?