web-dev-qa-db-ja.com

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

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: [email protected]
    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
13
eijeze

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

あなたの選択は、満足度の高い順に、

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

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

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

Edit:mzhaaseはコメントで私の注意を この記事/ dev/urandomと/ dev/randomの比較 (forおかげで、それは素晴らしい記事です!)そして、キーを作成するためにurandomを使用する私の嫌いなことに問題を抱えています。実際、この記事は2つのソースが同等であるとは述べておらず、

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

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

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

4
MadHatter

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

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

#!/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: [email protected]
    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 [email protected] 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 [email protected] keydetails

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

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

これがコードです

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