GnuPG

提供: ArchWiki
2021年1月31日 (日) 10:38時点におけるShota (トーク | 投稿記録)による版 (→‎設定ファイル: 参照先ファイル位置の変更に対応。)
ナビゲーションに移動 検索に移動

関連記事

公式サイト によれば:

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/doc/gnupg/ にあります。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 の主な利用法です。互いの鍵束の公開鍵を交換して、メッセージを暗号化するときに使用します。秘密鍵は必ず漏洩しないようにしてください。機密性が破れてしまいます。

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

(メールで送る場合などのために) ASCII 版の公開鍵を public.key ファイルとして生成するには:

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

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

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

公開鍵のインポート

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

$ gpg --import public.key

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

鍵サーバーを使用する

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

$ gpg --send-keys user-id
警告: 鍵を鍵サーバーに登録してから、サーバーから鍵を削除することはできません [1]

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

$ gpg --search-keys user-id

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

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

暗号化と復号化

非対称

暗号化や復号化をするときは複数の秘密鍵を使用することが可能です。複数の鍵を使うときは使用する鍵を選択する必要があります。-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

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

対称

対称暗号化では鍵を生成する必要がなくパスフレーズだけでデータを暗号化できます。対称暗号化を使用するするには --symmetric または -c を使用します:

$ gpg -c doc

例:

  • パスフレーズを使って対称暗号で doc を暗号化。
  • AES-256 暗号アルゴリズムを使ってパスフレーズを暗号化。
  • SHA-512 ダイジェストアルゴリズムを使ってパスフレーズをハッシュ化。
  • 65536回繰り返しパスフレーズをハッシュ化。
$ gpg -c --s2k-cipher-algo AES256 --s2k-digest-algo SHA512 --s2k-count 65536 doc

対称暗号化された doc.gpg をパスフレーズで復号化して doc として同じディレクトリに出力するには:

$ gpg --output doc --decrypt doc.gpg

鍵の管理

秘密鍵のバックアップ

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

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

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

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

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

$ gpg --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.iso.sig

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

gpg-agent

gpg-agent はキーチェインにパスワードをリクエストしたりキャッシュしたりするのに使われるデーモンです。メールクライアントなど外部のプログラムから GnuPG を利用する場合に便利です。gnupg には systemd ユーザーソケットが付属しており、デフォルトで有効になります: gpg-agent.socket, gpg-agent-extra.socket, gpg-agent-browser.socket, gpg-agent-ssh.socket, dirmngr.socket

  • gpg はメインの gpg-agent.socket を使って gpg-agent デーモンに接続します。
  • gpg-agent-extra.socket はリモート環境から Unix ドメインソケットの転送を設定します。秘密鍵をリモート環境に移さなくてもリモート環境で gpg が使えるようになります。詳しくは gpg-agent(1) を参照。
  • SSHgpg-agent-ssh.socket を使って ssh-add プログラムによって追加された SSH 鍵をキャッシュします。必要な設定は #SSH エージェントを見てください。
  • dirmngr.socket は鍵サーバーへの接続を処理する GnuPG デーモンを起動します。
ノート: GnuPG の設定ファイルのディレクトリがデフォルトと異なる場合、gpgconf --list-dirs の値を使用するようにソケットファイルを編集してください。

設定

gpg-agent は ~/.gnupg/gpg-agent.conf ファイルで設定することができます。設定オプションは gpg-agent(1) に記載されています。例えば、未使用の鍵の 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 をリロードしてください。

無人のパスフレーズ

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 を設定すると他の機能が使えなくなる可能性があると示唆しています。出来るかぎりコマンドラインオプションを使うようにして下さい [3]

SSH エージェント

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

SSH_AUTH_SOCK の設定

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"
ノート: SSH_AUTH_SOCK を手動で設定する場合、GNUPGHOME をカスタマイズしているときはソケットの場所が異なる可能性があるので注意してください。以下の bash の例を使用するか、SSH_AUTH_SOCKgpgconf --list-dirs agent-ssh-socket の値に変更してください。

または、Bash を使う場合:

