GnuPG

提供: ArchWiki
2017年6月22日 (木) 18:18時点におけるPonkotuy (トーク | 投稿記録)による版 (→‎pinentry: Fix pinentry-qt4 to pinentry-qt)
ナビゲーションに移動 検索に移動

関連記事

公式サイト によれば:

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 と連携するプログラムを使いたい場合はアプリケーション一覧/セキュリティ#暗号化, 署名, ステガノグラフィーを参照してください。

設定

設定ファイルのディレクトリ

GnuPG では $GNUPGHOME によって全ての設定ファイルを保存するディレクトリが指定されます。デフォルトでは $GNUPGHOME は設定されておらず、代わりに $HOME が使われます。そのためインストール直後は ~/.gnupg ディレクトリが確認できます。スタートアップファイルに次の行を記述することでデフォルト設定を変更できます:

export GNUPGHOME="/path/to/directory"

設定ファイル

デフォルトの設定ファイルは ~/.gnupg/gpg.conf~/.gnupg/dirmngr.conf です。

デフォルトでは、gnupg ディレクトリのパーミッション700 に設定されており、ディレクトリのファイルのパーミッションは 600 に設定されています。ファイルの読み書きやアクセスの権限を持っているのはディレクトリの所有者だけです (r,w,x)。これはセキュリティ上の理由で設定されていることなので変更してはいけません。ディレクトリやファイルがこのセキュリティ対策に従っていない場合、ファイルやホームディレクトリのパーミッションが安全ではないという警告が表示されます。

どんな長いオプションも設定ファイルに追加します。2つのダッシュを書かないで、オプションや必要な引数の名前を書いて下さい。スケルトンファイルは /usr/share/gnupgl にあります。gpg がなんらかの操作のため最初に起動されたとき、~/.gnupg が存在しなければこれらのファイルが ~/.gnupg にコピーされます。#参照 に他の例があります。

また、pacman がパッケージの署名の検証に使用する設定ファイルは別に存在します。詳しくは pacman-key を見てください。

新規ユーザーのデフォルトオプション

新規ユーザーのデフォルトオプションを設定したい場合、/etc/skel/.gnupg/ に設定ファイルを配置してください。新しいユーザーが追加されると、/etc/skel/.gnupg/ から GnuPG のホームディレクトリにファイルがコピーされます。既存のユーザーのために新しい GnuPG ホームディレクトリを作成できる addgnupghome というスクリプトも存在します:

# addgnupghome user1 user2

上記のコマンドは /home/user1/.gnupg/home/user2/.gnupg を作成してスケルトンディレクトリからファイルをコピーします。既に GnuPG のホームディレクトリが存在するユーザーはスキップされます。

使い方

ノート: コマンドに <user-id> が必要なときは、鍵 ID、指紋、名前やメールアドレスの一部などを指定できます。これについて GnuPG は寛容です。

鍵の作成

秘密鍵を生成するにはターミナルに次を入力:

$ gpg --full-gen-key
ヒント: --expert を使うことで他の暗号を利用することができます (楕円曲線暗号など)。

