インポートした公開鍵にローカル署名をしようとしたところ、
gpg: no default secret key: No public key
のエラーで署名に失敗した。
秘密鍵と公開鍵の鍵ペアは存在しているはずなのに…と思いつつ、ファイルに対する署名を試したところ、こちらも同様の結果となった。
原因
gpg.conf の default-key オプション (もしくはコマンドラインの --default-key オプション) でローカルに存在する鍵を明示的に指定されていない場合に、 YubiKey が挿入されていると、ローカルに存在する鍵ではなく YubiKey に格納されている鍵に基づいて署名を行おうとするようだ。
ところが、 YubiKey に格納している鍵の使用を想定していない環境では、 YubiKey 格納している鍵の公開鍵がインポートされていないため、前述のエラーが発生してしまう、ということなのだろう。
なお、 YubiKey に GnuPG 鍵を格納していない場合の挙動については未確認。
回避方法
YubiKey 格納している鍵の使用を想定していない環境では、
- GnuPG 処理を行う前に忘れずに YubiKey を取り外す
- gpg.conf で default-key を設定しておく
のいずれか。
追記
YubiKey に格納している鍵の使用を想定していない別の環境で試していて気付いたが、どうやら、 gpg.conf の keyserver オプション (もしくはコマンドラインの --keyserver オプション) で公開鍵サーバーが指定されていると、 YubiKey に格納されている鍵に対する公開鍵を入手しようとする模様。
YubiKey に格納されている鍵の公開鍵が公開鍵サーバーで見つかれば、その公開鍵がインポートされた後、ローカルに存在する鍵ではなく YubiKey に格納されている鍵に基づいて署名が行う流れになっていたのかもしれない。 (YubiKey に格納されている鍵の公開鍵を公開鍵サーバーに登録していないため、実際の挙動は未確認。)
もっともこの場合は、エラーが出ないことで意図しない鍵で署名をしてしまうことに気づかないおそれがあるわけだが……いや、パスフレーズ入力時に気付くはずだな。
ちなみに、今回試したのは Windows 版の GnuPG ver.2.3.6, ver.2.3.7 と YubiKey 4 の組み合わせ。