GPG鍵束の復旧
カーネルパニックが起きて再起動した後、GPGがエラーを吐いて使えなくなった。
$ git commit -m 'wip'error: gpg failed to sign the data:gpg: keydb_search failed: Invalid argumentgpg: skipped "2D9B751B97D95DFA": Invalid argument[GNUPG:] INV_SGNR 0 2D9B751B97D95DFA[GNUPG:] FAILURE sign 134250544gpg: signing failed: Invalid argument
fatal: failed to write commit object
$ gpg -kgpg: keydb_search_first failed: Invalid argumentsqlite3で復旧
Section titled “sqlite3で復旧”public-keys.d/pubring.db はsqlite3データベースなので、これ自体が壊れている場合は以下のコマンドで復旧できる可能性がある。
cd $GNUPGHOME/public-keys.dsqlite3 pubring.db .recover | sqlite3 new.dbDBは破損しているけど鍵ファイル自体が残っている場合は手動で復元する。まずは壊れたDBをリネームしておく。ロックファイルはただの空ファイルなので消せばいい。
cd $GNUPGHOME/public-keys.dmv pubring.db o.dbrm pubring.db.lock次にマスターキーのバックアップからマスターキーを復元する。ここでも手順は書くがGPG鍵の管理が詳しい。
$ gpg --import secret-key.asc$ gpg --edit-key --expert C7BF8AB911C50EE3291DD45F1A3BB38A4BC27A81
gpg> trustマスターキー以外にも秘密鍵があるなら取り込んでおく。
$ ls private-keys-v1.d/8D5C126AA9B96D38590B92146BFCDF3FEB699318.keyBD461A92F8D624C4522D8A12757CCDEE37799A69.keyD2800BDE5ACCA5F66DD5478C40408331BCCEE037.key3つ存在しているが、このうち1つはマスターキーの秘密鍵なのでそれ以外を取り込む。ここでは 8D5C126AA9B96D38590B92146BFCDF3FEB699318 を取り込む例を示すが、だいたい同じ手順になる。GitHubにGPG鍵を登録するで示したようにGitHubから取り込んでもいい。
$ gpg --edit-key --expert C7BF8AB911C50EE3291DD45F1A3BB38A4BC27A81gpg (GnuPG) 2.4.7; Copyright (C) 2024 g10 Code GmbHThis is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law.
Secret key is available.
sec ed25519/1A3BB38A4BC27A81 created: 2025-03-17 expires: never usage: C trust: unknown validity: ultimate[ultimate] (1). KADOTA, Kyohei <lufia@lufia.org>
gpg> addkeyPlease select what kind of key you want: (3) DSA (sign only) (4) RSA (sign only) (5) Elgamal (encrypt only) (6) RSA (encrypt only) (7) DSA (set your own capabilities) (8) RSA (set your own capabilities) (10) ECC (sign only) (11) ECC (set your own capabilities) (12) ECC (encrypt only) (13) Existing key (14) Existing key from cardYour selection? 13Enter the keygrip: 8D5C126AA9B96D38590B92146BFCDF3FEB699318
Possible actions for this ECC key: Sign AuthenticateCurrent allowed actions: Sign
(S) Toggle the sign capability (A) Toggle the authenticate capability (Q) Finished
Your selection? qPlease specify how long the key should be valid. 0 = key does not expire <n> = key expires in n days <n>w = key expires in n weeks <n>m = key expires in n months <n>y = key expires in n yearsKey is valid for? (0) 3yKey expires at Sun Apr 30 13:17:29 2028 JSTIs this correct? (y/N) yReally create? (y/N) y
sec ed25519/1A3BB38A4BC27A81 created: 2025-03-17 expires: never usage: C trust: ultimate validity: ultimatessb ed25519/209D69BD8ED702E2 created: 2025-05-01 expires: 2028-04-30 usage: S[ultimate] (1). KADOTA, Kyohei <lufia@lufia.org>
gpg> saveこれでマスターキーの秘密鍵は不要になるので消す。
gpg-connect-agent 'DELETE_KEY D2800BDE5ACCA5F66DD5478C40408331BCCEE037' /byeGitのコミットに本人確認の署名をするで設定している場合は、再構築すると鍵のIDが変わるので user.signingkey も変更する。
これで問題がなければバックアップを消す。
cd $GNUPGHOME/public-keys.drm o.db