ActivityPubにおそるおそる話しかけてみた
ActivityPubを通じてフォローしたり投稿したりするには避けて通れないRSAの署名、というかサインというか。
これ絡みが、もう本当に五里霧中で迷走するばかり。
いろいろ検索しまくってこれでイケるかも?ぐらいのところまで来たので、いったんメモ。
RSAモジュールで公開鍵と秘密鍵
↑鍵を作ってサインする方法は前回のこれで正解。
一番の問題は、サインを作る対象となる文字列をどうするの、というところ。これはなんでもいいんだけど、ActivityPubに通すので、そっちに合わせる必要がある。
結論からいうと必要な材料は以下。
・リクエストのメソッド(POSTとかGET)とリクエストするURI
・相手側のホスト名
・日付、
・本文のDigest
mastodonの仕様だと必須なのは、日付とdigestの2つなんだけど、実際にmastodonから飛んでくるリクエストのログを見ると、この4つが必ず入っている。
オマケでcontent-typeやacceptを入れることもある、らしい。
具体例をあげると
(request-target) POST /actor/inbox
host: example.com
date: Wed, 26 Jul 2023 02:00:32 GMT
digest: SHA-256=unkTWZOjiNdJT4SDuAU6tCy6A0QM0PZ2bs0353xOt+k=
content-type: application/activity+json
「キー 区切り 値」の並び
host「:」「半角空白」example.com
という形式で、キーはすべてアルファベットの小文字。
(request-target)だけはコロンは不要
これら、ひとつひとつを「改行」で繋げて並べた文字列を対象としてサインすることになる。
digestというのは
元データから、ハッシュ関数と呼ばれるあらかじめ定められた計算手順により求められた値です。 ダイジェスト値とも呼ばれます。 ハッシュ値を求めるハッシュ関数(※)には、元データが1ビットでも異なれば大きく異なるハッシュ値が生成される(同じハッシュ値になることが実用上ない)方式が選ばれます。
perlだと「MIME::Base64」のencode_base64という関数をそのまま利用。
encode_base64(本文,"")と、2番めの引数に空を渡さないとDigestに改行がついてくるので注意。
本文というのはfollowやcreateといったActivityPubで使うjson文字列。
対象文字列が決まったら、RSAで署名して、リクエストのヘッダに入れる。
'host' => 'example.com',
'date' => 'Wed, 26 Jul 2023 03:52:07 GMT',
'digest' => 'SHA-256=unkTWZOjiNdJT4SDuAU6tCy6A0QM0PZ2bs0353xOt+k=',
'content-type' => 'application/activity+json',
'signature' => 'keyId="https://tokoroten.doncha.net/t2aki#main-key",algorithm="rsa-sha256",headers="(request-target) host date digest content-type",signature="qCEXfTo~略~I9zfRqcUaTwjew=="',
↑これはperlのlwpを使ってヘッダに設定している部分。
Signatureの
keyIdは「actor.json」に入れた公開鍵のkeyId
algorithmは暗号化の方法「rsa-sha256」
↓適宜改行は入れたけど、こんなリクエストを飛ばす
HTTP_DATE :: Tue, 25 Jul 2023 23:55:38 GMT
HTTP_DIGEST :: SHA-256=giwfKVIT61lc9LpR7EsgEJBmHilheDpPwFnqdjMBjrA=
HTTP_HOST :: example.com
HTTP_SIGNATURE :: keyId="https://tokoroten.doncha.net/t2aki#main-key",
algorithm="rsa-sha256",
headers="(request-target) host date digest content-type",
signature="SE〜略〜JEVPj9
サインの検証は問題ないし、リクエストもこれで問題ない、と思ったんだけど、mastodonだと401で弾かれる。firefishだと202でどうやら受け付けてもらえるっぽい。
同じリクエストを送ってるのになんでこっちはダメでこっちがOKなのか理解できていないのが現状。
その他ハマったところ。
公開鍵って改行されてるけど、actor.jsonのpublicKeyPemに入れるのにどーすんの問題。
jsonは改行入りデータは扱えない。ただただ改行を削除して一行にすればいいんだろ、ぐらいに思ってたんだけど、検索して眺めてると「バックスラッシュ」「n」という2文字の文字列になってるっぽい。これ、改行なのか2文字の文字列のことなのかわけわからず、ほぼ1日弱経過。
perlのJSONでencode_jsonしてみりゃいいことに気づいてやってみたら、2文字の文字列に置換されていた…改行を「バックスラッシュ」「n」の2文字の文字列て、なんか不細工じゃね。
(request-target)ってなんやねん問題。
どのリクエストのヘッダもこれが先頭にあったんで、てっきり、これに続く要素を要求しますよ、という宣言みたいなもんだと思ってたら大きな間違い。こいつもキーのひとつだった。
HTTPメッセージに署名をするSignatureヘッダの標準化
Digestの生成を疑った問題。
リクエストが401で弾かれっぱなしだったんで、どこが問題だろうと。HOSTやDateは目で見てわかる文字列で、そこは大丈夫だったので、Digestが違ってるわけ?と。
perlのDigest::SHA qw(sha256) MIME::Base64 encode_base64(sha256($content),"")で作ったDigestの検証。
コマンドラインで
cat accept.json | head -c -1 | sha256sum | xxd -r -p | base64
などとやって差分のないことを確認。Digestも問題なかった、やっぱり1日弱経過。
実際、まだマストドンからは401で弾かれるので、何か間違えてるはず。
とはいえ、 himagine.club (firefish)から202が返ってきたを見てめっちゃ嬉しかったので、ここらでひと段落とするかなあ。これ以上やったらただでさえマダラハゲなのに禿頭一直線になりそうで怖い。
mastodonのSignatureのソースコード
"#{Request::REQUEST_TARGET}: #{request.method.downcase} #{request.path}"
ActivityPubに対するSignatureのPHPのソースコード
'(request-target) %s %s%s'
あれ?(request-target)の後ろにコロンがいるのかいらないのかよくわからないぞ。コロン一つでverifyの結果が違う…て、どっちでやっても401だったけどな。
[07/27 19:52:17] うまく開通したスクリプトではコロンをつけた文字列。
[07/26 16:29:44] 追記
をっと。202が返ってきても繋がったわけじゃなかった。まだどことも繋がらないってこと。どこが違うんだろ。401じゃないってことはヘッダやサインは問題ない、という理解でいいのかな。これは根が深い。お手上げ、かなあ。
[07/27 11:21:59] 追記
開通!というかActivityPubを通じてFediverse連合空間に入ってfollowもpostもできた!
401の原因。
actor.jsonに記載のpublicKeyPemの始まりのハイフンがコピペミスでひとつ足りなかった。5つ必要なのに4つしかなかった…だけだった。
我ながら雑で阿呆なミスに愕然し、驚愕するばかり。
とはいえ、この何日か、けっこう必死こいて調べまくったので、SignatureやHTTPヘッダについて改めて知ったこともあったので、結果オーライ。
副産物というかverifyするスクリプトやログを片っ端から取るスクリプトを作ったのも今後役に立つだろうと思うし。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
久しぶりの自炊飲み
今日はヨメが友達と飲みというか隅田川花火鑑賞会で出かけていて久しぶりに自宅・自炊飲み。
毎日料理を作ったり、それ以上に献立を考えるのは大変だと思うのでそこは敬意を表しつつ。わたし自身は、料理するのは昔から結構好きだったりする。諸般のというか家庭の事情もあってわたしは小学生の頃家族の夕飯を作っていたし、大学で一人暮らしを始めた頃も自炊派。
んで、巷間いわれるように面倒とか思ったことはあまりなくて、自炊するということは自分の好きなものでご飯を作ることができるので、むしろ歓迎。
自分のために自分の好きな材料で好きな料理を作るんだから文句はない。
一品め。ジャガイモ炒め。ピラーで薄切りにしたジャガイモをごま油で炒める。油に染み出させる花山椒が口に含んだときのポイント。ほか塩胡椒。
二品め。もずくのスクランブルエッグ。もずくに塩気があるので味付けは胡椒だけ。もずくがうめー。海がうめー。
三品め。ピーマン炒め。こいつはピーマンをチンジャオロースーと同じく細切りにするのがポイント。味付けは醤油だけで最後におかか。
四品め。オニオンスライス。タマネギはがんばって薄く切る。塩でしっかり揉み込んで水で流す。粗挽き胡椒とライムがタマネギ臭さを爽やかにするポイント。タマネギが甘くなる。
五品め。カレー炒飯。タマネギのみじん切りをスパイスもろもろで炒めたタネを作る。具材は冷蔵庫にあったピーマンとじゃこ、レタス。ご飯はレンチンして卵を解いて混ぜて卵かけ御飯にしておく。ひたすら炒めて必死で炒めてパラパラにする。
美味いは正義。
自分の好きなものばかりで作るわけで、不味いワケがない。自炊は美味い。
ちなみに「男の料理」ということで大雑把テキトーが豪快で、なんて文脈になってることがあるけどそれは論外。
逆に、たまにしか料理をしないんだから、ちゃんとこだわれと思う。具材の大きさを揃えて切ったり面倒なこときちんとやろうず。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
50歳フリーター生活
とりあえず、地元でフリーター生活を始める50歳だ。
今までのキャリア・スキルとなる、編集やWEB制作で、その専門の業種、出版社や編プロ・WEB制作会社で求められてるのは30歳程度まで、というのは何度も痛感。
本業が別にあって、ネットをやってみよう、というようなところがハマるかな、と思って探してたら、地元のチェーン展開してる商店が募集してたので、行ってみた。WEB関係とパソコン雑用・軽作業、といったところか。
ただ、こういうところって、経営者がネットに過大な期待を抱いてる傾向があって。
「ネットで新規顧客の獲得」「ネットで集客」「ネット展開を本業の付加価値として従来の顧客にアピールできる」
どれも、WEBの仕事ではあるんだけど、見る見る生えてくる、とか、飲むだけで痩せる、みたいなことはありえない。ECサイトなど、立ち上げて1年ほどは真っ赤の火達磨状態、というのがありがち。ネットならではのニッチなところを地味に潰して濃いアクセス・ユーザーを獲得していく、とか、本業側の業務をサポートするような仕組みをサイトに入れ込んで合わせ技というか同じドンブリで計算する、とかしていかないとなかなかひとり立ちは難しい。
胃が痛くなるSEOを検討していったり、ユーザビリティを高めるためにユーザー行動をチェックしてプチリニューアルをしたり、割りと見えにくい地味な作業でサイトをチューニングし続ける、というのが実際のところ。そういったことをやり続ける辛抱があれば、サイトは確実にひとを呼べるものになる、はず。
てなところで今日は地元花火大会だった。
やっぱり花火は、ライブが一番。音と振動を直接感じることができる。ひたすら盛り上がった。スピルバーグのひとりもいれば、きっと、ジャック・ニコルスンがニタニタ笑いながらナイフを振り上げてたり、巨漢の黒人が目をうるませて花火舞う夜空を見上げてたりするんだろうなあ。
ケータイでとったショボい写真 https://photozou.jp/photo/show/218335/90621681
って、2006年からやってるのに https://doncha.net/ こっちをうまく盛り上げられていないから、エラソなことは言えないんだけどね。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
台風で体調までおかしい、かな
台風の雨が舞う中、今日も今日とて最寄の職安へ。さすがに職安は空いていた…って、台風がきてるのに職安がひとでごった返してたらニッポンがアブナイでしょ。
いろいろ見て回って、結局今日は空振り。職種限定せず検索してるので見るだけで2時間近くかかってしまう。しょぼいこってす。
例によって地元駅前の立ち食いそばでメシにしてスタバで一服して帰宅。
なんもないわけにはいかないんで、先週、ネットで見つけたんだけど、年齢が35歳位まで、という募集に応募してみた。この「位」の範囲に44歳が入る…わけねえだろな。まあダメ元。
台風の影響なのかとにかく蒸し暑くて体力をじんわり削られる感じだ。人間も動物、月の引力が体調に影響するのと同じで、気圧の変化も当然影響するってもんだろう。あいかわらずテレビは話を大きく(面白く)しようとしすぎ。台風による被害者がいたほうが話としては面白いからといって、まだきてもいない台風に備えて屋根樋を直していた5ン才の男性が間違えて落ちて軽いケガをした、てのはどうなんだ?無理やりすぎだろ。
一事が万事ですなぁ。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
自宅居酒屋モード
あれこれ忙しかったり思うところがあったり情緒不安定な中高年だ…って更年期障害か。
ここんとこ暑さが心配で弁当はサボリ。朝7時前に起きて、ちゃちゃっと炒め物すると、うちを出る8時前までに粗熱が取れないのだ。それをタッパーにつめてもってくのはちょっとどうだろ、と。
なもんで、今日は、というか今日も昼飯はマクドのセット。とほほ。
で、写真は今日の晩飯。
みず菜を塩水で洗ってざく切り。そこに、トマト1ケ、ピーマン2ケをさいの目にしてニンニク鷹の爪塩コショウとともに、たっぷりのオリーブオイルで炒めたものをどばっとかける。
キャベツを千切りに。ひたひたの水にコンソメを入れて煮て皿にあける。その煮汁で日清ソースヤキソバ。
それと澤乃井。
こりゃうまくできたわい、と思ったら、動物性たんぱく質を忘れてたけど、まあいいか。
いや、美味美味。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
今日も今日とて
とりあえず、エスタックイブのおかげでダラダラ鼻水はおさまっているが、今度はその分(?)鼻・喉が渇いてしょうがない/全身がだるくてしょうがない/眠気が激烈、となっている。
風邪をひく、とか、お腹を壊す、とか、身体がちゃんと反応している、ということでは「いいこと」らしい(身体が反応しなくなったら本当にヤバイ、らしい)けどなあ。うー。
とりあえず先が見えてきて、来週は細かいページの地道な作業となる。週末じっくり休んでシャキっとせんと、どもならん。
WINDOWSのVKDエラーで死んでた会社のレッツノートCF-B5。昨日から再インストールを実行中。VKDエラーってのはデバイス(HDD)とWINDOWSで同期が取れなくて起こるエラー。それならWINDOWSじゃなきゃどうだろう、と思ってFreeBSDをインストール中だったりする。
外付けのCDROMドライブなんて持ってないので、FreeBSDの総本山から起動FDDイメージをダウンロードして、FTPインストール(CDROMのかわりにFTPサーバーを使う、てな感じ)
会社の回線は専用線OCNエコノミー128K。導入当初は専用線なんて「最先端」だったのに、今では家庭に入ってるADSLやケーブルより遅い上、一本の線を共有する人数が多すぎて、1秒あたり2K〜12K、というパフォーマンス。
昨日帰りがけにFTPでシステムインストールを開始して帰宅。今日出社してみたら、どうやらシステムはダウンロード&インストールに成功してるっぽい(かなり疑心暗鬼/笑)朝から各種パッケージを、やはりFTP経由でインストールしてるけど、まだ終わらない。これが終わらないことには、ログインもできないのでHDDが本当にやられてるのかどうか見当がつかない。このままFTPからダウンロード&インストールを続けさせて、今日のところは帰るしかなさそうだなぁ(苦笑)
ダメモトではじめたことだし、まあいいか。
ふぅぅぅぅ息も絶え絶え(とほほ
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」