GnuPG (日本語) - ArchWiki

# 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"

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

### GPG_AGENT_INFO

`GPG_AGENT_INFO` は gpg-agent を示すのに使われます。コロンで区切られた3つのフィールドから成ります:

1. Unix ドメインソケットのパス
2. gpg-agent の PID
3. プロトコルのバージョン

例: `GPG_AGENT_INFO=/tmp/gpg-eFqmSC/S.gpg-agent:7795:1`。gpg-agent を起動すると、この変数が適切に設定されます。

Note: GnuPG 2.1 のアナウンス によると: GnuPG 2.1 で `GPG_AGENT_INFO` の必要性は完全になくなり変数は無視されるようになりました。代わりに、`$GNUPGHOME/S.gpg-agent` という決まった名前の Unix ドメインソケットが使われます。エージェントも必要に応じて、ツールがエージェントのサービスを必要としたときに起動します。

## 設定ファイル

デフォルトは `~/.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 ホームディレクトリが存在するユーザーは無視されます。

## 基本的な鍵の管理

Note: コマンドに `<user-id>` が必要なときは、鍵 ID、指紋、名前やメールアドレスの一部などを指定できます。これについて 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

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

    $ gpg --full-gen-key

Note: `--full-gen-key` オプションは gnupg-2.1.0 から使えるようになりました。

いくつか質問がきかれます。一般的に、ほとんどのユーザーは RSA (署名のみ) と RSA (暗号化のみ) の両方の鍵が必要になります。鍵長は4096ビットが推奨です (デフォルトは2048)。

副鍵の有効期限の設定は技術的には必須ではありませんが、設定することは悪くありません。標準的なユーザーなら、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 <user-id>

- ユーザー Bob あてに署名と暗号化:

    $ gpg -se -r Bob file

- クリアテキスト署名を作成:

    $ gpg --clearsign file

### 副鍵の使用

Warning: 何か特段の事情がないかぎり、有効期限が切れたり無効になった副鍵を削除しないでください。削除してしまうとその副鍵で暗号化したファイルを復号化できなくなってしまいます。満了した、または無効のキーを削除するのは他のユーザーの鍵束を整理するときだけにしてください。

副鍵を設定して一定期間後に満了したら、新しい副鍵を作成できます。他のユーザーが鍵束を更新できるように数週間前に行うようにしましょう。

Note: 新しい鍵を作成する必要はありません。期限がきて使えなくなっただけだからです。有効期間を延長することができます。

- 新しい副鍵を作成 (署名と暗号化の鍵の両方)

    $ gpg --edit-key <user-id>
    > addkey

そして質問に答えて下さい (推奨される設定については前のセクションを参照)。

- 変更を保存:

    > save

- キーサーバーにアップデート:

    $ gpg  --keyserver pgp.mit.edu --send-keys <user-id>

Note: 満了した副鍵を失効させる必要はありません、また、良い行いとは言えません。しょっちゅう鍵を無効化させているようでしたら、他人はあなたを信用しなくなるかもしれません。

### 鍵のインポート

- 公開鍵を公開鍵束にインポート:

    $ gpg --import public.key

- 秘密鍵を秘密鍵束にインポート:

    $ gpg --import private.key

### 鍵を表示

- 公開鍵束の鍵:

    $ 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

Tip: `/usr/bin/pinentry-kwallet` を使うには kwalletcli パッケージをインストールする必要があります。

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

Note:

- `GNUPGHOME` など、サービスに環境変数を設定する必要があります。詳しくは systemd/ユーザー#環境変数 を見て下さい。
- gnupg ホームディレクトリが `~/.gnupg` の場合、パスを指定する必要はありません。
- `gpg -agent` will not use standard socket, but rather listen for a socket name `S.gpg-agent` located in your gnupg home directory. We can thus forget any script to read an environment file and get the path of the random socket created in `/tmp`.

Tip: gpg-agent が実行していること、接続を待機していることを確認するには、次のコマンドを実行してください: `$ gpg-connect-agent`。設定が問題なければ、プロンプトが表示されます (bye や quit と入力すれば接続が終了します)。

### 無人のパスフレーズ

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

Note: 上流の開発者は gpg.conf で pinentry-mode loopback を設定すると他の機能が使えなくなる可能性があると示唆しています。出来るかぎりコマンドラインオプションを使うようにして下さい [1]。

## キーサインパーティ

キーサーバーやキーリングにある鍵の正当性をユーザーが確認 (つまり鍵の持ち主が本人であることを確認) できるように、PGP/GPG はいわゆる信頼の輪 ("Web of Trust") を利用しています。信頼の輪を維持するために様々なハッカーイベントが開かれており、キーサインパーティはそのひとつです。

Zimmermann-Sassaman 鍵署名プロトコルはキーサインパーティを効果的に行うための方式です。こちら にハウツー記事があります。

### caff

キーサインパーティの後、鍵に署名したり所有者に署名を送るのを簡略化するために、caff というツールを使うことができます。AUR のパッケージ caff-svn でインストールすることができ、signing-party-svn パッケージなど他の便利なツールにも付属しています。どちらにせよ、AUR から大量の依存パッケージをインストールすることになります。また、以下のように CPAN からインストールすることも可能です:

    cpanm Any::Moose
    cpanm GnuPG::Interface

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

## スマートカード

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

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

### 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` をチェックしてください。

## トラブルシューティング

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

Note: The owner of tty must match with the user for which pinentry is running. Being part of the group `tty` is not enough.

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

デフォルトの 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 エージェントとして使うことはできません。

## 参照

- GNU Privacy ハンドブック
- A more comprehensive gpg Tutorial
- GnuPG FAQ
- gpg.conf recommendations and best practices
- Torbirdy gpg.conf

Category:

- Security (日本語)