117

でバックアップを自動化しようとしていますduplicityが、結果をテストすると、

gpg:公開鍵の復号化に失敗しました:パスフレーズが正しくありません

使用しているパスフレーズが実際に対応するgpg秘密鍵に関連付けられているパスフレーズであるかどうかを確認したいのですが、gpgコマンドラインオプションに「何も暗号化または復号化しないでください。確認してください」と表示されません。正しいパスフレーズを使用しています。」

これは、おそらく私が(まだ)GnuPrivacyGuardを誤解していることを示唆しています。(私が泣くまで私をからかう傾向があります。)

gpgにパスフレーズの確認を依頼するのは理にかなっていますか?もしそうなら、どのように?

4

4 に答える 4

122

これを行うための組み込みの方法はありませんが、何も変更せず、パスフレーズを確認するだけのテストを作成するのは簡単です。

指定しなかったため、v2より前のバージョンのGnuPGを使用しており、コマンドラインインタープリターにBashを使用するLinuxを使用していると想定します。

ここと以下でコマンドを実行し、各部分の機能を説明します-(注:以下はGnuPGシリーズバージョン1の場合であり、GnuPGシリーズv2の場合は以下を参照してください)

echo "1234" | gpg --no-use-agent -o /dev/null --local-user <KEYID> -as - && echo "The correct passphrase was entered for this key"

まず、テキストをパイプしてGnuPGに署名しますecho "1234" |。実際には何も署名したくないので、これは単なるテストなので、役に立たないテキストに署名します。

--no-use-agent次に、gpgに;でキーエージェントを使用しないように指示します。キーエージェントによっては、成功しても「0」が返されない場合があるため、これは後で重要になります。パスフレーズの成功を確認するだけです。

次に、署名されたデータをファイルに直接入れるようにgpgに指示し/dev/nullます。つまり、データを破棄し、結果をターミナルに書き込みません。注:Linux / Unixのバリアントを使用していない場合、このファイルは存在しない可能性があります。Windowsでは、-o /dev/null一部を省略して、署名されたデータを画面に書き込むことを許可する必要がある場合があります。

次に、を使用して、テストを実行するキーを指定します--local-user 012345。KeyIDを使用して特異性を最大化するか、ユーザー名を使用して、ニーズに最も適したものを使用できます。

次に-as、ASCII出力モードを有効にし、署名のコンテキストモードを設定するを指定します。その後-、GnuPGに、標準入力から署名するデータを取得するように指示します。これは、指定したコマンドの最初の部分ですecho "1234" |

最後に&& echo "A message that indicates success"、「&&」は、前のコマンドが成功した場合にこのメッセージを出力することを意味します。上記のコマンドの成功は、出力がまったくないことで示されるため、これはわかりやすくするために追加されたものです。

何が起こっているのか、そしてそれをどのように使用してあなたがやりたいテストを行うことができるのかを理解するのに十分明確であることを願っています。不明な点やご不明な点がございましたら、お気軽にお問い合わせください。幸運を!

[編集]-GnuPGv2を使用している場合は、上記のコマンドを次のように少し変更する必要があります。

echo "1234" | gpg2 --batch --passphrase-fd 1 -o /dev/null --local-user <KEYID> -as - && echo "The correct passphrase was entered for this key"

その理由は、GnuPG v2はパスフレーズがエージェントを介して取得されることを想定しているため、エージェントの使用を無効にし--no-use-agentて目的の効果を得ることができないためです。代わりに、「バッチ」プロセスを実行することをGnuPG v2に通知し、オプションを使用してSTDIN(標準で)からパスフレーズを取得する必要があります--passphrase-fd 1

于 2012-07-14T14:04:57.147 に答える
25

これは、パスフレーズがOKかどうかを確認するための短いコマンドラインです。

gpg --export-secret-keys -a <KEYID> > /dev/null && echo OK
于 2019-04-17T21:17:47.900 に答える
22

私にとって、パスフレーズをチェックする簡単な方法は、gpg --passwd速記を使用することです。パスフレーズを変更しようとします。手順は古いパスフレーズを確認することです。次に、新しいパスフレーズプロンプトで[キャンセル]をクリックすると、パスフレーズがそのまま保持されます。

gpg --passwd <your-user-id>

ford04で述べたように、GPGの新しいバージョンでは、上記のコマンドを次のように改善できます。

gpg --dry-run --passwd <your-user-id>

これはさらに良いです。コミットを参照してください。

于 2020-05-14T17:11:09.503 に答える
5

gpg -o /dev/null警告ここのトップアンサーが示唆するようにエコーを使用しないでください。これにより、/ dev / nullに無効な権限が付与され、ファイルが破損し/dev/nullます。このコマンドを実行するときに/dev/ nullファイルの権限を確認して、これを証明できます。