上記のコマンドを実行すると複数の質問がきかれます。大抵の場合、以下の設定が必要になります:

  • RSA (署名のみ) と RSA (暗号化のみ) 鍵。
  • 鍵長は2048ビットで十分です。4096ビットを使ったところで "大した効果はありませんし、無駄に時間がかかるようになるだけです"
  • 副鍵の有効期限の設定は技術的には必須ではありませんが、設定することは悪くありません。標準的なユーザーなら、1年間で十分でしょう。たとえ鍵束へのアクセスを失っても、他の人が有効でないことを知ることができるようになります。鍵を作成した後、新しい鍵を再発行しなくても満了日は延長することができます。
  • 名前とメールアドレス。後で同じ鍵に別の識別子を追加できます (複数のメールアドレスが存在する場合など)。
  • コメントは必要ありません。コメントフィールドのセマンティクスは 定義があやふや なため、識別子としては限定的です。
  • 安全なパスフレーズを選ぶようにしてください (セキュリティ#パスワードの管理を参照)。
ノート: 入力した名前とメールアドレスは鍵をインポートすれば誰でも確認できるようになります。

鍵を表示

  • 公開鍵束の鍵:
$ gpg --list-keys
  • 秘密鍵束の鍵:
$ gpg --list-secret-keys

秘密鍵のバックアップ

秘密鍵をバックアップするには:

$ gpg --export-secret-keys --armor <user-id> > privkey.asc

秘密鍵はロックされたコンテナや暗号化されたドライブなど安全な場所に置いてください。

警告: 上記のエクスポートされたファイルにアクセスできる人は誰でも、パスフレーズを知らなくてもあなたのふりをして文書を暗号化したり署名したりできます。

公開鍵のエクスポート

公開鍵暗号で交換されたメッセージの機密性を保証するのが gpg の主な利用法です。互いの鍵束の公開鍵を交換して、メッセージを暗号化するときに使用します。秘密鍵は必ず漏洩しないようにしてください。機密性が破れてしまいます。

他の人があなたに暗号化したメッセージを送れるようにするには、彼らがあなたの公開鍵を知っている必要があります。

(メールで送る場合などのために) ASCII 版の公開鍵を生成するには:

$ gpg --armor --output public.key --export <user-id>

あるいは、鍵サーバーで鍵を共有する方法もあります。

ヒント: --no-emit-version を使うか、これを設定ファイルに書くことでバージョン番号の表示を抑制できます。

公開鍵のインポート

メッセージを暗号化して他の人に送るには、彼らの公開鍵が必要です。公開鍵 (public.key) を自分の公開鍵リングにインポートするには:

$ gpg --import public.key

あるいは、鍵サーバーで公開鍵を見つけます。

鍵サーバーを使用する

自分の公開鍵を公共の PGP 鍵サーバーに登録することで、他の人があなたに直接連絡することなしにあなたの鍵を入手できるようになります。

$ gpg --send-keys <key-id>

鍵サーバーの鍵の情報を確認したい場合、次のコマンドを実行:

$ gpg --search-keys <key-id>

鍵サーバーから鍵をインポートするには:

$ gpg --recv-keys <key-id>
警告:
  • 誰でも鍵サーバーに鍵を送ることができます。そのため、ダウンロードした鍵が本当にその人のものであると信用してはいけません。入手した鍵の指紋を、持ち主が別の場所(ブログ、サイト、メール・電話で連絡するなど)で公開している指紋と比較してその鍵の真正性を確かめるべきです。複数の情報源を使うことでその鍵の信頼性は増します。Wikipedia:Public key fingerprint を参照。
  • ID が短いと衝突する可能性があります。インポートされた鍵には全て短い ID が割り当てられます。鍵を受け取るときに完全な指紋か長い鍵 ID を使うことで衝突を回避できます [1]
ヒント:
  • keyserver-options auto-key-retrievegpg.conf に追加すると必要に応じて鍵サーバーから鍵が取得されます。
  • 代わりの鍵サーバーは dirmngr.conf--keyserverpool.sks-keyservers.net と指定できます。wikipedia:Key server (cryptographic)#Keyserver examples を参照
  • --use-tor を使うと Tor で鍵サーバーに接続できます。hkp://jijrk5u4osbsr34t5.onion は sks-keyservers プールの onion アドレスです。GnuPG のブログ記事 を参照。
  • http_proxy 環境変数を設定して dirmngr.confhonor-http-proxy を設定することでプロキシを使って鍵サーバーに接続できます。また、dirmngr.confhttp-proxy host[:port] を設定すると http_proxy 環境変数が上書きされます。

暗号化と復号化

暗号化や復号化をするときは複数の秘密鍵を使用することが可能です。複数の鍵を使うときは使用する鍵を選択する必要があります。-u <user-id> オプションや --local-user <user-id> オプションを使うことで選択できます。このオプションを使うとデフォルトの鍵を使用する代わりに指定された鍵を使用します。

(テキストでメッセージをコピー&ペーストするのに適している) ASCII armor を使ってファイルを暗号化するには、次を使用:

$ gpg --encrypt --armor secret.txt

単に暗号化だけしたいときは --armor は不要です。

ヒント:
  • 受取人を変更したい場合は -r <user-id> (または --recipient <user-id>) オプションで変更できます。
  • 暗号メッセージに受取人の鍵 ID を入れたくないときは --recipient のかわりに -R <user-id> または --hidden-recipient <user-id> を追加してください。メッセージの受取人を隠蔽して、トラフィックの解析に対する対抗策になります。
  • バージョン番号を出力したくないときは --no-emit-version を追加してください。または設定ファイルに同じ設定を追加してください。
ノート: gnupg を使えば機密文書を暗号化できますが、一度に複数のファイルを暗号化することはできません。ディレクトリやファイルシステム全体を暗号化したいときは、TrueCryptEncFS などを使用するか、tarball にファイルをまとめて暗号化すると良いでしょう。

ファイルを復号化するには、次のコマンドを使用:

$ gpg --decrypt secret.txt.asc

パスフレーズの入力が求められます。復号化するには送信者の公開鍵をインポートしてある必要があります。

鍵の管理

秘密鍵のバックアップ

秘密鍵をバックアップするには以下を実行:

$ gpg --export-secret-keys --armor <user-id> > privkey.asc

gpg のリリース 2.1 からデフォルトの挙動が変わっており、たとえ鍵の作成時にパスワードを設定しなかった場合でも上記のコマンドを実行したときにパスフレーズによる保護が必須になっています。エクスポートされたファイルを入手してしまえば、パスフレーズを知らなくてもファイルを暗号化したり署名を加えることができてしまうためです。

警告: パスフレーズは秘密鍵の最大の弱点となります。暗号化されたコンテナやドライブなど、秘密鍵は安全な場所に保管してください。

秘密鍵のバックアップをインポートするには:

$ gpg --allow-secret-key-import --import privkey.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>
ノート: 満了した副鍵を失効させる必要はありません、また、良い行いとは言えません。しょっちゅう鍵を無効化させているようでしたら、他人はあなたを信用しなくなるかもしれません。

署名

署名は文章を証明します。文章が改変された場合、署名の検証に失敗します。公開鍵を使用して文章を暗号化する暗号化とは違って、署名はユーザーの秘密鍵を使って作成されます。署名された文章を受け取った人は送り主の公開鍵を使って署名を検証できます。

ファイルに署名する

ファイルに署名するには --sign または -s フラグを使います:

 $ gpg --output doc.sig --sign doc

上記のコマンドは暗号化も行ってファイルをバイナリ形式で保存します。

ファイルやメッセージにクリア署名

バイナリ形式に圧縮しないでファイルに署名するには:

 $ gpg --clearsign doc

上記のコマンドは文章を ASCII-armored 署名でラッピングしますが、文章に変更は加えられません。

分離署名を作成する

文章やファイルとは別に署名ファイルを作成したい場合、--detach-sig フラグを使ってください:

 $ gpg --output doc.sig --detach-sig doc

上記の方法はソフトウェアプロジェクトを配布するときによく用いられます。署名書を検証することで第三者によってファイルが改竄されていないことが確認できます。

署名の検証

署名を検証するには --verify フラグを使います:

 $ gpg --verify doc.sig

doc.sig は検証したい署名に置き換えてください。

ファイルの検証と復号化を同時に行いたいお場合、--decrypt フラグを使ってください。

分離署名を検証する場合、ファイルと署名の両方が必要になります。例えば、Arch Linux の ISO を検証する場合:

 $ gpg --verify archlinux-<version>-dual.iso.sig

archlinux-<version>-dual.iso が同じディレクトリに存在していなければなりません。

gpg-agent

gpg-agent はキーチェインにパスワードをリクエストしたりキャッシュしたりするのに使われるデーモンです。メールクライアントなど外部のプログラムから GnuPG を利用する場合に便利です。

GnuPG 2.1.0 から gpg-agent の使用は必須となっています。gpg-agent は GnuPG のツールによって必要に応じて実行されるため、手動で起動する必要はありません。

設定

gpg-agent は ~/.gnupg/gpg-agent.conf ファイルで設定することができます。設定オプションは man gpg-agent に記載されています。例えば、未使用の鍵の cache ttl を変更することができます:

~/.gnupg/gpg-agent.conf
default-cache-ttl 3600
ヒント: セッションを通してパスフレーズをキャッシュするには、次のコマンドを実行してください:
$ /usr/lib/gnupg/gpg-preset-passphrase --preset XXXXXX

XXXX は鍵輪に置き換えてください。鍵輪の値は gpg --with-keygrip -K を実行することで取得できます。パスフレーズは gpg-agent が再起動されるまで保存されます。default-cache-ttl の値を設定した場合、そちらが優先されます。

エージェントのリロード

設定を変更した後は、gpg-connect-agent でエージェントをリロードしてください:

$ gpg-connect-agent reloadagent /bye

シェルに 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-qt
# pinentry-program /usr/bin/pinentry-kwallet

pinentry-program /usr/bin/pinentry-gtk-2
ヒント: /usr/bin/pinentry-kwallet を使うには kwalletcliAUR パッケージをインストールする必要があります。

変更を行った後は、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
Restart=on-abort

[Install]
WantedBy=default.target
ノート:
  • GNUPGHOME を変更している場合、サービスに環境変数を設定する必要があります。詳しくは systemd/ユーザー#環境変数 を見て下さい。
  • gnupg ホームディレクトリが ~/.gnupg の場合、パスを指定する必要はありません。
  • gpg -agent は標準ソケットを使いません。代わりに gnupg のホームディレクトリにある S.gpg-agent という名前のソケットを使います。environment ファイルを読み込んで /tmp に作成されたランダムなソケットのパスを取得するスクリプトは忘れることができます。
  • gpg-agent の SSH 機能を使用している場合 (--enable-ssh-support)、上記の systemd ユニットは使えません。
ヒント: gpg-agent が実行していること、接続を待機していることを確認するには、次のコマンドを実行してください: $ gpg-connect-agent。設定が問題なければ、プロンプトが表示されます (byequit と入力すれば接続が終了します)。

無人のパスフレーズ

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
ノート: 上流の開発者は gpg.confpinentry-mode loopback を設定すると他の機能が使えなくなる可能性があると示唆しています。出来るかぎりコマンドラインオプションを使うようにして下さい [2]

SSH エージェント

gpg-agent には OpenSSH エージェントのエミュレーション機能が存在します。既に GnuPG スイートを使っているのであれば、SSH 鍵をキャッシュするのに使うことが可能です。さらに、パスフレーズを管理するのに GnuPG エージェントの PIN エントリダイアログを使えます。

GnuPG エージェントで SSH 鍵を管理するには、~/.gnupg/gpg-agent.conf ファイルで SSH のサポートを有効にしてください:

~/.gnupg/gpg-agent.conf
enable-ssh-support

そして、gpg-agent が常時起動するようにします。#systemd ユーザーで gpg-agent を起動のユニットファイルを使用するか、.bashrc ファイルに以下の行を記述してください:

~/.bashrc
# Start the gpg-agent if not already running
if ! pgrep -x -u "${USER}" gpg-agent >/dev/null 2>&1; then
  gpg-connect-agent /bye >/dev/null 2>&1
fi

SSH が ssh-agent の代わりに gpg-agent を使うように SSH_AUTH_SOCK を設定してください。シェルのタイプに関係なくプロセスが gpg-agent インスタンスを使うようにするには pam_env を使用します:

~/.pam_environment
SSH_AGENT_PID	DEFAULT=
SSH_AUTH_SOCK	DEFAULT="${XDG_RUNTIME_DIR}/gnupg/S.gpg-agent.ssh"

または、Bash を使う場合:

~/.bashrc
# Set SSH to use gpg-agent
unset SSH_AGENT_PID
if [ "${gnupg_SSH_AUTH_SOCK_by:-0}" -ne $$ ]; then
  export SSH_AUTH_SOCK="/run/user/$UID/gnupg/S.gpg-agent.ssh"
fi
ノート:
  • GnuPG の設定ファイルのディレクトリがデフォルトと異なる場合、gpgconf --create-socketdir を実行して /run/user/$UID/gnupg/ にソケットディレクトリを作成してください。ソケットディレクトリを作成しないと GnuPG のホームディレクトリにソケットが配置されてしまいます。
  • エージェントを gpg-agent --daemon /bin/sh で起動している場合、シェルは SSH_AUTH_SOCK 変数を gpg-agent から承継します [3]

man gpg-agent にあるように、ユーザーを X セッションに切り替えた場合は GPG_TTY も設定して TTY を更新してください。例:

~/.bashrc
# Set GPG TTY
export GPG_TTY=$(tty)

# Refresh gpg-agent tty in case user switches into an X session
gpg-connect-agent updatestartuptty /bye >/dev/null

gpg-agent が起動していれば ssh-agent と同じように ssh-add で鍵を追加できます。追加された鍵は ~/.gnupg/sshcontrol ファイルに保存されます。パスフレーズが必要になったときは毎回 pinentry ダイアログが表示されます。パスフレーズのキャッシュは ~/.gnupg/gpg-agent.conf ファイルで制御します。以下の例では gpg-agent で鍵を3時間キャッシュします:

~/.gnupg/gpg-agent.conf
default-cache-ttl-ssh 10800
max-cache-ttl-ssh 10800

スマートカード

ノート: pcsclitelibusb-compat をインストールして、pcscd.service サービスを systemd で実行する必要があります。

GnuPG はスマートカードリーダーのインターフェイスとして scdaemon を使います。詳しくは man ページを参照してください。

GnuPG のみ設定

GnuPG ベース以外のカードを使う予定がない場合は、~/.gnupg/scdaemon.confreader-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 を使っている場合や、さらに高いセキュリティを求めたい場合、上記のように設定するようにしてください。

パスワードの暗号化

ヒント: pass は以下の作業を自動化します。

パスワードを暗号化すれば、設定ファイルに平文で書き込まれなくなります。メールのパスワードなどが良い例でしょう。

まずパスワードを記述したファイルを作成してください。パスワードの後に空行を一行だけ追加しておく必要があります。そうしないとファイルを評価するときに gpg がエラーメッセージを返します。

そして次を実行:

$ gpg -e -a -r <user-id> your_password_file

-e は encrypt、-a は armor (ASCII 出力)、-r は受取人のユーザー ID です。

新しく your_password_file.asc ファイルが作られます。

鍵の無効化

警告:
  • 無効化証明書にアクセスできれば誰でも鍵を無効化して、利用できなくすることができてしまいます。
  • 鍵を無効化するのは、鍵が解読されたり消失したり、あるいはパスフレーズを忘れた場合にのみ行なってください。

新しい鍵を生成すると無効化証明書が自動的に生成されます。ユーザーが手動で後から生成することも可能です。無効化証明書は ~/.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 でインストールすることができます。

所有者に署名を送信するには MTA が必要です。MTA を設定していない場合、msmtp をインストールして下さい。

長い ID やフィンガープリントを毎回表示する

長い鍵 ID を表示させるには設定ファイルに keyid-format 0xlong を追加してください。鍵の指紋を完全に表示するには、設定ファイルに with-fingerprint を追加してください。

トラブルシューティング

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/ と同じのが正しいです。

ノート: tty の所有者が pinentry を実行しているユーザーと一致している必要があります。tty グループに属しているだけでは不十分です。

エージェントがファイルの終末についてエラーを表示する

デフォルトの pinentry プログラムは pinentry-gtk-2 であり、D-Bus セッションバスを正しく実行する必要があります。詳しくは一般的なトラブルシューティング#セッションのパーミッションを見て下さい。

もしくは、pinentry-qt を使うこともできます。#pinentry を参照。

KGpg 設定のパーミッション

kdeutils-kgpg[リンク切れ: replaced by 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.gpgsecring.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="660", GROUP="scard"

VENDOR と MODEL は lsusb の出力にあわせて変更する必要があります。上記は YubikeyNEO の例です。

参照