GnuPG
GnuPG を使うことでデータや通信を暗号化したり署名することができます。多目的の鍵管理システムであり、あらゆる種類の公開鍵ディレクトリのアクセスモジュールです。
目次
インストール
公式リポジトリにある gnupg をインストールしてください。
gnupg をインストールすると、GnuPG がパスフレーズエントリに使用するシンプルな PIN やパスフレーズエントリダイアログのコレクションである pinentry もインストールされます。pinentry はシンボリックリンク /usr/bin/pinentry
によって決められ、デフォルトでは /usr/bin/pinentry-gtk-2
になります。
環境変数
GNUPGHOME
$GNUPGHOME
は全ての設定ファイルを保存するディレクトリを指定するのに GnuPG によって使われます。デフォルトでは $GNUPGHOME
は設定されておらず、代わりに $HOME
が使われます。そのためインストール直後は ~/.gnupg
ディレクトリが確認できます。スタートアップファイルに次の行を記述することでデフォルト設定を変更できます:
export GNUPGHOME="/path/to/directory"
GPG_AGENT_INFO
GPG_AGENT_INFO
は gpg-agent を示すのに使われます。コロンで区切られた3つのフィールドから成ります:
- Unix ドメインソケットのパス
- gpg-agent の PID
- プロトコルのバージョン
例: GPG_AGENT_INFO=/tmp/gpg-eFqmSC/S.gpg-agent:7795:1
。gpg-agent を起動すると、この変数が適切に設定されます。
設定ファイル
デフォルトは ~/.gnupg/gpg.conf
です。デフォルトの場所を変更したい場合は、$ gpg --homedir path/to/file
と gpg を実行するか $GNUPGHOME
変数を使って下さい。
どんな長いオプションもこのファイルに追加します。2つのダッシュを書かないで、オプションや必要な引数の名前を書いて下さい。スケルトンファイルは /usr/share/gnupg/gpg-conf.skel
にあります。以下はベーシックな設定ファイルです:
~/.gnupg/gpg.conf
default-key name # useful in case you manage several keys and want to set a default one keyring file # will add file to the current list of keyrings trustdb-name file # use file instead of the default trustdb homedir dir # set the name of the gnupg home dir to dir instead of ~/.gnupg display-charset utf-8 # bypass all translation and assume that the OS uses native UTF-8 encoding keyserver name # use name as your keyserver no-greeting # suppress the initial copyright message armor # create ASCII armored output. Default is binary OpenPGP format
新規ユーザーのデフォルトオプションを設定したいときは、/etc/skel/.gnupg/
に設定ファイルを置いて下さい。システムに新しいユーザーが追加されたとき、ここからファイルが GnuPG のホームディレクトリにコピーされます。addgnupghome というシンプルなスクリプトもあり、既存のユーザーに新しい GnuPG ホームディレクトリを作成できます:
# addgnupghome user1 user2
このコマンドで /home/user1/.gnupg
と /home/user2/.gnupg
が作成されスケルトンディレクトリからファイルがコピーされます。既に GnuPG ホームディレクトリが存在するユーザーは無視されます。
基本的な鍵の管理
鍵の作成
最初に強力なアルゴリズムを使うように設定して下さい:
~/.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 --full-gen-key
いくつか質問がきかれます。一般的に、ほとんどのユーザーは RSA (署名のみ) と RSA (暗号化のみ) の両方の鍵が必要になります。鍵長は2048ビットで十分です。4096ビットを使ったところで "大した効果はありませんし、無駄に時間がかかるようになるだけです" 。
副鍵の有効期限の設定は技術的には必須ではありませんが、設定することは悪くありません。標準的なユーザーなら、1年間で十分でしょう。たとえ鍵束へのアクセスを失っても、他の人が有効でないことを知ることができるようになります。鍵を作成した後、新しい鍵を再発行しなくても満了日は延長することができます。
鍵の管理
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 --import public.key
- 秘密鍵を秘密鍵束にインポート:
$ gpg --import private.key
- キーサーバーから鍵をインポート ('--keyserver' を省略した場合、デフォルトのサーバーが使われます):
$ gpg --keyserver pgp.mit.edu --recv-keys <keyid>
鍵を表示
- 公開鍵束の鍵:
$ gpg --list-keys
- 秘密鍵束の鍵:
$ gpg --list-secret-keys
暗号化と復号化
暗号化や復号化をするときは複数の秘密鍵を使用することが可能です。複数の鍵を使うときは使用する鍵を選択する必要があります。-u <user-id>
オプションや --local-user <user-id>
オプションを使うことで選択できます。このオプションを使うとデフォルトの鍵を使用する代わりに指定された鍵を使用します。
ファイルを暗号化するには、次を使用:
$ gpg --encrypt -o secret.tar.gpg secret.tar
- 受取人を変更したい場合は
-r <user-id>
オプションで変更できます (または--recipient <user-id>
)。 - gnupg を使えば機密文書を暗号化できますが、一度に複数のファイルを暗号化することはできません。ディレクトリやファイルシステム全体を暗号化したいときは、TrueCrypt や EncFS などを使用するか、tarball にファイルをまとめて暗号化すると良いでしょう。
ファイルを復号化するには、次を使用:
$ gpg --decrypt secret.tar.gpg
パスフレーズの入力が求められます。
パスワードの暗号化
パスワードを暗号化すれば、設定ファイルに平文で書き込まれなくなります。メールのパスワードなどが良い例でしょう。
まずパスワードを記述したファイルを作成してください。パスワードの後に空行を一行だけ追加しておく必要があります。そうしないとファイルを評価するときに gpg がエラーメッセージを返します。
そして次を実行:
$ gpg -e -a -r <user-id> your_password_file
-e
は encrypt、-a
は armor (ASCII 出力)、-r
は受取人のユーザー ID です。
新しく your_password_file.asc
ファイルが作られます。
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/.config/gnupg ExecStop=/usr/bin/pkill gpg-agent Restart=on-abort [Install] WantedBy=MyTarget.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
キーサインパーティ
キーサーバーやキーリングにある鍵の正当性をユーザーが確認 (つまり鍵の持ち主が本人であることを確認) できるように、PGP/GPG はいわゆる信頼の輪 ("Web of Trust") を利用しています。信頼の輪を維持するために様々なハッカーイベントが開かれており、キーサインパーティはそのひとつです。
Zimmermann-Sassaman 鍵署名プロトコルはキーサインパーティを効果的に行うための方式です。こちら にハウツー記事があります。
caff
キーサインパーティの後、鍵に署名したり所有者に署名を送るのを簡略化するために、caff というツールを使うことができます。AUR のパッケージ caff-svnAUR でインストールすることができ、signing-party-svnAUR パッケージなど他の便利なツールにも付属しています。どちらにせよ、AUR から大量の依存パッケージをインストールすることになります。また、以下のように CPAN からインストールすることも可能です:
cpanm Any::Moose cpanm GnuPG::Interface
所有者に署名を送信するには MTA が必要です。MTA を設定していない場合、msmtp をインストールして下さい。
スマートカード
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
をチェックしてください。
トラブルシューティング
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 設定のパーミッション
There have been issues with kdeutils-kgpg being able to access the ~/.gnupg/
options. One issue might be a result of a deprecated options file, see the bug report.
Another user reported that KGpg failed to start until the ~/.gnupg
folder is set to drwxr-xr-x
permissions. If you require this work-around, ensure that the directory contents retain -rw-------
permissions! Further, report it as a bug to the developers.
gnome-keyring と gpg-agent が衝突する
Gnome keyring は GPG エージェントコンポーネントを実装していますが、GnuPG バージョン 2.1 から、GnuPG は GPG_AGENT_INFO
環境変数を無視するようになったため、Gnome keyring を GPG エージェントとして使うことはできません。
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 の例です。