GnuPG
公式サイト によれば:
- GnuPG は RFC4880 (別名 PGP) で定義される OpenPGP 標準の完全でフリーな実装です。GnuPG を使うことでデータや通信を暗号化したり署名することができます。多目的の鍵管理システムであり、あらゆる種類の公開鍵ディレクトリのアクセスモジュールです。GnuPG (またの名を GPG) は他のアプリケーションとの簡単に連携できる機能を備えたコマンドラインツールです。豊富なアプリケーションとライブラリが利用可能です。GnuPG のバージョン2は S/MIME と ssh のサポートも含んでいます。
目次
インストール
gnupg をインストールしてください。
gnupg をインストールすると、GnuPG がパスフレーズエントリに使用するシンプルな PIN やパスフレーズエントリダイアログのコレクションである pinentry もインストールされます。pinentry はシンボリックリンク /usr/bin/pinentry
によって決められ、デフォルトでは /usr/bin/pinentry-gtk-2
になります。
グラフィカルフロントエンドや GnuPG と連携するプログラムを使いたい場合はアプリケーション一覧/セキュリティ#暗号化, 署名, ステガノグラフィーを参照してください。
環境変数
GNUPGHOME
$GNUPGHOME
は全ての設定ファイルを保存するディレクトリを指定するのに GnuPG によって使われます。デフォルトでは $GNUPGHOME
は設定されておらず、代わりに $HOME
が使われます。そのためインストール直後は ~/.gnupg
ディレクトリが確認できます。スタートアップファイルに次の行を記述することでデフォルト設定を変更できます:
export GNUPGHOME="/path/to/directory"
設定ファイル
デフォルトは ~/.gnupg/gpg.conf
と ~/.gnupg/dirmngr.conf
です。デフォルトの場所を変更したい場合は、$ gpg --homedir path/to/file
と gpg を実行するか $GNUPGHOME
変数を使って下さい。どんな長いオプションもこのファイルに追加します。2つのダッシュを書かないで、オプションや必要な引数の名前を書いて下さい。スケルトンファイルは /usr/share/gnupgl
にあります。gpg がなんらかの操作のため最初に起動されたとき、~/.gnupg
が存在しなければこれらのファイルが ~/.gnupg
にコピーされます。#参照 に他の例があります。
使い方
鍵の作成
秘密鍵を生成するにはターミナルに次を入力:
$ gpg --full-gen-key
いくつか質問がきかれます。一般的に、ほとんどのユーザーは RSA (署名のみ) と RSA (暗号化のみ) の両方の鍵が必要になります。鍵長は2048ビットで十分です。4096ビットを使ったところで "大した効果はありませんし、無駄に時間がかかるようになるだけです" 。
副鍵の有効期限の設定は技術的には必須ではありませんが、設定することは悪くありません。標準的なユーザーなら、1年間で十分でしょう。たとえ鍵束へのアクセスを失っても、他の人が有効でないことを知ることができるようになります。鍵を作成した後、新しい鍵を再発行しなくても満了日は延長することができます。
安全なパスフレーズを選ぶようにしてください (セキュリティ#パスワードの管理を参照)。
秘密鍵のバックアップ
秘密鍵をバックアップするには:
$ gpg --export-secret-keys --armor <user-id> > privkey.asc
秘密鍵はロックされたコンテナや暗号化されたドライブなど安全な場所に置いてください。
公開鍵のエクスポート
他の人があなたに暗号化したメッセージを送れるようにするには、彼らがあなたの公開鍵を知っている必要があります。
(メールで送る場合などのために) ASCII 版の公開鍵を生成するには:
$ gpg --armor --output public.key --export <user-id>
あるいは、鍵サーバーで鍵を共有する方法もあります。
鍵のインポート
メッセージを暗号化して他の人に送るには、彼らの公開鍵が必要です。公開鍵を自分の公開鍵リングにインポートするには:
$ gpg --import public.key
あるいは、鍵サーバーで公開鍵を見つけます。
鍵サーバーを使用する
自分の公開鍵を公共の PGP 鍵サーバーに登録することで、他の人があなたに直接連絡することなしにあなたの鍵を入手できるようになります。
$ gpg --send-keys <key-id>
鍵サーバーから鍵をインポートするには:
$ gpg --recv-keys <key-id>
暗号化と復号化
暗号化や復号化をするときは複数の秘密鍵を使用することが可能です。複数の鍵を使うときは使用する鍵を選択する必要があります。-u <user-id>
オプションや --local-user <user-id>
オプションを使うことで選択できます。このオプションを使うとデフォルトの鍵を使用する代わりに指定された鍵を使用します。
(テキストでメッセージをコピー&ペーストするのに適している) ASCII armor を使ってファイルを暗号化するには、次を使用:
$ gpg --encrypt --armor secret.txt
単に暗号化だけしたいときは --armor
は不要です。
ファイルを復号化するには、次を使用:
$ gpg --decrypt secret.txt.asc
パスフレーズの入力が求められます。復号化するには送信者の公開鍵をインポートしてある必要があります。
鍵の管理
鍵の編集
gpg --edit-key <user-id>
コマンドを実行するとメニューが表示され、鍵管理に関連するほとんどの作業を行うことができます。以下は満了日を設定する例です:
$ gpg --edit-key <user-id> > key number > expire yyyy-mm-dd > save > quit
便利なコマンド:
> passwd # change the passphrase > clean # compact any user ID that is no longer usable (e.g revoked or expired) > revkey # revoke a key > addkey # add a subkey to this key > expire # change the key expiration time
- 公開鍵の ASCII バージョンを生成 (例: メールなどで配るため):
$ gpg --armor --output public.key --export <user-id>
- PGP 公開鍵サーバーに鍵を登録して、他の人があなたに直接連絡しなくても鍵を取得できるようにする:
$ gpg --keyserver pgp.mit.edu --send-keys <key-id>
- ユーザー Bob あてに署名と暗号化:
$ gpg -se -r Bob file
- クリアテキスト署名を作成:
$ gpg --clearsign file
副鍵のエクスポート
複数のデバイスで同じ鍵を使い回す場合、マスター鍵を分離させて、セキュリティが低いシステムでは暗号化に必要な副鍵だけを使いたいという状況が考えられます。
まず、エクスポートしたい副鍵を確認してください:
$ gpg -K
エクスポートする副鍵だけを選択:
$ gpg -a --export-secret-subkeys [subkey id]! > /tmp/subkey.gpg
ここで作業を終えても良いですが、パスフレーズの変更もしておくと安全です。一時フォルダに鍵をインポートします:
$ gpg --homedir /tmp/gpg --import /tmp/subkey.gpg $ gpg --homedir /tmp/gpg --edit-key <user-id> > passwd > save $ gpg --homedir /tmp/gpg -a --export-secret-subkeys [subkey id]! > /tmp/subkey.altpass.gpg
これで、他のデバイスで /tmp/subkey.altpass.gpg
を使うことができます。
副鍵の使用
副鍵を設定して一定期間後に満了したら、新しい副鍵を作成できます。他のユーザーが鍵束を更新できるように数週間前に行うようにしましょう。
- 新しい副鍵を作成 (署名と暗号化の鍵の両方)
$ gpg --edit-key <user-id> > addkey
そして質問に答えて下さい (推奨される設定については前のセクションを参照)。
- 変更を保存:
> save
- キーサーバーにアップデート:
$ gpg --keyserver pgp.mit.edu --send-keys <user-id>
鍵を表示
- 公開鍵束の鍵:
$ gpg --list-keys
- 秘密鍵束の鍵:
$ gpg --list-secret-keys
gpg-agent
gpg-agent はキーチェインにパスワードをリクエストしたりキャッシュしたりするのに使われるデーモンです。メールクライアントなど外部のプログラムから GnuPG を利用する場合に便利です。gpg.conf
に次の行を追加することで使用できます:
~/.gnupg/gpg.conf
use-agent
この設定によって GnuPG はパスワードが必要になった時にエージェントを使うようになります。ただし、あらかじめエージェントを実行しておく必要があります。エージェントを自動的に起動するには、.xinitrc
や .bash_profile
に以下のエントリを追加してください。$GNUPGHOME
を変更していた場合は envfile のパスを忘れずに変更するようにしてください。
~/.bash_profile
envfile="$HOME/.gnupg/gpg-agent.env" if [[ -e "$envfile" ]] && kill -0 $(grep GPG_AGENT_INFO "$envfile" | cut -d: -f 2) 2>/dev/null; then eval "$(cat "$envfile")" else eval "$(gpg-agent --daemon --enable-ssh-support --write-env-file "$envfile")" fi export GPG_AGENT_INFO # the env file does not contain the export statement export SSH_AUTH_SOCK # enable gpg-agent for ssh
その後、セッションを一度ログアウトしてからログインしなおして下さい。gpg-agent が有効になっているか確認:
$ pgrep gpg-agent
設定
gpg-agent は ~/.gnupg/gpg-agent.conf
ファイルで設定することができます。設定オプションは man gpg-agent
に記載されています。例えば、未使用の鍵の cache ttl を変更することができます:
~/.gnupg/gpg-agent.conf
default-cache-ttl 3600
エージェントのリロード
設定を変更した後は、gpg-connect-agent
に RELOADAGENT
という文字列をパイプで渡して、エージェントをリロードしてください。
$ echo RELOADAGENT | gpg-connect-agent
シェルに OK
と出力されます。
pinentry
最後に、ユーザーにパスワードを尋ねる方法をエージェントに設定する必要があります。gpg-agent の設定ファイルで設定できます。
デフォルトでは gtk のダイアログが使われます。使用できるオプションは info pinentry
を見て下さい。ダイアログの実装を変更するには pinentry-program
設定オプションを設定します:
~/.gnupg/gpg-agent.conf
# PIN entry program # pinentry-program /usr/bin/pinentry-curses # pinentry-program /usr/bin/pinentry-qt4 # pinentry-program /usr/bin/pinentry-kwallet pinentry-program /usr/bin/pinentry-gtk-2
変更を行った後は、gpg-agent をリロードしてください。
systemd ユーザーで gpg-agent を起動
Systemd/ユーザー機能を使ってエージェントを起動することが可能です。
systemd ユニットファイルを作成:
~/.config/systemd/user/gpg-agent.service
[Unit] Description=GnuPG private key agent IgnoreOnIsolate=true [Service] Type=forking ExecStart=/usr/bin/gpg-agent --daemon --homedir=%h/.gnupg ExecStop=/usr/bin/pkill gpg-agent Restart=on-abort [Install] WantedBy=default.target
無人のパスフレーズ
GnuPG 2.1.0 から gpg-agent と pinentry の利用が必須になりました。これによって --passphrase-fd 0
コマンドラインオプションによって STDIN からパイプで渡されたパスフレーズの後方互換性が損ねられています。古いリリースと同じような機能を使うには2つのことをする必要があります:
まず、gpg-agent の設定を編集して loopback pinentry モードを許可してください:
~/.gnupg/gpg-agent.conf
allow-loopback-pinentry
gpg-agent プロセスが実行している場合は再起動して変更を適用します。
次に、更新する必要があるアプリケーションに以下のようにコマンドラインパラメータを含めて loopback モードを使用します:
$ gpg --pinentry-mode loopback ...
もしくは、コマンドラインで設定ができない場合、オプションを設定に追加します:
~/.gnupg/gpg.conf
pinentry-mode loopback
スマートカード
GnuPG はスマートカードリーダーのインターフェイスとして scdaemon を使います。詳しくは man ページを参照してください。
GnuPG のみ設定
GnuPG ベース以外のカードを使う予定がない場合は、~/.gnupg/scdaemon.conf
の reader-port
パラメータを確認してください。'0' が最初に利用できるシリアルポートリーダーを、'32768' (デフォルト) が最初の USB リーダーを示しています。
GnuPG と OpenSC
opensc ドライバーであらゆるスマートカードを使う場合は (例: いろいろな国の ID カード)、GnuPG の設定に注意する必要があります。何も設定をしていないと gpg --card-status
を使った時に以下のようなメッセージが表示されることがあります:
gpg: selecting openpgp failed: ec=6.108
デフォルトでは、scdaemon はデバイスに直接接続しようとします。リーダーが他のプロセスによって使用中だとこの接続は失敗します。例えば: OpenSC によって使用される pcscd デーモン。この状況に対処するには、opensc と同じ基盤のドライバーを使って一緒に動作できるようにする必要があります。scdaemon に pcscd を使用させるため、~/.gnupg/scdaemon.conf
から reader-port
を削除して、libpcsclite.so
ライブラリの場所を指定し、ccid を無効化してください:
~/.gnupg/scdaemon.conf
pcsc-driver /usr/lib/libpcsclite.so card-timeout 5 disable-ccid
OpenSC を使わない場合は man scdaemon
をチェックしてください。
Tips and tricks
他のアルゴリズム
強力なアルゴリズムを使用したい場合:
~/.gnupg/gpg.conf
... personal-digest-preferences SHA512 cert-digest-algo SHA512 default-preference-list SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES CAST5 ZLIB BZIP2 ZIP Uncompressed personal-cipher-preferences TWOFISH CAMELLIA256 AES 3DES
GnuPG の最新版では、デフォルトのアルゴリズムとして SHA256 と AES が使われており、どちらも殆どの場合安全です。しかしながら、2.1 以前の古い GnuPG を使っている場合や、さらに高いセキュリティを求めたい場合、上記のように設定するようにしてください。
パスワードの暗号化
パスワードを暗号化すれば、設定ファイルに平文で書き込まれなくなります。メールのパスワードなどが良い例でしょう。
まずパスワードを記述したファイルを作成してください。パスワードの後に空行を一行だけ追加しておく必要があります。そうしないとファイルを評価するときに gpg がエラーメッセージを返します。
そして次を実行:
$ gpg -e -a -r <user-id> your_password_file
-e
は encrypt、-a
は armor (ASCII 出力)、-r
は受取人のユーザー ID です。
新しく your_password_file.asc
ファイルが作られます。
新規ユーザーのデフォルトオプション
新規ユーザーのデフォルトオプションを設定したいときは、/etc/skel/.gnupg/
に設定ファイルを置いて下さい。システムに新しいユーザーが追加されたとき、ここからファイルが GnuPG のホームディレクトリにコピーされます。addgnupghome というシンプルなスクリプトもあり、既存のユーザーに新しい GnuPG ホームディレクトリを作成できます:
# addgnupghome user1 user2
このコマンドで /home/user1/.gnupg
と /home/user2/.gnupg
が作成されスケルトンディレクトリからファイルがコピーされます。既に GnuPG ホームディレクトリが存在するユーザーは無視されます。
鍵の無効化
新しい鍵を生成すると無効化証明書が自動的に生成されます。ユーザーが手動で後から生成することも可能です。無効化証明書は ~/.gnupg/openpgp-revocs.d/
に存在します。証明書のファイル名は無効化する鍵のフィンガープリントになります。
鍵を無効化したい場合、無効化証明書をインポートするだけです:
$ gpg --import <fingerprint>.rev
そして鍵サーバーをアップデート:
$ gpg --keyserver subkeys.pgp.net --send <userid>
信頼モデルの変更
デフォルトでは GnuPG は信頼モデルとして Web of Trust を使います。Web of Trust から Trust on First に変更することが可能です。鍵を追加するときに --trust-model=tofu
を追加するか GnuPG の設定ファイルにオプションを追加してください。詳細は GnuPG メーリングリストのメール を参照。
受取人の id を全て隠す
デフォルトでは暗号メッセージには受取人の鍵 ID が含まれます。hidden-recipient <user-id>
を使うことで暗号化するときに ID は削除することが可能です。全ての受取人で ID を削除するには設定ファイルに throw-keyids
を追加してください。この設定によってメッセージの受取人を隠すことができ、トラフィックの解析に対抗することができます (ソーシャルエンジニアリングを使うことでメッセージを復号化できてしまえば誰が受取人なのか確認される可能性があります)。欠点としては、暗号鍵を全て試すことになるので復号化が遅くなります (--try-secret-key <user-id>
)。
キーサインパーティで caff を使う
キーサーバーやキーリングにある鍵の正当性をユーザーが確認 (つまり鍵の持ち主が本人であることを確認) できるように、PGP/GPG はいわゆる信頼の輪 ("Web of Trust") を利用しています。信頼の輪を維持するために様々なハッカーイベントが開かれており、キーサインパーティはそのひとつです。Zimmermann-Sassaman 鍵署名プロトコルはキーサインパーティを効果的に行うための方式です。こちら にハウツー記事があります。
キーサインパーティの後、鍵に署名したり所有者に署名を送るのを簡略化するために、caff というツールを使うことができます。AUR のパッケージ caff-svnAUR でインストールすることができ、signing-party-svnAUR パッケージなど他の便利なツールにも付属しています。どちらにせよ、AUR から大量の依存パッケージをインストールすることになります。また、以下のように CPAN からインストールすることも可能です:
cpanm Any::Moose cpanm GnuPG::Interface
所有者に署名を送信するには MTA が必要です。MTA を設定していない場合、msmtp をインストールして下さい。
トラブルシューティング
http プロキシを使う
2.1.9 から http プロキシのオプションは以下のように設定できます:
$ gpg --keyserver-option http-proxy=HOST:PORT
詳しくは https://bugs.gnupg.org/gnupg/issue1786 を参照。
Not enough random bytes available
鍵を生成するときに、gpg は以下のエラーを表示することがあります:
Not enough random bytes available. Please do some other work to give the OS a chance to collect more entropy!
残っているエントロピーを確認するには、カーネルパラメータをチェックしてください:
$ cat /proc/sys/kernel/random/entropy_avail
エントロピーがたくさんある健康的な Linux 環境ならマックスの 4,096 ビットに近い値が返されます。返ってくる値が 200 以下の場合、システムのエントロピーが足りていません。
エントロピー問題を解決するには、メッセージ通りのことをするのがベストです (例: ディスクを動かす、マウスを動かす、wiki を編集する - 何でもエントロピーの生成に繋がります)。それでも問題が解決しない場合、エントロピーを使い果たしているサービスが何なのかチェックして、しばらくそのサービスを停止してみてください。サービスを停止できない場合、乱数生成#高速な RNG を見て下さい。
su
pinentry
を使う場合、使用するターミナルデバイス (例: /dev/tty1
) の適切なパーミッションが必要です。しかしながら、su (または sudo) を使用すると、所有権は元のユーザーに残り、新しいユーザーにはなくなります。これでは pinentry はたとえ root であっても起動しません。pinentry を使用する (つまりエージェントで gpg を使用する) 前にデバイスのパーミッションを同じ所に変更する必要があります。root で gpg を実行する場合、gpg を使用する直前に所有者を root に変更してください:
# chown root /dev/ttyN # where N is the current tty
そして gpg を使用した後に元に戻して下さい。おそらく /dev/pts/
と同じのが正しいです。
エージェントがファイルの終末についてエラーを表示する
デフォルトの pinentry プログラムは pinentry-gtk-2 であり、D-Bus セッションバスを正しく実行する必要があります。詳しくは一般的なトラブルシューティング#セッションのパーミッションを見て下さい。
もしくは、pinentry-qt
を使うこともできます。#pinentry を参照。
KGpg 設定のパーミッション
kdeutils-kgpg には ~/.gnupg/
のオプションが使えないという問題がありました。非推奨となった options ファイルが原因です。バグ レポートを参照してください。
また、~/.gnupg
フォルダのパーミッションを drwxr-xr-x
に設定しないと KGpg が起動しないという報告もあります。パーミッションを変更したときは、ディレクトリの中身のパーミッションを -rw-------
にしてください。さらに、バグとして 開発者 に報告してください。
gnome-keyring と gpg-agent が衝突する
Gnome keyring は GPG エージェントコンポーネントを実装していますが、GnuPG バージョン 2.1 から、GnuPG は GPG_AGENT_INFO
環境変数を無視するようになったため、Gnome keyring を GPG エージェントとして使うことはできません。
ただし、バージョン 0.9.6 から pinentry パッケージには pinentry-gnome3
プログラムが入っています。gpg-agent.conf
ファイルに以下のオプションを設定することで pinentry プログラムを利用することが可能です:
pinentry-program /usr/bin/pinentry-gnome3
バージョン 0.9.2 から、全ての pinentry プログラムでは設定によって libsecret でパスフレーズを保存することができるようになりました。例えば、pinentry-gnome3
でユーザーにパスフレーズの要求がいった場合に、パスワードマネージャを使ってパスフレーズを保存するかどうか決めるチェックボックスが表示されます。残念ながら、pinentry パッケージでこの機能は有効になっていません (理由は FS#46059 を参照)。libsecret を有効にするために pinentry-libsecretAUR を代替として使うことができます。
mutt と gpg
GnuPG 2.1 現在、セッションごとに GnuPG のパスワードが一回要求されるようにするには、こちらのフォーラムスレッド を参照してください。
gnupg バージョン 2.1 にアップグレードすると鍵が"消失"する
gpg --list-keys
を実行しても以前まで使っていた鍵が表示されない場合、また、アプリケーションが鍵を見つけられないまたは鍵が不正だとエラーを吐く場合、鍵が新しいフォーマットに移行できていない可能性があります。
GnuPG invalid packet workaround を読んで下さい。要約すると、旧式の pubring.gpg
と secring.gpg
ファイルの鍵にはバグが存在しており、新しい pubring.kbx
ファイルと private-keys-v1.d/
サブディレクトリ、そしてディレクトリのファイルによって置き換えられたということが書かれています。以下のコマンドを実行することで消失した鍵を復旧させることができるかもしれません:
$ cd $ cp -r .gnupg gnupgOLD $ gpg --export-ownertrust > otrust.txt $ gpg --import .gnupg/pubring.gpg $ gpg --import-ownertrust otrust.txt $ gpg --list-keys
(鍵を受信しようとすると) どのキーサーバーでも gpg がフリーズする
特定のキーサーバーで鍵を受信しようとして gpg がフリーズしている場合、dirmngr を kill して (問題が起こっていない) 他のキーサーバーにアクセスできるようにする必要があります。そうしないと全てのキーサーバーでフリーズしてしまいます。
スマートカードが検出されない
スマートカードにアクセスするための権限がない場合、カードを正しく設定して接続しても、card error
が表示されることがあります。
スマートカードにアクセスする必要があるユーザーに scard
を追加することで解決できます。追加したら、以下のような udev ルールを作って下さい:
/etc/udev/rules.d/71-gnupg-ccid.rules
ACTION=="add", SUBSYSTEM=="usb", ENV{ID_VENDOR_ID}=="1050", ENV{ID_MODEL_ID}=="0116|0111", MODE="664", GROUP="scard"
VENDOR と MODEL は lsusb
の出力にあわせて変更する必要があります。上記は YubikeyNEO の例です。