この記事はなに?
Blueskyの回復鍵(recovery key)というものを作ったのでそのログです。
回復鍵とは? の説明は作成手順として参考にさせていただいたHow to get a recovery key を翻訳して引用します。
原文
What is a recovery key and why might I want one?
When you do stuff on Bluesky, your data is stored by your PDS (Personal Data Server). It's like if all your posts/follows/etc. were in cloud storage like Box or Google Drive. By default, your PDS is managed by Bluesky, but you can change your PDS whenever you want (though it currently requires some technical knowledge).
But...what if Bluesky went evil and didn't want to cooperate? What if they wanted to keep you stuck using their storage?
That's where a recovery key comes in. A recovery key is like a password you can use to override whoever manages your PDS* and get back control of your account.
翻訳
回復鍵とは何か?なぜ必要なのか?
Blueskyでの操作では、データはPDS(個人データサーバー)に保存されます。これは、投稿やフォローなどが、Google DriveやBoxのようなクラウドストレージに保存されるようなものです。通常、BlueskyがPDSを管理しますが、PDSを変更することも可能です(ただし、現時点ではある程度の技術知識が必要です)。
しかし、もしBlueskyが悪意を持ち、協力しなくなったらどうしますか?あるいは、Blueskyがあなたを自分たちのストレージに閉じ込めようとしたら?
そこで役立つのが回復鍵です。回復鍵は、PDSを管理する人を上書きし、アカウントを取り戻すためのパスワードのようなものです。
この鍵があれば自分のアカウントを邪悪な管理者から奪い返し、自分の権限で別のPDSへと引っ越しできる、というようなイメージでしょうか(違ったら誰か教えてください……)。
今のところBluesky運営が邪悪に染まっているという印象はありませんが、まあ思い出づくりにやってみましょう。
やってみる
基本的に How to get a recovery key の通りにやります。
自分用のメモを兼ねているので余計な情報も書いていますがご容赦。
作業対象は私のアカウントである yodogawa.bsky.social
(didは did:plc:hwspbpfumiqyqzfeik7vilbu
)とします。
実際にやってみる場合は適宜自分のアカウントに読み替えてください。
作業環境はWSL2の Ubuntu 22.04.2 LTS
。
goat のインストール
$ go install github.com/bluesky-social/indigo/cmd/goat@latest
特にエラーもなくinstallできました。自分の環境では ~/go/bin/goat
に入りました。
install先を /usr/local/bin
とかにもできると思いますがgoなんも分からんマンなのでこのまま行きます。
ログイン
$ ~/go/bin/goat account login --username yodogawa.bsky.social --app-password 'パスワードをここに書いてね'
--username
に回復鍵を作りたいアカウントのハンドル、--app-password
パスワードを書きます。
--app-password
と書かれていますがアプリパスワードではないらしいので注意 ( --password
と書いてほしかったかも )
また当たり前ですが、パスワード中に記号が入っている場合はコマンドと干渉する可能性があるのでシングルクオートで囲いましょう。
これで以降の goat
コマンドは yodogawa.bsky.social
にログインしている状態での作業になります。
鍵の作成
次に秘密鍵の作成。自分用の回復鍵になります。
これが盗まれると非常にアレなので厳重に管理しましょう。
自分はいったんパスワード管理ツールに入れましたが、今後どうするかはあとで考え直します。
コマンドを実行すると回復鍵(秘密鍵)が表示されます。メモしましょう。
$ ~/go/bin/goat crypto generate
ここに回復鍵(秘密鍵)が出てくるよ!
次に回復鍵(秘密鍵)に対応した公開鍵を作ります。
これをBlueskyのサーバーに登録することで回復鍵でのアカウント回復が可能になります。
$ ~/go/bin/goat crypto inspect ここにさっき作った回復鍵(秘密鍵)を書くよ!
Type: P-256 / secp256r1 / ES256 private key
Encoding: multibase
Public (DID Key): did:key:zDnaehhixsMwU1AUc7ErTrTrr9F2RXrkYkVykMRNjVWJKpXtf
一番最後の行に公開鍵ができました。これを登録します。
ちなみにこれは誰でも見れる情報になるので、もちろんこの記事に書いてしまっても構いません。
回復鍵(秘密鍵)は絶対書いちゃだめですけどね。
did Documentに鍵を登録
自分のdid document を取得します。yodogawa.bsky.socialのはここにあります。
修正前の中身は以下。
{
"sig": "qqU5yXNJuRpyifN9mrZWFstD4M84P2KI-yhn-TKvuXhBNV4d3T1hPY3_kkaGsZSUhWowC-iWB1xypJKAndgTTQ",
"prev": "bafyreib5utylzndcegegjjccx5kcync6m3f5o2f3bs5b557g4h7apq454y",
"type": "plc_operation",
"services": {
"atproto_pds": {
"type": "AtprotoPersonalDataServer",
"endpoint": "https://porcini.us-east.host.bsky.network"
}
},
"alsoKnownAs": [
"at://yodogawa.bsky.social"
],
"rotationKeys": [
"did:key:zQ3shhCGUqDKjStzuDxPkTxN6ujddP4RkEKJJouJGRRkaLGbg",
"did:key:zQ3shpKnbdPx3g3CmPf5cRVTPe1HtSwVn5ish3wSnDPQCbLJK"
],
"verificationMethods": {
"atproto": "did:key:zQ3shVgmB7TmFbG99gde8CfsjFUgunsAMNwuKkUdomSqg7zh1"
}
}
これを適当なファイル( 例: identity_document.json
)に保存して、中身を編集します。
sig
フィールドとprev
フィールドを消す
{
#### sigとprevを削除 ####
"type": "plc_operation",
"services": {
"atproto_pds": {
"type": "AtprotoPersonalDataServer",
"endpoint": "https://porcini.us-east.host.bsky.network"
}
},
"alsoKnownAs": [
"at://yodogawa.bsky.social"
],
"rotationKeys": [
"did:key:zQ3shhCGUqDKjStzuDxPkTxN6ujddP4RkEKJJouJGRRkaLGbg",
"did:key:zQ3shpKnbdPx3g3CmPf5cRVTPe1HtSwVn5ish3wSnDPQCbLJK"
],
"verificationMethods": {
"atproto": "did:key:zQ3shVgmB7TmFbG99gde8CfsjFUgunsAMNwuKkUdomSqg7zh1"
}
}
rotationKeys
の先頭に公開鍵を追加する
{
"type": "plc_operation",
"services": {
"atproto_pds": {
"type": "AtprotoPersonalDataServer",
"endpoint": "https://porcini.us-east.host.bsky.network"
}
},
"alsoKnownAs": [
"at://yodogawa.bsky.social"
],
"rotationKeys": [
"did:key:zDnaehhixsMwU1AUc7ErTrTrr9F2RXrkYkVykMRNjVWJKpXtf", #### 作った公開鍵(回復鍵じゃないよ!)を登録
"did:key:zQ3shhCGUqDKjStzuDxPkTxN6ujddP4RkEKJJouJGRRkaLGbg",
"did:key:zQ3shpKnbdPx3g3CmPf5cRVTPe1HtSwVn5ish3wSnDPQCbLJK"
],
"verificationMethods": {
"atproto": "did:key:zQ3shVgmB7TmFbG99gde8CfsjFUgunsAMNwuKkUdomSqg7zh1"
}
}
- token フィールドを作ってtokenを書く
{
"token": "ここにメールで受け取ったtokenを書いてね!", #### tokenの受け取り方は後述
"type": "plc_operation",
"services": {
"atproto_pds": {
"type": "AtprotoPersonalDataServer",
"endpoint": "https://porcini.us-east.host.bsky.network"
}
},
"alsoKnownAs": [
"at://yodogawa.bsky.social"
],
"rotationKeys": [
"did:key:zDnaehhixsMwU1AUc7ErTrTrr9F2RXrkYkVykMRNjVWJKpXtf",
"did:key:zQ3shhCGUqDKjStzuDxPkTxN6ujddP4RkEKJJouJGRRkaLGbg",
"did:key:zQ3shpKnbdPx3g3CmPf5cRVTPe1HtSwVn5ish3wSnDPQCbLJK"
],
"verificationMethods": {
"atproto": "did:key:zQ3shVgmB7TmFbG99gde8CfsjFUgunsAMNwuKkUdomSqg7zh1"
}
}
↑の3に必要なtokenを発行します。
tokenは自分のアカウントに紐づけているメールアドレスに届くので、 token
フィールドにそのままコピペしましょう。
~/go/bin/goat account plc request-token
- did Documentに署名する
↑までで作ったdid Document(
identity_document.json
)を下記コマンドで署名します。
署名後のdid Documentはファイルの形でほしいのでリダイレクトしておきます。
$ ~/go/bin/goat account plc sign identity_document.json > ./signed_identity_document.json
最終的に中身はこうなりました。
{
"prev": "bafyreih76vxs6hq7wbvrjyqduk6akmwnqjfails5xydsuelykkfqkkzn3a",
"type": "plc_operation",
"services": {
"atproto_pds": {
"type": "AtprotoPersonalDataServer",
"endpoint": "https://porcini.us-east.host.bsky.network"
}
},
"alsoKnownAs": [
"at://yodogawa.bsky.social"
],
"rotationKeys": [
"did:key:zDnaehhixsMwU1AUc7ErTrTrr9F2RXrkYkVykMRNjVWJKpXtf",
"did:key:zQ3shhCGUqDKjStzuDxPkTxN6ujddP4RkEKJJouJGRRkaLGbg",
"did:key:zQ3shpKnbdPx3g3CmPf5cRVTPe1HtSwVn5ish3wSnDPQCbLJK"
],
"verificationMethods": {
"atproto": "did:key:zQ3shVgmB7TmFbG99gde8CfsjFUgunsAMNwuKkUdomSqg7zh1"
},
"sig": "uUtcpzf_PD5kXhjIJArBsn6xwh66dn_608lV5uWbbP8FeAnnuJ5K8TXJ2kRWB-du2yClGMR7JimeG5muLQgnDQ"
}
これをサーバーに登録します。
did Documentを登録
$ ~/go/bin/goat account plc submit signed_identity_document.json
正しく登録されたかを確認してみましょう。
$ curl -s https://plc.directory/did:plc:hwspbpfumiqyqzfeik7vilbu/log/last | jq
{
"sig": "uUtcpzf_PD5kXhjIJArBsn6xwh66dn_608lV5uWbbP8FeAnnuJ5K8TXJ2kRWB-du2yClGMR7JimeG5muLQgnDQ",
"prev": "bafyreih76vxs6hq7wbvrjyqduk6akmwnqjfails5xydsuelykkfqkkzn3a",
"type": "plc_operation",
"services": {
"atproto_pds": {
"type": "AtprotoPersonalDataServer",
"endpoint": "https://porcini.us-east.host.bsky.network"
}
},
"alsoKnownAs": [
"at://yodogawa.bsky.social"
],
"rotationKeys": [
"did:key:zDnaehhixsMwU1AUc7ErTrTrr9F2RXrkYkVykMRNjVWJKpXtf",
"did:key:zQ3shhCGUqDKjStzuDxPkTxN6ujddP4RkEKJJouJGRRkaLGbg",
"did:key:zQ3shpKnbdPx3g3CmPf5cRVTPe1HtSwVn5ish3wSnDPQCbLJK"
],
"verificationMethods": {
"atproto": "did:key:zQ3shVgmB7TmFbG99gde8CfsjFUgunsAMNwuKkUdomSqg7zh1"
}
}
回復鍵に対応した公開鍵が rotationsKeys
に正しく追加されています。
作業は以上となります。お疲れ様でした。
めんどくない?
一般的に回復鍵が広まる頃にはさすがに運営がもっと簡単にクリックひとつでできるような、webツールやクライアントの機能を作ってると思います。なのでこの作業を普通のユーザーがやる必要はさすがにないでしょう。
"思い出づくり"というのはそういう意味でした。