~/.bashrc
unset SSH_AGENT_PID
if [ "${gnupg_SSH_AUTH_SOCK_by:-0}" -ne $$ ]; then
  export SSH_AUTH_SOCK="$(gpgconf --list-dirs agent-ssh-socket)"
fi
ノート: エージェントを gpg-agent --daemon /bin/sh で起動している場合、シェルは SSH_AUTH_SOCK 変数を gpg-agent から承継します [4]

適切な TTY を使うように pinentry を設定

gpg-agent(1) にあるように、ユーザーを 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

SSH 鍵の追加

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

GPG 鍵を SSH 鍵として使う

gpg-agent を SSH エージェントとして使用する場合、GnuPG 鍵を SSH 鍵として使うことができます。鍵のメンテナンスを楽にして SSH 鍵をキーカードに保存できます。認証機能を有効にして鍵を作成する必要があります (#カスタム機能を参照)。GnuPG は必要なときに自動的に鍵を使用します。以下のコマンドで鍵を確認できます:

$ ssh-add -l

鍵のコメントが次のようになっていれば追加されています: openpgp:key-id または cardno:card-id

ノート: GnuPG は GnuPG 鍵を (通常の SSH 鍵が保存される) $GNUPGHOME/sshcontrol に追加しない場合があります。

スマートカード

ノート: 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 を使わない場合は scdaemon(1) をチェックしてください。

ヒントとテクニック

他のアルゴリズム

強力なアルゴリズムを使用したい場合:

~/.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-keys <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 を追加してください。

カスタム機能

鍵にカスタム機能を設定することができます。以下の機能を使うことが可能です:

  • Certify (マスター鍵のみ) - 副鍵の作成ができるようになります。
  • Sign - 公開鍵で検証することができる暗号化署名が作成可能になります。
  • Encrypt - 公開鍵でデータを暗号化して、秘密鍵で復号化することができます。
  • Authenticate - GnuPG 以外のプログラムで鍵を使って認証できます。SSH 鍵として使用することができるようになります。

マスター鍵の機能は以下のコマンドで指定できます:

$ gpg --full-generate-key --expert

オプションを選択して機能を設定することができます。

副鍵にカスタム機能を指定したい場合、gpg --edit-key--expert フラグを追加してください。詳しくは#鍵の編集を参照。

パスワードのキャッシュ

GnuPG のパスワードをセッションの間だけ記憶させたい場合、max-cache-ttldefault-cache-ttl を高い値に設定してください:

gpg-agent.conf
max-cache-ttl 60480000
default-cache-ttl 60480000

詳しくは #gpg-agent を参照。

トラブルシューティング

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 グループに属しているだけでは不十分です。
ヒント: script で gpg を実行した場合、新しい tty が適切な所有権で使われます: # script -q -c "gpg --gen-key" /dev/null

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

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

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

KGpg 設定のパーミッション

kgpg には ~/.gnupg/ のオプションが使えないという問題がありました。非推奨となった options ファイルが原因です。バグ レポートを参照してください。

GNOME on Wayland で SSH エージェントのソケットが上書きされる

Wayland のセッションでは、gnome-session によって SSH_AUTH_SOCK が標準の gnome-keyring ソケット $XDG_RUNTIME_DIR/keyring/ssh に設定されます。このため ~/.pam_environmment や systemd のユニットファイルで設定した値が上書きされてしまいます。

この挙動を無効化するには GSM_SKIP_AGENT_WORKAROUND 変数を設定してください:

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

mutt

Mutt は gpg-agent を正しく使用できないため、mutt を使う場合は GPG_AGENT_INFO 環境変数を設定する必要があります (中身は何でもかまいません)。パスワードのキャッシュも有効化してください。

詳しくは フォーラムスレッド を参照してください。

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 の例です。

gpg: WARNING: server 'gpg-agent' is older than us (x < y)

gnupg をアップグレードしたのに古い gpg-agent が動作し続けていると警告が表示されます。ユーザーの gpg-agent.socket を再起動してください (再起動するときに --user フラグを使ってください)。

参照