ひまつぶし雑記帖

doncha.net制作・発行:KindleやiBooks、楽天kobo、BOOK☆WALKERで読む電子書籍

RSAモジュールで公開鍵と秘密鍵

2023/7/22 [10:09:31] (土) 天気

ActivityPubでPOSTするには電子署名が必要。
でも、こいつが簡単じゃない…それどころか、めっちゃわけわかめ。

今回のゴールは以下の3点。
秘密鍵公開鍵の生成
秘密鍵を使って対象文字列の署名、サインの生成
公開鍵を使ってサインの検証

その1)
秘密鍵と公開鍵の生成はopensslコマンドを使うのが手っ取り早い。

秘密鍵の生成
openssl genrsa -out private.key 2048
2048はbit長というか、言ってみれば強度という理解で大丈夫そう。2048ぐらいで生成するのが良いらしい。

できる秘密鍵は
-----BEGIN RSA PRIVATE KEY-----XXXXXXX----END RSA PRIVATE KEY-----
改行されて?整形されてるんだけど、このまま使うっぽい。

公開鍵の生成
openssl rsa -in private.key -pubout -out public.key
最初に作った秘密鍵を使って公開鍵を作る。

できる公開鍵は
-----BEGIN PUBLIC KEY-----XXXXXXX-----END PUBLIC KEY-----
改行されて?整形されてるっぽいんだけど、このまま使うっぽい。
とはいえ、jsonは改行不可なので、jsonに入れる場合は、改行を削除して一行にしたものを使う、のかな。
[07/26 12:05:16]追記。
改行は「\n」(バックスラッシュとn)に変換する…

その2)
秘密鍵ができたので、perlのCrypt::OpenSSL::RSAモジュールを使って署名。
lolipopにはないけど、ローカルにはcpanでインストールしたので使える。

Fediverse入門―非中央集権型SNSサーバを作ろう!(2)
ここに掲載されているsign.plをありがたくそのまま使わせていただくことした。

秘密鍵を使ってインスタンス生成。
my $key = Crypt::OpenSSL::RSA->new_private_key($pk);
↑$pkという秘密鍵の文字列を渡して作る。

インスタンス生成ってなんのこっちゃ?だけど、呪文の始まり、ことでOK。
さらに、sha256でハッシュ化しますよ、という呪文を追加。
$key->use_sha256_hash();

ここまでやったら、秘密鍵を使った署名ができる。
my $s = $key->sign(INPUT);
signという、そのままのモジュールにINPUT、署名対象の文字列を渡せばRSA署名の出来上がりとなる。

署名対象の文字列とは。
ここでは、HTTPSヘッダのSignatureに使うことを想定して
date:[半角空白]日付文字列
digest:[半角空白]sha-256=本文のハッシュ文字列
みたいなものを「改行」で繋いだもの。

その3)
で、このサインが本当に合ってるのか署名の検証をする。
検証に必要なのは「公開鍵」「サイン」「署名対象文字列」

今度は公開鍵を使ってインスタンスを生成する。
my $rsa = Crypt::OpenSSL::RSA->new_public_key($pubk);
↑$pubkという公開鍵文字列の文字列を渡してやる。

秘密鍵を使った署名と同じ呪文を公開鍵で作ったインタンスに対しても追加。
$rsa->use_sha256_hash();

ここまでやったら検証ができる
$rsa->verify(TARGET, SIGN)
対象文字列と署名が合っていたら1が返ってくる。
この対象に対してこのサインがされてますよ、の証明になる、という理解で大丈夫かな。

サインはおそらくほとんどの場合、base64でハッシュ化する・されているので、
MIME::Base64 モジュールを使って
encode_base64 decode_base64
が必要になってくる、はず。


lolipopだとRSAが使えない、perlのCrypt::OpenSSL::RSAモジュールが入っていないので、あまり頑張りどころでもないよな、と思いつつ、うまくいかないのはなんか、好かん。

そして、意図通りに署名できたので、肝心要一丁目一番地のActivityPubでFollow、AcceptへのPOSTをしてみたんだけど、401で弾かれる。なんでや。

最初のactor.jsonを作った時に、公開鍵はとりあえず、空でもテキトーな文字でもいいというので、ほんとテキトーな文字を入れたのが失敗だったかなあ。
今回作った公開鍵に入れ換えたけど、最初のデタラメ公開鍵が伝播して使われてるという可能性もあったりして。

[08/18 12:30:06]追記
単なるPEMのコピペミスが原因。
サインする、検証するやりかたは上記エントリ通りで間違いなかった。

image 
全然関係ないけど、AIにサイバーパンクな最後の晩餐を描いてもらったら、矮人の宴という半村良的な絵面が出てきたぞ

»電子書籍制作代行についてはこちら

profile

profile

 
doncha.net
contact:
»運営者
@t2aki@tokoroten.doncha.net

ところてんx5

2024/4/27 12:51

図書館で作業。案の定、目視確認は一回じゃ抜け漏れが出る。
一応、最初に確認、反映させた箇所で大丈夫だったけど、これは先が思いやられる。

2024/4/27 08:52

もろもろ、問題山積でやる気が出なくてマズい。久しぶりに図書館の個人席にノパソ持ち込んで作業してみる、か。

2024/4/27 08:50

こっちはこっちで、問題ありあり

検索
<<2024/4>>
 123456
78910111213
14151617181920
21222324252627
282930

リンク

WINDOWS版サウンドノベル
おかえりください PC WINDOWS版サウンドノベル
『おかえりください』体験版