ユーザーの操作なしでgpgキーを生成する方法は?


13

私がで見つかったhttps://www.gnupg.org/documentation/manuals/gnupg/Unattended-GPG-key-generation.html#Unattended-GPG-key-generationユーザーとの対話なしにGPGキーを生成するための方法ですが、それはできません動作するようです。

私のスクリプトは次のとおりです。

#!/usr/bin/env bash
rm -rf .gnupg
mkdir -m 0700 .gnupg
touch .gnupg/gpg.conf
chmod 600 .gnupg/gpg.conf
tail -n +4 /usr/share/gnupg2/gpg-conf.skel > .gnupg/gpg.conf

touch .gnupg/{pub,sec}ring.gpg


cat >.gnupg/foo <<EOF
    %echo Generating a basic OpenPGP key
    Key-Type: RSA
    Key-Length: 2048
    Subkey-Type: RSA
    Subkey-Length: 2048
    Name-Real: User 1
    Name-Comment: User 1
    Name-Email: user@1.com
    Expire-Date: 0
    Passphrase: kljfhslfjkhsaljkhsdflgjkhsd
    %pubring foo.pub
    %secring foo.sec
    # Do a commit here, so that we can later print "done" :-)
    %commit
    %echo done
EOF

gpg2 --verbose --batch --gen-key .gnupg/foo

実行すると、次のように表示されます。

=$ ./gen.keys.sh 
gpg: Generating a basic OpenPGP key
gpg: no running gpg-agent - starting one
gpg: writing public key to `foo.pub'
gpg: writing secret key to `foo.sec'

しかし、その後はハングします。

その間に、このユーザーのpsツリーを確認すると、次のように表示されます。

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
tstpg    22603  0.0  0.0  24108  5688 pts/9    Ss   14:59   0:00 -bash
tstpg    22624  0.0  0.0  13688  3168 pts/9    S+   14:59   0:00  \_ bash ./gen.keys.sh
tstpg    22632  0.2  0.0  27428  3676 pts/9    SL+  14:59   0:00      \_ gpg2 --verbose --batch --gen-key .gnupg/foo
tstpg    22634  0.3  0.0  18072  2884 pts/9    SL+  14:59   0:00          \_ gpg-agent --server

〜/ .gnupg / gpg.confには、エージェントに関する記述がなく、エージェントが何をしようとしているのかわかりません。

foo.pub/foo.secファイルはホームディレクトリに生成されますが、空です。

私は何が欠けていますか?ユーザーの操作なしでキーを生成する方法は?

バージョン:

  • gpg(GnuPG)2.0.26
  • libgcrypt 1.6.2

回答:


4

エントロピーが不足している可能性があります。キーの生成には、非常に高品質の乱数が多数必要です。コンピューターに高品質のランダム性を提供するユーザーのアクティビティがなければ、エントロピープールは生成によって使い果たされ、生成プロセスはハングし、プールが補充されるのを待ちます。

満足度を高めるための選択肢は次のとおりです。

  1. 非ブロッキング擬似乱数ジェネレータを使用するようにgpgを再構成します。これは最も賢明ではありません(以下を参照)。

  2. ソフトウェアソリューションを使用して、既存のシステム状態からより多くのエントロピーを導出します(カーネルは、システム状態から導出するエントロピーの量について特に保守的です。特に、CPUやNICのタイミングなど、その状態に直接入力がない場合)。あなたが指摘したように、hagedはそのような解決策の1つです。

  3. 高度なエントロピーの別の物理ソースをコンピューターに提供します。エントロピーキーOneRNGなどのデバイスは、この要件を満たすことができます(エントロピーキーを所有していることを除けば、どちらの製品にも接続できず、非常に満足しています)。

編集:mzhaaseは、/ dev / urandomと/ dev / randomのこの記事へのコメントで私の注意を引きます(多くのおかげで、素晴らしい記事です!)urandom。キーの作成に使用するのが嫌いです。実際、この記事では、2つのソースが同等であるとは述べておらず、

Linuxの/ dev / urandomは、カーネルがエントロピーを収集する前に、それほどランダムではない数字を喜んで提供します。それはいつですか?システムの起動時に、コンピューターを起動します。

つまり、ブート後、urandomPRNGが十分なエントロピーで初期化されるまで、キー生成にPRNGを使用するのは本当に危険です。特に無人のヘッドレスサーバーでは、時間がかかる場合があり、システムが明示的に通知しないため、いつしきい値に到達したかはわかりません。

さて、/dev/random数字を発行する準備ができていれば、エントロピープールが十分に深く、urandom適切に初期化されていると合理的に推測できます。しかし、/dev/random使用する前にブロッキングをチェックする必要がある場合urandom(再起動するよりもキーを生成する頻度が低いため、そうなる可能性が高い)/dev/random、キーを生成するためにfromの数値を使用することもできます。


2
それが問題でした。havegedデーモンが追加され、現在は正常に動作するようになりました-0.7秒以内のキー生成。
eijeze

