PLCに間違ったverificatonMethodsを書き込んでしまったら

上記で書いたようにセルフホストPDSからBluesky公式PDSに戻る過程でPLC Directoryに間違ったverificationMethodsを書き込んでしまい(まずよく分かっていなかった)、Blueskyにログインはできてもまったく操作不能なうえにgoatコマンドによるPLC操作も https://boat.kelinci.net/plc-applicator での操作も全てBadJwtSignature > jwt signature does not match jwt issuer になってしまうようになりどうしようもなくなっていました。(通常のPDSではなんとかなるものがBluesky公式だとこうなってしまうらしい) 偶然過去に作って本体が行方不明だった rotation key を旧PDSに残っていたファイル(/pds/actors/2文字の数字かアルファベット/自分のDID/key というファイル)から復元してもらいここからなんとか verificatonMethodsを書き換えることに。 まずplc operationのためのトークンを取得しなければいけないのですがこれがgoat account plc request-tokenコマンドはjwt signatureなんとかなエラーになってしまいます。 そんなわけでgoat account service-auth-offlineで上記の鍵を使いBearerトークンを生成しそこからplc operationのためのトークンを取得します。ここではBearerトークンとしてtokenに出力しそのトークンを使ってplc operationのコードを要求します。 goat account service-auth-offline\ --atproto-signing-key {MULTIKEY}\ --iss {自分のDID}\ --lxm com.atproto.identity.requestPlcOperationSignature\ --aud did:web:bsky.social > token curl -X POST https://bsky.social/xrpc/com.atproto.identity.requestPlcOperationSignature \ -H "Authorization: Bearer $(cat token)" この後登録されていたメールアドレスにSign in to Blueskyという件名のメールが届きXXXXX-XXXXX という形式のコードを得られました。 署名されたDID documentを作るために accessJwt が必要なのでcurlでログインしその出力から得ます。 curl -X POST https://bsky.social/xrpc/com.atproto.server.createSession \ -H "Content-Type: application/json" \ -d '{ "identifier": "ハンドル名", "password": "パスワード" }' > jwt.json 出力されたjwt.jsonファイルからaccessJwt の項目を見つけそれを access として保存しました。 この accessと先ほどのメールのコードを使い署名されたDID Documentを作成します。 各項目は goat account login -u ubanis.com -p パスワード --pds-host Blueskyでの所属PDSのURL してから goat account plc recommended で表示された内容に合わせます。 おかしくなっていた verificatonMethods ではないことを確認し、curlコマンドからの出力を ope.json として保存しました。 curl -X POST https://bsky.social/xrpc/com.atproto.identity.signPlcOperation \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $(cat access)" \ -d '{ "token": "メールに届いたコード", "alsoKnownAs": [ "at://ハンドル名" ], "rotationKeys": [ "did:key:zQ3shhCGUqDKjStzuDxPkTxN6ujddP4RkEKJJouJGRRkaLGbg", "did:key:zQ3shpKnbdPx3g3CmPf5cRVTPe1HtSwVn5ish3wSnDPQCbLJK" ], "verificationMethods": { "atproto": "did:key:zQ3shekatj4YwJqyUpWKqmjrYvCsxCMCfS56yXHXhPxKeFTgj" }, "services": { "atproto_pds": { "type": "AtprotoPersonalDataServer", "endpoint": "https://shimeji.us-east.host.bsky.network" } } }' > ope.json 最後に accessトークンを使いPLC Directoryに書き込みます。 curl -X POST https://bsky.social/xrpc/com.atproto.identity.submitPlcOperation \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $(cat access)" \ -d @ope.json 特になんの応答もないので正しく書き込まれたのか確認します。 curl https://plc.directory/自分のDID | jq . 出力です。 { "@context": [ "https://www.w3.org/ns/did/v1", "https://w3id.org/security/multikey/v1", "https://w3id.org/security/suites/secp256k1-2019/v1" ], "id": "did:plc:lmftezsq52hi53taz762s7pc", "alsoKnownAs": [ "at://ubanis.com" ], "verificationMethod": [ { "id": "did:plc:lmftezsq52hi53taz762s7pc#atproto", "type": "Multikey", "controller": "did:plc:lmftezsq52hi53taz762s7pc", "publicKeyMultibase": "zQ3shekatj4YwJqyUpWKqmjrYvCsxCMCfS56yXHXhPxKeFTgj" } ], "service": [ { "id": "#atproto_pds", "type": "AtprotoPersonalDataServer", "serviceEndpoint": "https://shimeji.us-east.host.bsky.network" } ] } こうして復旧が完了しました。 このお二人の親身なご協力のおかげです。本当にありがとうございました。BaileyさんはPDSを簡単に移動できるPDS Mooverの作者の方です。多分これで普通に公式PDSに戻っていればこのような事故はなかったでしょう。