見出し画像

プログラマー探偵の事件簿:永い間解決されないバグ"gpg: Fatal: passphrase-fd is invalid: Bad file descriptor" の進化

プログラムのバグには回避策が存在する。たいてい検索して同じようにすればなんとかなるが、今回はバグの要因が進化して回避できない問題に遭遇した時の話である。

事件の始まり

TWSNMP FCのLinux版をリリースする作業を簡単にしていた時のことである。リリース版を作成する時に毎回

パワード入力画面

のような画面でパッケージに署名するためのパスワードを入力しないければならない。頻繁に行う作業ではないのでパスワードを思い出すのが大変だ!パスワードを間違えるとリリース版の作成自体が失敗して、最初からやり直しになる。ストレス回避のためにパスワードをファイルから読み込んで署名する方法にしようとした。

簡単そうなことに落とし穴

Linux版のパッケージに署名するためには、dpkg-sigというコマンドを使う。このコマンドのマニュアル

https://manpages.debian.org/jessie/dpkg-sig/dpkg-sig.1.en.html

を読んで見ると

--passphrase-file, -f passphrase file
Tells gpg to use the passphrase in file to sign.
Be warned: Doing this is insecure, DON'T use this feature. However, in some cases (e.g. automatic signing on a buildd) this could be useful, and is still better than using a gpg-key without passphrase. You can gain at least some security by putting this file on a ramdisk, but it would be better to use gpg-agent(1).

dpkg-sigのマニュアル

があった。簡単にやりたいことができそうである。ここで終わればプログラマー探偵は登場しない。試してみると、

gpg: Fatal: passphrase-fd is invalid: Bad file descriptor
E: Signing failed. Error code: 512
gpgme gave error GPG Agent:177:  No passphrase given
ERROR: Could not finish exporting 'bulleseye'!
There have been errors!

のエラーで署名できない。パスワード入力画面の消えない。

エラーメッセージを頼りに検索

いつもにようにエラーメッセージを入力してGoogleさんに聞いてみる。いつものように、いくつか見つかる。どうやら永い間、修正されないバグのようである。

回避策に書いてある

-gpg-options '--passphrase-file /path/to/pass-phrase' 

などを試すがまったく解決しない。試行錯誤していると何だか前にも同じようなことがあったような気がしてきた。天から助手の猫が
「去年も同じ問題を調べたけど、諦めてたよ!」
と教えてくれた。
丸一日調べて解決しないので諦めて元に戻しパスワードを入力する状態にして寝た。

検索キーワードを変えてみた

眠っている間も気になっていて考えたアイデアを次の日の朝試してみた。しかし、簡単には解決しない。やっぱり諦めか?と思った時、助手の猫が
「エラーメッセージではなく入力画面のメッセージで検索したら?」
とアドバイスしてくれた。ダメ元で

Please enter the passphrase to unlock the OpenPGP secret key

で検索すると

を見つけた。

回避のためのパラメータが増えていた

どうやら、最初に見つけた回避策の中におしいものがあったようだ。回避するために必要なパラメータが増えていただけである。

dpkg-sig -g "--no-tty --batch --pinentry-mode loopback --passphrase-file=/src/keypass.txt" -k 4AC1F34BD20F307442D1DB2EC5974ACD14ADAF03 --sign builder /tmp/deb/*.deb

で解決した。

開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。