gnupg 2.1.16ブロックがエントロピーを待っています


9

リリースのGnuPG 2.1.16から(現在は2.1.17)のエントロピーを待ってブロックするだけで最初の呼び出しで

注:これ、キーを生成する試みではなく、ファイルを復号化してエージェントを起動するためだけのものです。

初めてgpg-agentを起動すると、直接gpg2 file.gpgまたはのようなアプリケーションを使用してpasspinentryが表示され、パスフレーズを入力してヒットEnterすると、約15秒間ハングします。

default-cache-ttlのウィンドウ内の後続のすべての呼び出しは、すぐに実行されます。

--debug-allモードで実行すると、ハングが発生する期間が出力されます1

gpg: DBG: chan_6 <- S PROGRESS need_entropy X 30 120
gpg: DBG: chan_6 <- S PROGRESS need_entropy X 120 120
gpg: DBG: chan_6 <- S PROGRESS need_entropy X 30 120
gpg: DBG: chan_6 <- S PROGRESS need_entropy X 120 120
gpg: DBG: chan_6 <- S PROGRESS need_entropy X 30 120
...

エントロピープールを補足するためにrng-toolsをインストールしました。

cat /proc/sys/kernel/random/entropy_avail 
4094

そして、RNG-ツールを持っていなかったあるいはGnuPGの同じバージョンのマシンと比較しhaveged:何の遅延を示さないインストールし、

cat /proc/sys/kernel/random/entropy_avail
3783

だから、そこに表示されたプール内に十分なエントロピーこと。これはカーネル4.8.13と4.9でテストされました。

gpgは別のプールを使用しますか?エージェントを開始するときに、十分なエントロピーを提供する、または15秒の遅延を解消するにはどうすればよいですか?



1. 完全なデバッグログ


1
rng-toolsここで説明するようにインストールしましたか?serverfault.com/questions/214605/gpg-not-enough-entropy
オーレリアン

1
はい、私は私の質問でそれを明示的に述べました。場合は、私たちのリンクがよりアクセスして、あなたは気づいたかもしれません:)
jasonwryan

1
右@jasonwryanその行を逃しました:-/
aurelien

回答:


2

何が起こっているのかわかっていると思います。gnupgのagent / gpg-agent.cでは、この関数はlibgcryptからのメッセージを処理します。

/* This is our callback function for gcrypt progress messages.  It is
   set once at startup and dispatches progress messages to the
   corresponding threads of the agent.  */
static void 
agent_libgcrypt_progress_cb (void *data, const char *what, int printchar,
                             int current, int total)
{
  struct progress_dispatch_s *dispatch;
  npth_t mytid = npth_self ();

  (void)data;

  for (dispatch = progress_dispatch_list; dispatch; dispatch = dispatch->next)
    if (dispatch->ctrl && dispatch->tid == mytid)
      break;
  if (dispatch && dispatch->cb)
    dispatch->cb (dispatch->ctrl, what, printchar, current, total);

  /* Libgcrypt < 1.8 does not know about nPth and thus when it reads
   * from /dev/random this will block the process.  To mitigate this
   * problem we take a short nap when Libgcrypt tells us that it needs
   * more entropy.  This way other threads have chance to run.  */
#if GCRYPT_VERSION_NUMBER < 0x010800 /* 1.8.0 */
  if (what && !strcmp (what, "need_entropy"))
    npth_usleep (100000); /* 100ms */
#endif
}

npth_usleepの最後の部分は、2.1.15と2.1.17の間に追加されました。libgcryptが1.8.0より古い場合、これは条件付きでコンパイルされるため、簡単な修正はgnupgをlibgcrypt 1.8.0以降に対して再コンパイルすることです...残念ながら、そのバージョンはまだ存在していないようです。

奇妙なことに、/ dev / randomを読み取るlibgcryptに関するコメントは真実ではありません。エージェントをストレーシングすると、/ dev / urandomから読み取っており、ブロックせずに新しいgetrandom(2)syscallを使用していることがわかります。ただし、多くのneed_entropyメッセージを送信するため、npth_usleepがブロックされます。これらの行を削除すると、問題が修正されます。

npthはある種の協調マルチタスクライブラリのようであり、npth_usleepがおそらく生成する方法であるため、libgcryptがいつかブロックすることを決定した場合に備えて、その遅延を大幅に削減する方が良いかもしれないことを言及しておきます。(1msは目立ちません)


よくやった。そのため、libgcrypt 1.8.0がリリースされるまで(現在、私は1.7.5を使用しています)、それで立ち往生しています。利用可能なエントロピーの実際の量がブロッキングに影響しないことは奇妙に思われます。
jasonwryan 2016

ええ、1.7.5は入手可能な最新のものです。パッチを適用する場合は、2つのゼロを削除することで修正できます。4コメントを修正します。:)ところで私は同じ問題を抱えていました、私は本当に気づかなかっただけです。
stribika 2016

私が気づいたのは、それが私のマシンの1つにしか影響を与えておらず、そのような変動が本当に私のOCDを引き起こしているからです。パッチが役立つかどうかを確認します。乾杯。
jasonwryan 2016

適用このパッチと同じブロック(need_entropyを)。ああ!
jasonwryan 2016

gpg-agentの正しいバージョンが起動していることを確認しますか?起動にgpgを使用している場合は、常にデフォルトの/ usr / bin / gpg-agentが検索されます。で手動で開始できkillall gpg-agent; /path/to/gpg-agent --daemonます。
stribika 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.