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のコードを要求します。

Bash
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でログインしその出力から得ます。

Bash
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 として保存しました。

Bash
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に書き込みます。

Bash
curl -X POST https://bsky.social/xrpc/com.atproto.identity.submitPlcOperation \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer $(cat access)" \
     -d @ope.json

特になんの応答もないので正しく書き込まれたのか確認します。

Bash
curl https://plc.directory/自分のDID | jq .

出力です。

JSON
{
  "@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に戻っていればこのような事故はなかったでしょう。

ubanis(Bluesky)
ubanis(Bluesky) @ubanis.com

futanari artist R18 ふたなり絵を描きます Web https://ubanis.com Links https://woosh.link/ubanis.com 絵 art https://bsky.app/profile/did:plc:lmftezsq52hi53taz762s7pc/feed/aaalx2yzi3h5u

No comments yet