web-dev-qa-db-ja.com

Gnupgのpassphrase-fd引数を使用するには?

ユーザーの介入なしでGnuPGのdecryptコマンドを使用したいと思います。スクリプトの--passphrase-fd引数はまさに私が必要なもののようです。しかし、私はそれがどのように機能するのかわかりません-例が見つかりませんでした。

Windows環境とUNIX環境の両方で、このようなコマンドの例を教えてもらえますか?

(FYI、私はGnuPG 2を使用しています)。

すでにありがとう:)

29
Blackbird

GnuPG v2でgpgオプション--passphrase-fdを使用するには、--batchパラメーターを指定する必要があります。最初に--passphrase-fdがどのように機能するかを説明し、次に例を示します。

--passphrase-fdは、GnuPGにパスフレーズの送信元となる ファイル記述子 (-fd)を指示します。標準ファイル記述子は、STDIN(0)、STDOUT(1)、およびSTDERR(2)です。この質問のコンテキストについては、通常、STDIN(0)のみを考慮します。

パスフレーズの取得元を指定しなかったため、さまざまな方法でSTDIN(標準入力)の使用方法を示します。

--passphrase-fd 0は、現在のシェルへの入力からパスフレーズを取得するようGnuPGに指示します。たとえば、コンソール入力の次の行でパスフレーズデータをGnuPGに取得させる場合、コマンドと出力は次のようになります。

gpg2 --batch --passphrase-fd 0 --armor --decrypt /path/to/encrypted_file.pgp
<next line of input is passphrase followed by hitting enter>
gpg: encrypted with 1024-bit RSA key, ID EC18C175, created 2013-10-26
      "testkey4321 (4321) <[email protected]>"
this is a test... this is only a test...

上記の例では、パスフレーズはファイル記述子0(STDIN)を介して提供されました。これは、シェルの現在の標準入力に入力することで提供されました。

次の例では、実際に別のコマンドの出力である現在のシェルへの入力からパスフレーズを取得するようにGnuPGに指示します(エコー、この場合、単に指示を「エコー」します)。

echo "mypassphrase" | gpg2 --batch --passphrase-fd 0 --armor --decrypt /path/to/encrypted_file.pgp
gpg: encrypted with 1024-bit RSA key, ID EC18C175, created 2013-10-26
      "testkey4321 (4321) <[email protected]>"
this is a test... this is only a test...

パスフレーズを含むファイルの内容をSTDINにダンプする別の例-

cat /path/to/file_with_passphrase | gpg2 --batch --passphrase-fd 0 --armor --decrypt /path/to/encrypted_file.pgp
gpg: encrypted with 1024-bit RSA key, ID EC18C175, created 2013-10-26
      "testkey4321 (4321) <[email protected]>"
this is a test... this is only a test...

要約すると、--passphrase-fdは、GnuPGに標準​​のファイル記述子を介して必要なパスフレーズを送りたいことを伝えるだけです。 GnuPG v2とGnuPGの違いは、--batchパラメーターのみです。

上記の例は、Windows環境と* nix環境で同じように機能しますが、Windowsでの唯一の違いは、設定とバージョンに応じて、cattypeに順番に置き換える必要があります。ファイルの内容をSTDINにダンプします。

36
kylehuff

gpupgはまだパスワードプロンプトを表示しているため、kylehuffの答えは私にはまだ機能しません。

https://wiki.archlinux.org/index.php/GnuPG#Unattended_pa​​ssphrase によると、gnupgバージョン2.1.0以降では、--passphrase-fd

最初に、gpg-agent設定を編集してループバックピンエントリモードを許可します:〜/ .gnupg/gpg-agent.conf

allow-loopback-pinentry

Gpg-agentプロセスが実行されている場合は再起動して、変更を有効にします。

第二に、次のようなループバックモードを使用するには、コマンドラインパラメータを含めるようにアプリケーションを更新する必要があります。

$ gpg --pinentry-mode loopback ...
20
JodiTheTigger

GPG4win/gpg 2.2.3の使用:passphrase-fd 0とプロンプトをバイパスすると、次の動作を確認できます。

--pinentry-mode loopback
5
Sanjay Singh

私は最近自分でこれを理解しなければならなかったので、私はそれを鳴らす価値があると思いました。

Kylehuffによる答えは、ファイルを暗号化する場合は非常に良いですが、パイピングなどの入出力のリダイレクトが必要な場合は、パスフレーズを渡すために非_0_ファイル記述子を使用する例を次に示します。

_#!/usr/bin/env bash
# Set some variables for easy modding
Var_fd='9'
Var_pass_location="/path/to/passphrase.file"
Var_gpg_decrypt_opts="--passphrase-fd ${Var_fd} --decrypt"
Var_output_location="out.txt"
Arr_string=( "$@" )
# Open file descriptor and shove the passphrase file into it
exec ${Var_fd}<${Var_pass_location}
# Pipe input array though gpg and append to output file
cat <<<"${Arr_string[*]}" | $(which gpg) ${Var_gpg_decrypt_opts} >> ${Var_output_location}
# Do not forget to close the file descriptor
exec ${Var_fd}>&-
_

特別なユースケース以外では、秘密鍵のパスフレーズを保存することは一般に悪い考えまたは悪いセキュリティの慣行と見なされることに注意してください。 -また、パスフレーズがそのメソッドを介してアクセスできないように、終了時に記述子を閉じることを忘れないでください。 。上記のコードが好きな場合は、あまり使用されていないgpgファイル記述子オプションもカバーするため、 key generation でデバッグしたスクリプトを無人または有人でチェックアウトすることもできます。

編集/更新

そのため、バルク復号化操作をデバッグしてきましたが、ファイル記述子が自動的に閉じるように見えるか、GnuPGによって自動的に閉じられるように見えることを示す証拠があります。ビルドの確認 152 生ログの一番下、diffチェックの直前、暗号化されたデータの最初のブロックate次の2つのデータブロックを有効なパスフレーズなしで残すパスフレーズ。この操作に関連するスクリプトは次のとおりです。 script_decrypt.sh ビルドスクリプトは、上記の例に示すように、テストキーのパスフレーズをファイル記述子_9_に設定し、次に ヘルパースクリプト が呼び出されて、そのファイル記述子を使用します...それはファンキーなユースケースですが、物語の教訓は、GnuPGファイル記述子を使用して実装する予定のバルク復号化操作は全体として上記の手順に従う必要がある可能性が高いようですファイル記述子を適切に再オープンする機能。次の数回のプッシュでヘルパースクリプトを書き換えるので、 Travis-CI ビルドログが_152_より大きいことを確認して、ファイル記述子が閉じられる場所に対する解決策があるかどうかを確認します。 ..

...動作させるのに2回の試行だけで済むように、ビルドの違いを確認してください 154 暗号化されたファイルと未加工の入力ログの両方が一致します。仮説として、GnuPGまたはサブシェルのいずれかによる最初の使用後にファイル記述子がダンプされるため、バルク復号化を行うには、すべての復号化コマンドの前にパスフレーズを割り当てる必要があります。

これがすべての人にとって貴重であったことを願っています。

2
S0AndS0