git-buildpackageとfreightでパスフレーズをファイルから入力させる
はじめに
git-buildpackageでdebパッケージをビルドしてPPAにアップロードする手順
の gbp buildpackage
でソースパッケージをビルドする時と
freightでプライベートdebレポジトリ作成
の freight cache
でレポジトリを更新する際にgpgのパスフレーズを入力する必要があります。
何度も実行しているとパスワードマネージャからコピペするのが面倒になってきてファイルから入力する方法を調べたのでメモです。
git-buildpackage でのパスフレーズ自動入力
gpg-agentを使う方法も試したが不採用
gbp buildpackage
でソースパッケージをビルドする際に
gpg: gpg-agent is not available in this session
というメッセージと共に
Enter passphrase:
というプロンプトが出るので、当初はgpg-agentを使えば良いのではないかと思いました。
gpg-agent を使うには gnupg-agent パッケージをインストールするのが簡単ですが、これはgpg 2.x系となっています。
$ dpkg -l | grep gnupg
ii gnupg 1.4.20-1ubuntu3.1 amd64 GNU privacy guard - a free PGP replacement
ii gnupg-agent 2.1.11-6ubuntu2 amd64 GNU privacy guard - cryptographic agent
ii gnupg2 2.1.11-6ubuntu2 amd64 GNU privacy guard - a free PGP replacement (new v2.x)
gbp-buildpackage から呼び出される debsign の -p
オプションで署名の際に使うgpgのプログラムを変更できます。
Ubuntu Manpage: debsign - sign a Debian .changes and .dsc file pair using GPG
-pprogname
When debsign needs to execute GPG to sign it will run progname
(searching the PATH if necessary), instead of gpg.
-pgpg2
のように指定することで署名の際に gpg2 を使うことが出来ます。
-p
の後にスペースを開けてはいけないことと、 "-pgpg2 foo"
のように空白を含んだコマンドラインを
指定はできないので要注意です。
gpg2 を使うように指定すると gpg-agent が自動的に起動されてCUIのダイアログが開いてパスフレーズを入力すれば しばらくは再入力しなくて良くなるようです。
連続してdebパッケージを作るとき以外はgpg-agentに再度パスフレーズを入力する必要がありました。
gpg v1の–passphrase-fdオプションを使ってファイルからパスフレーズを入力
自宅サーバでdebパッケージをビルドしている場合はファイルから読めたほうが楽なので別の手を探して見つけました。
まず /home/hnakamur/.gpg-passphrase
というファイルを作ってそこにパスフレーズを書いておきます。自宅サーバで他にユーザはいないですが、一応パーミションは 400
にしました。
で次に、以下のスクリプトを /home/hnakamur/bin/gpg-passphrase
というファイル名で作成し実行パーミションを付与します。
#!/bin/sh
exec </home/hnakamur/.gpg-passphrase /usr/bin/gpg --batch --passphrase-fd 0 --no-use-agent "$@"
ファイルからのリダイレクトは
exec /usr/bin/gpg --batch --passphrase-fd 0 --no-use-agent "$@" < /home/hnakamur/.gpg-passphrase
と書くのが普通ですが、上記のように手前にも書けるというのをどこかで見たので忘れないようにこの書き方にしてみました。
また、gpg の --passphrase
オプションを使って
exec /usr/bin/gpg --batch --passphrase ここにパスフレーズを記入 --no-use-agent "$@"
とする手もあります。ただ、freight ではパスフレーズをファイルから読むこむのでファイルに書きたいのと、
この方式だと ps でパスフレーズが見られるリスクがあるかもしれないので、この方式は止めました。
なお、gpg の --passphrase-file
オプションを使って
exec /usr/bin/gpg --batch --passphrase-file /home/hnakmaur/.gpg-passphrase --no-use-agent "$@"
というのも試したのですが、なぜかうまく動きませんでした。
あとは gbp buildpackage
の際に -p/home/hnakamur/bin/gpg-passphrase
を指定すればOKです。
freightのキャッシュ更新時にファイルからパスフレーズを入力
man freight-cache
すると
-p passphrase file, --passphrase-file=passphrase file
Use an alternate file containing the GPG key passphrase. This file should obviously be protected and
only readable by the user running Freight.
のように説明があります。
ということで、 freight cache -p /home/hnakamur/.gpg-passphrase
でOKです。
sudo つきで実行すると以下のような警告が出ますが、所有者と実行者が違うので仕方ないと気にしないことにします。 あるいは root ユーザで自分のgpgキーを読み込むようにしたほうが良いのかもしれません。
hnakamur@express:/var/www/html/my-debs$ sudo freight cache -p /home/hnakamur/.gpg-passphrase
gpg: WARNING: unsafe ownership on configuration file `/home/hnakamur/.gnupg/gpg.conf'
gpg: WARNING: unsafe ownership on configuration file `/home/hnakamur/.gnupg/gpg.conf'