PRNGが「良い」ものではないというのは神話です。実際、/ dev / randomと/ dev / urandomは同じPRNGを使用します。計算上のみ安全なアルゴリズムには真のランダム性は必要ありません(そして/ dev / randomも/ dev / urandomも実際に真のランダム性を与えることはできません:そのために実際にランダムなことを測定する必要があります)。真のランダム性を必要とする暗号化は、ワンタイムパッドのような情報的に安全なアルゴリズムのみです。このリンクでは、これについて詳しく説明しています:2uo.de/myths-about-urandom
mzhaase

@mzhaase奇妙なことに、私は今週初めにそのリンクに出会い、それを読みました。上記の回答を編集して記事を反映しますが、完全に同意するわけではありません。私はまた、奇妙なことに、おそらくシステムから物理的に接続されたエントロピーを生成するために量子トンネリングを使用するハードウェアデバイスを持っているため、システムからおそらく真のランダム性を得ることに注意してください/dev/random(したがって、/dev/urandomほぼ常に予測不可能な数値)上記)。
マッドハッター

1
havegedはうまく動作し、キーは1秒で生成されます。apt-get install havegedを実行してから、haveged
waza123を

@ waza123の良い点ですが、おそらく2年前にeijezeによって既に作成されたものです(上記の最初のコメントを見てください)。
MadHatter

2

スクリプトを機能させる簡単な変更がいくつかあることがわかりました。また、キーが作成されると自動的にテストされるように、いくつかのテストも含めました。

また、キーテストを自動化できるようにパスワードを削除しました。

#!/usr/bin/env bash
rm -rf .gnupg
mkdir -m 0700 .gnupg
touch .gnupg/gpg.conf
chmod 600 .gnupg/gpg.conf
tail -n +4 /usr/share/gnupg2/gpg-conf.skel > .gnupg/gpg.conf

cd .gnupg
# I removed this line since these are created if a list key is done.
# touch .gnupg/{pub,sec}ring.gpg
gpg2 --list-keys


cat >keydetails <<EOF
    %echo Generating a basic OpenPGP key
    Key-Type: RSA
    Key-Length: 2048
    Subkey-Type: RSA
    Subkey-Length: 2048
    Name-Real: User 1
    Name-Comment: User 1
    Name-Email: user@1.com
    Expire-Date: 0
    %no-ask-passphrase
    %no-protection
    %pubring pubring.kbx
    %secring trustdb.gpg
    # Do a commit here, so that we can later print "done" :-)
    %commit
    %echo done
EOF

gpg2 --verbose --batch --gen-key keydetails

# Set trust to 5 for the key so we can encrypt without prompt.
echo -e "5\ny\n" |  gpg2 --command-fd 0 --expert --edit-key user@1.com trust;

# Test that the key was created and the permission the trust was set.
gpg2 --list-keys

# Test the key can encrypt and decrypt.
gpg2 -e -a -r user@1.com keydetails

# Delete the options and decrypt the original to stdout.
rm keydetails
gpg2 -d keydetails.asc
rm keydetails.asc

1

自動化されたアプリケーションインストール用のキーを生成する一環としてこれを解決しました。entroyを生成するために ' rngd 'パッケージをインストールして起動すると、問題が修正されます。インストールと使用が簡単。

ここにコードがありますです。

  • rngd(/dev/hwrandomエントロピーのソースを提供するためにしますデフォルトでは変更可能)
  • 単純なテンプレートをコピーします(jinjaテンプレートの電子メールと名前を必要なものに置き換えます)
  • gpgを使用してキーを生成します
  • ローカルキーリングにインポートします

提供urandomされているサンプルコードでは、ソースとして使用されていますが、使用しないでください。wiki.archlinux.org/index.php/Rng-tools Warning: Some tutorials available in the Internet, and even early versions of rng-tools package, recommend the following line for systems without TRGN: RNGD_OPTS="-o /dev/random -r /dev/urandom" Of course, this is a really bad idea, since you are simple filling the kernel entropy pool with entropy coming from the kernel itself! If your system does not have an available TRGN consider using haveged instead. See FS#34580 for details.
keyneom

@keyneom rngdは/dev/hwrandomデフォルトで使用され、変更可能です。manページを参照してください。
-xddsg

そうです、リンク先のコードでは明示的に使用urandomしているので、そうすることはお勧めできません。
keyneom

-1

使用できるものを次に示しますが、現在のスクリプトに影響を与えないように、このスクリプトを新しいターミナルで実行することをお勧めします。このスクリプトは、ユーザーがスクリプトを終了するまで、マシンをビジー状態にして無限ループにとどまることにより、エントロピーを生成し続けます。キーの生成が完了するまで、ユーザーの操作は必要ありません。スクリプトは、ファイルを永久にリストするだけです。

マシンとキーのサイズによっては、生成に数分(場合によっては10+)かかりますが、対話する必要がないのは良いことです。

#!/bin/sh

while true;
do find * / && find * / && find * / && find * / && find * / && find * / && find * / && find * / && find * /;

echo "Press ctrl+c to exit this infinite loop"
sleep 2;
done

ファイルシステムで検索を行うことは、その動作が予測可能で再現可能であるため、真に安全なエントロピーのソースを生成しません。
ジョフリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.