あなたはこれを使うことができます:

echo "1234" | gpg -q --batch --status-fd 1 --sign --local-user $KEY_ID --passphrase-fd 0 > /dev/null

このためのbashスクリプトも作成しました(これはCentos 8で動作しています)。このスクリプトはパスフレーズを要求します。それが無効な場合は、有効なパスフレーズの入力を要求し続けます。また、引数として間違った、または存在しないKEY_IDを入力した場合も、それを検証できます。

#!/bin/bash
# usage ./gpgcron KEYID   | ./gpgcron 2B705B8B6FA943B1
script_path=$(dirname $(realpath -s $0))
script_name=$(basename -- "$0")
GPG_CACHE_BIN="/usr/libexec/gpg-preset-passphrase"
KEY_ID=$1
KEY_GRIP=$(gpg --with-keygrip --list-secret-keys $KEY_ID | grep -Pom1 '^ *Keygrip += +\K.*')
RETVAL=$?
if [[ $RETVAL -ne 0 || -z $KEY_ID ]]; then
    echo "Please provide correct KEY_ID. Example ./$script_name KEY_ID"
    exit 1
fi

export GPG_TTY=$(tty)

function set_gpg_cachepass {
    read -s -p "[$script_name | input]: Enter passphrase to cache into gpg-agent: " PASSPHRASE; echo
    $GPG_CACHE_BIN -c $KEY_GRIP <<< $PASSPHRASE
    RETVAL=$?
    echo "[$script_name | info ]: gpg-preset-passphrase return code: [$RETVAL]"
    if [ $RETVAL = 0 ]; then
        echo "[$script_name | info ]: A passphrase has been set and cached in gpg-agent"
        echo "[$script_name | info ]: Paraphrase set return code: [$RETVAL]"
        gpg_validatepass
    else
        echo "[$script_name | info ]: Unsuccessful error occured: [$RETVAL]"
        set_gpg_cachepass
    fi
}

function gpg_validatepass {
    echo "[$script_name | info ]: Validating passphrase cached in gpg-agent ..."
    echo "1234" | gpg -q --batch --status-fd 1 --sign --local-user $KEY_ID --passphrase-fd 0 > /dev/null
    RETVAL=$?
    if [ $RETVAL = 0 ]; then
        echo "[$script_name | info ]: OK, valid passphrase has been cached in gpg-agent"
    else
        echo "[$script_name | info ]: Warning, invalid passphrase or no passphrase is cached in gpg-agent"
        set_gpg_cachepass
    fi
}

RES=$(echo "KEYINFO --no-ask $KEY_GRIP Err Pmt Des" | gpg-connect-agent | awk '{ print $7 }')
if [ "$RES" == "1" ]; then
    echo "[$script_name | info ]: OK, passphrase is already cached in gpg agent for KEY_ID of [$KEY_ID]"
    gpg_validatepass
else
    echo "[$script_name | info ]: Warning, no passphrase is cached in gpg agent for KEY_ID of [$KEY_ID]"
    set_gpg_cachepass
fi

パスワードがgpg-agentにキャッシュされていない場合の出力例:

[root@earth gpg]# ./gpgcron 2B705B8B6FA943B2
[gpgcron | info ]: Warning, no passphrase is cached in gpg agent for KEY_ID of [2B705B8B6FA943B2]
[gpgcron | input]: Enter passphrase to cache into gpg-agent:

無効なパスフレーズが入力された場合の出力例(質問を続けます):

[root@earth gpg]# ./gpgcron 2B705B8B6FA943B2
[gpgcron | info ]: OK, passphrase is already cached in gpg agent for KEY_ID of [2B705B8B6FA943B2]
[gpgcron | info ]: Validating passphrase cached in gpg-agent ...
gpg: signing failed: Bad passphrase
gpg: signing failed: Bad passphrase
[gpgcron | info ]: Warning, invalid passphrase or no passphrase is cached in gpg-agent
[gpgcron | input]: Enter passphrase to cache into gpg-agent:

有効なパスフレーズが入力された場合の出力例:

[gpgcron | input]: Enter passphrase to cache into gpg-agent:
[gpgcron | info ]: gpg-preset-passphrase return code: [0]
[gpgcron | info ]: A passphrase has been set and cached in gpg-agent
[gpgcron | info ]: Paraphrase set return code: [0]
[gpgcron | info ]: Validating passphrase cached in gpg-agent ...
[gpgcron | info ]: OK, valid passphrase has been cached in gpg-agent

有効なパスフレーズがキャッシュされると、次にこのスクリプトを実行するときに、パスフレーズの入力を求められません。したがって、このスクリプトはあなたの質問に対する解決策を提供します。「正しいパスフレーズを使用していることを確認してください」

于 2020-08-23T05:05:23.060 に答える