Duplicity の復元に失敗しました: 秘密鍵がありません

Duplicity の復元に失敗しました: 秘密鍵がありません

ローカル マシンからリモート サーバーへのバックアップを設定しています。
ローカル マシンで gpg キーを生成し、次のテスト バックアップを実行しました。

PASSPHRASE="MyGPGPassphrase" duplicity --encrypt-key KeyID test scp://user@server/path

バックアップは正常に機能しているようで、サーバー上に 3 つのファイルが作成されます。

問題は、復元が機能しないことです。
ローカル マシン上のテスト ファイルを削除し、次のコマンドで復元を試みます。

PASSPHRASE="MyGPGPassphrase" duplicity --encrypt-key KeyID scp://user@server/path test

次のエラーが発生します:

Synchronizing remote metadata to local cache...
Copying duplicity-full-signatures.20151011T011134Z.sigtar.gpg to local cache.
GPGError: GPG Failed, see log below:
===== Begin GnuPG log =====
gpg: encrypted with 2048-bit RSA key, ID KeyID(of ssb), created 2015-10-11
"Name <email>"
gpg: public key decryption failed: Inappropriate ioctl for device
gpg: decryption failed: No secret key
===== End GnuPG log =====

次のコマンドでローカル マシン上の gpg キーをエクスポートしました。
gpg --export-secret-key KeyID > secret.key
gpg --armor --export KeyID > public.key

そして、次のようにしてサーバーにインポートしました:
gpg --import secret.key
gpg --import public.key

復元を実行するために他に何かする必要があるでしょうか?

編集:
PASSPHRASE 環境変数なしでコマンドを実行すると、duplicity --encrypt-key Key D test scp://user@host/pathパスフレーズを尋ねられることなくバックアップが作成されます。

出力には、file duplicity-full.20151011T115714Z.vol1.difftar.gpg--encrypt-key で指定されたものとは異なる KeyID がリストされます。リストされたキーはキーリングにありません。

答え1

問題は、リンクされた投稿に記載されているように、gpg 2.1 ではキー認証用のパイプからパスフレーズが廃止されることです。
復元を機能させるには、gpg エージェントを有効にして構成する必要があります。

以下を に追加します~/.gnupg/gpg.conf:

use-agent
pinentry-mode loopback

そしてあなたに~/.gnupg/gpg-agent.conf

pinentry-program /usr/bin/pinentry-gtk-2
allow-loopback-pinentry

次に、 でエージェントを再起動しますecho RELOADAGENT | gpg-connect-agent

キーがローカル マシン上にのみ存在する場合でも、復元は機能します。ただし、増分を作成するときにパスフレーズが要求されないのはなぜかまだわかりません。

答え2

sudoを使用して を実行するとduplicity、 のホーム ディレクトリで秘密鍵を検索するという問題が発生しましたroot。 秘密鍵が見つからないため、「秘密鍵がありません」というエラーが表示されましたが、少なくとも私にとっては、その理由がすぐにはわかりませんでした。

この問題の最も簡単な解決策はsudo、私の場合は、宛先ディレクトリに適切な権限を設定して の使用を避けることでした。

sudoが必須の場合は、適切なGPGオプションを設定して、ユーザーのGPGキーチェーンを使用する必要があります。duplicity--gpg-options "~user/.gnupg"コマンドに次のように追加します。この回答に記載されている

もしかしたら、これは他の誰かの役に立つかもしれません:-)

答え3

gpg 2.1 を使用していますか? 使用している場合、パスフレーズを env var 経由で配信するには、duplicity と gpg にいくつかの追加パラメータが必要です。
https://lists.launchpad.net/duplicity-team/msg02653.html

あるいは、単に PASSPHRASE を設定しないと、gpg-agent が秘密を尋ねて記憶します。

関連情報