「GnuPG」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(この.serviceをそのまま使うとエラーになるため、英語版の最新版に修正)
(文字列「Tips and tricks」を「ヒントとテクニック」に置換)
(4人の利用者による、間の12版が非表示)
3行目: 3行目:
 
[[es:GnuPG]]
 
[[es:GnuPG]]
 
[[ru:GnuPG]]
 
[[ru:GnuPG]]
  +
[[zh-hans:GnuPG]]
[http://www.gnupg.org GnuPG] を使うことでデータや通信を暗号化したり署名することができます。多目的の鍵管理システムであり、あらゆる種類の公開鍵ディレクトリのアクセスモジュールです。
 
  +
{{Related articles start}}
  +
{{Related|pacman-key}}
  +
{{Related|ディスク暗号化}}
  +
{{Related|アプリケーション一覧/セキュリティ#暗号化, 署名, ステガノグラフィー}}
  +
{{Related articles end}}
  +
[http://www.gnupg.org 公式サイト] によれば:
  +
  +
:GnuPG は RFC4880 (別名 PGP) で定義される OpenPGP 標準の完全でフリーな実装です。GnuPG を使うことでデータや通信を暗号化したり署名することができます。多目的の鍵管理システムであり、あらゆる種類の公開鍵ディレクトリのアクセスモジュールです。GnuPG (またの名を GPG) は他のアプリケーションとの簡単に連携できる機能を備えたコマンドラインツールです。豊富なアプリケーションとライブラリが利用可能です。GnuPG のバージョン2は S/MIME と ssh のサポートも含んでいます。
   
 
== インストール ==
 
== インストール ==
   
[[公式リポジトリ]]にある {{Pkg|gnupg}} をインストールしてください。
+
{{Pkg|gnupg}} をインストールしてください。
   
 
gnupg をインストールすると、GnuPG がパスフレーズエントリに使用するシンプルな PIN やパスフレーズエントリダイアログのコレクションである {{Pkg|pinentry}} もインストールされます。''pinentry'' はシンボリックリンク {{ic|/usr/bin/pinentry}} によって決められ、デフォルトでは {{ic|/usr/bin/pinentry-gtk-2}} になります。
 
gnupg をインストールすると、GnuPG がパスフレーズエントリに使用するシンプルな PIN やパスフレーズエントリダイアログのコレクションである {{Pkg|pinentry}} もインストールされます。''pinentry'' はシンボリックリンク {{ic|/usr/bin/pinentry}} によって決められ、デフォルトでは {{ic|/usr/bin/pinentry-gtk-2}} になります。
   
  +
グラフィカルフロントエンドや GnuPG と連携するプログラムを使いたい場合は[[アプリケーション一覧/セキュリティ#暗号化, 署名, ステガノグラフィー]]を参照してください。
== 環境変数 ==
 
   
=== GNUPGHOME ===
+
== 設定 ==
   
  +
=== 設定ファイルのディレクトリ ===
{{ic|$GNUPGHOME}} は全ての設定ファイルを保存するディレクトリを指定するのに GnuPG によって使われます。デフォルトでは {{ic|$GNUPGHOME}} は設定されておらず、代わりに {{ic|$HOME}} が使われます。そのためインストール直後は {{ic|~/.gnupg}} ディレクトリが確認できます。[[自動起動|スタートアップファイル]]に次の行を記述することでデフォルト設定を変更できます:
 
  +
  +
GnuPG では {{ic|$GNUPGHOME}} によって全ての設定ファイルを保存するディレクトリが指定されます。デフォルトでは {{ic|$GNUPGHOME}} は設定されておらず、代わりに {{ic|$HOME}} が使われます。そのためインストール直後は {{ic|~/.gnupg}} ディレクトリが確認できます。[[自動起動|スタートアップファイル]]に次の行を記述することでデフォルト設定を変更できます:
   
 
export GNUPGHOME="''/path/to/directory''"
 
export GNUPGHOME="''/path/to/directory''"
   
  +
== 設定ファイル ==
{{Note|デフォルトでは、gnupg ディレクトリの[[ファイルのパーミッションと属性|パーミッション]]は ''700'' に設定されており、ディレクトリのファイルのパーミッションは ''600'' に設定されています。ファイルの読み書きやアクセスの権限を持っているのはディレクトリの所有者だけです (''r'',''w'',''x'')。これはセキュリティ上の理由で設定されていることなので変更してはいけません。ディレクトリやファイルがこのセキュリティ対策に従っていない場合、ファイルやホームディレクトリのパーミッションが安全ではないという警告が表示されます。}}
 
   
  +
デフォルトの設定ファイルは {{ic|~/.gnupg/gpg.conf}} と {{ic|~/.gnupg/dirmngr.conf}} です。
=== GPG_AGENT_INFO ===
 
   
  +
デフォルトでは、gnupg ディレクトリの[[ファイルのパーミッションと属性|パーミッション]]は ''700'' に設定されており、ディレクトリのファイルのパーミッションは ''600'' に設定されています。ファイルの読み書きやアクセスの権限を持っているのはディレクトリの所有者だけです (''r'',''w'',''x'')。これはセキュリティ上の理由で設定されていることなので変更してはいけません。ディレクトリやファイルがこのセキュリティ対策に従っていない場合、ファイルやホームディレクトリのパーミッションが安全ではないという警告が表示されます。
{{ic|GPG_AGENT_INFO}} は gpg-agent を示すのに使われます。コロンで区切られた3つのフィールドから成ります:
 
   
  +
どんな長いオプションも設定ファイルに追加します。2つのダッシュを書かないで、オプションや必要な引数の名前を書いて下さい。スケルトンファイルは {{ic|/usr/share/gnupgl}} にあります。gpg がなんらかの操作のため最初に起動されたとき、{{ic|~/.gnupg}} が存在しなければこれらのファイルが {{ic|~/.gnupg}} にコピーされます。[[#参照]] に他の例があります。
# Unix ドメインソケットのパス
 
# gpg-agent の PID
 
# プロトコルのバージョン
 
   
  +
また、[[pacman]] がパッケージの署名の検証に使用する設定ファイルは別に存在します。詳しくは [[pacman-key]] を見てください。
例: {{ic|1=GPG_AGENT_INFO=/tmp/gpg-eFqmSC/S.gpg-agent:7795:1}}。gpg-agent を起動すると、この変数が適切に設定されます。
 
   
  +
=== 新規ユーザーのデフォルトオプション ===
{{Note|[https://www.gnupg.org/faq/whats-new-in-2.1.html GnuPG 2.1 のアナウンス] によると: GnuPG 2.1 で {{ic|GPG_AGENT_INFO}} の必要性は完全になくなり変数は無視されるようになりました。代わりに、{{ic|$GNUPGHOME/S.gpg-agent}} という決まった名前の Unix ドメインソケットが使われます。エージェントも必要に応じて、ツールがエージェントのサービスを必要としたときに起動します。}}
 
   
  +
新規ユーザーのデフォルトオプションを設定したい場合、{{ic|/etc/skel/.gnupg/}} に設定ファイルを配置してください。新しいユーザーが追加されると、{{ic|/etc/skel/.gnupg/}} から GnuPG のホームディレクトリにファイルがコピーされます。既存のユーザーのために新しい GnuPG ホームディレクトリを作成できる ''addgnupghome'' というスクリプトも存在します:
== 設定ファイル ==
 
 
デフォルトは {{ic|~/.gnupg/gpg.conf}} です。デフォルトの場所を変更したい場合は、{{ic|$ gpg --homedir ''path/to/file''}} と gpg を実行するか {{ic|$GNUPGHOME}} 変数を使って下さい。
 
 
どんな長いオプションもこのファイルに追加します。2つのダッシュを書かないで、オプションや必要な引数の名前を書いて下さい。スケルトンファイルは {{ic|/usr/share/gnupg/gpg-conf.skel}} にあります。以下はベーシックな設定ファイルです:
 
{{hc|~/.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
 
}}
 
 
新規ユーザーのデフォルトオプションを設定したいときは、{{ic|/etc/skel/.gnupg/}} に設定ファイルを置いて下さい。システムに新しいユーザーが追加されたとき、ここからファイルが GnuPG のホームディレクトリにコピーされます。''addgnupghome'' というシンプルなスクリプトもあり、既存のユーザーに新しい GnuPG ホームディレクトリを作成できます:
 
   
 
# addgnupghome user1 user2
 
# addgnupghome user1 user2
   
のコマンド {{ic|/home/user1/.gnupg}} と {{ic|/home/user2/.gnupg}} 作成されスケルトンディレクトリからファイルコピーされます。既に GnuPG ホームディレクトリが存在するユーザーは無視されます。
+
上記のコマンド {{ic|/home/user1/.gnupg}} と {{ic|/home/user2/.gnupg}} 作成してスケルトンディレクトリからファイルコピーます。既に GnuPG ホームディレクトリが存在するユーザーはスキップされます。
   
  +
== 使い方 ==
== 基本的な鍵の管理 ==
 
   
 
{{Note|コマンドに ''{{ic|<user-id>}}'' が必要なときは、鍵 ID、指紋、名前やメールアドレスの一部などを指定できます。これについて GnuPG は寛容です。}}
 
{{Note|コマンドに ''{{ic|<user-id>}}'' が必要なときは、鍵 ID、指紋、名前やメールアドレスの一部などを指定できます。これについて GnuPG は寛容です。}}
61行目: 53行目:
 
=== 鍵の作成 ===
 
=== 鍵の作成 ===
   
  +
秘密鍵を生成するにはターミナルに次を入力:
最初に強力なアルゴリズムを使うように設定して下さい:
 
   
  +
$ gpg --full-gen-key
{{hc|~/.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
 
}}
 
   
  +
{{Tip|{{ic|--expert}} を使うことで他の暗号を利用することができます ([[wikipedia:ja:楕円曲線暗号|楕円曲線暗号]]など)。}}
GnuPG の最新版では、デフォルトのアルゴリズムとして SHA256 と AES が使われており、どちらも殆どの場合安全です。しかしながら、2.1 以前の古い GnuPG を使っている場合や、さらに高いセキュリティを求めたい場合、上記のように設定するようにしてください。
 
   
  +
上記のコマンドを実行すると複数の質問がきかれます。大抵の場合、以下の設定が必要になります:
秘密鍵を生成するにはターミナルに次を入力:
 
   
  +
* RSA (署名のみ) と RSA (暗号化のみ) 鍵。
$ gpg --full-gen-key
 
  +
* 鍵長は2048ビットで十分です。4096ビットを使ったところで [https://www.gnupg.org/faq/gnupg-faq.html#no_default_of_rsa4096 "大した効果はありませんし、無駄に時間がかかるようになるだけです"] 。
  +
* 副鍵の有効期限の設定は技術的には必須ではありませんが、設定することは悪くありません。標準的なユーザーなら、1年間で十分でしょう。たとえ鍵束へのアクセスを失っても、他の人が有効でないことを知ることができるようになります。鍵を作成した後、新しい鍵を再発行しなくても満了日は延長することができます。
  +
* 名前とメールアドレス。後で同じ鍵に別の識別子を追加できます (複数のメールアドレスが存在する場合など)。
  +
* コメントは必要ありません。コメントフィールドのセマンティクスは [https://lists.gnupg.org/pipermail/gnupg-devel/2015-July/030150.html 定義があやふや] なため、識別子としては限定的です。
  +
* 安全なパスフレーズを選ぶようにしてください ([[セキュリティ#パスワードの管理]]を参照)。
   
  +
{{Note|入力した名前とメールアドレスは鍵をインポートすれば誰でも確認できるようになります。}}
{{Note|
 
  +
* {{ic|--full-gen-key}} オプションは {{Pkg|gnupg}}-2.1.0 から使えるようになりました。
 
  +
=== 鍵を表示 ===
* {{ic|--expert}} を使うことで他の暗号を利用することができます ([[wikipedia:ja:楕円曲線暗号|楕円曲線暗号]]など)。
 
  +
  +
* 公開鍵束の鍵:
  +
  +
$ gpg --list-keys
  +
  +
* 秘密鍵束の鍵:
  +
  +
$ gpg --list-secret-keys
  +
  +
=== 秘密鍵のバックアップ ===
  +
  +
秘密鍵をバックアップするには:
  +
  +
$ gpg --export-secret-keys --armor ''<user-id>'' > privkey.asc
  +
  +
秘密鍵はロックされたコンテナや暗号化されたドライブなど安全な場所に置いてください。
  +
  +
{{Warning|上記のエクスポートされたファイルにアクセスできる人は誰でも、''パスフレーズを知らなくても''あなたのふりをして文書を暗号化したり署名したりできます。}}
  +
  +
=== 公開鍵のエクスポート ===
  +
  +
公開鍵暗号で交換されたメッセージの機密性を保証するのが gpg の主な利用法です。互いの鍵束の公開鍵を交換して、メッセージを暗号化するときに使用します。秘密鍵は必ず漏洩しないようにしてください。機密性が破れてしまいます。
  +
  +
他の人があなたに暗号化したメッセージを送れるようにするには、彼らがあなたの公開鍵を知っている必要があります。
  +
  +
(メールで送る場合などのために) ASCII 版の公開鍵を生成するには:
  +
  +
$ gpg --armor --output public.key --export ''<user-id>''
  +
  +
あるいは、[[#鍵サーバーを使用する|鍵サーバー]]で鍵を共有する方法もあります。
  +
  +
{{Tip|{{ic|--no-emit-version}} を使うか、これを設定ファイルに書くことでバージョン番号の表示を抑制できます。}}
  +
  +
=== 公開鍵のインポート ===
  +
  +
メッセージを暗号化して他の人に送るには、彼らの公開鍵が必要です。公開鍵 ({{ic|''public.key''}}) を自分の公開鍵リングにインポートするには:
  +
  +
$ gpg --import public.key
  +
  +
あるいは、[[#鍵サーバーを使用する|鍵サーバー]]で公開鍵を見つけます。
  +
  +
=== 鍵サーバーを使用する ===
  +
  +
自分の公開鍵を公共の PGP 鍵サーバーに登録することで、他の人があなたに直接連絡することなしにあなたの鍵を入手できるようになります。
  +
  +
$ gpg --send-keys ''<key-id>''
  +
  +
鍵サーバーの鍵の情報を確認したい場合、次のコマンドを実行:
  +
  +
$ gpg --search-keys ''<key-id>''
  +
  +
鍵サーバーから鍵をインポートするには:
  +
  +
$ gpg --recv-keys ''<key-id>''
  +
  +
{{Warning|
  +
* 誰でも鍵サーバーに鍵を送ることができます。そのため、ダウンロードした鍵が本当にその人のものであると信用してはいけません。入手した鍵の指紋を、持ち主が別の場所(ブログ、サイト、メール・電話で連絡するなど)で公開している指紋と比較してその鍵の真正性を確かめるべきです。複数の情報源を使うことでその鍵の信頼性は増します。[[Wikipedia:Public key fingerprint]] を参照。
  +
* ID が短いと衝突する可能性があります。インポートされた鍵には全て短い ID が割り当てられます。鍵を受け取るときに完全な指紋か長い鍵 ID を使うことで衝突を回避できます [https://lkml.org/lkml/2016/8/15/445]。
 
}}
 
}}
   
  +
{{Tip|
いくつか質問がきかれます。一般的に、ほとんどのユーザーは RSA (署名のみ) と RSA (暗号化のみ) の両方の鍵が必要になります。鍵長は2048ビットで十分です。4096ビットを使ったところで [https://www.gnupg.org/faq/gnupg-faq.html#no_default_of_rsa4096 "大した効果はありませんし、無駄に時間がかかるようになるだけです"] 。
 
  +
* {{ic|keyserver-options auto-key-retrieve}} を {{ic|gpg.conf}} に追加すると必要に応じて鍵サーバーから鍵が取得されます。
  +
* 代わりの鍵サーバーは {{ic|dirmngr.conf}} の {{ic|--keyserver}} で {{ic|pool.sks-keyservers.net}} と指定できます。[[wikipedia:Key server (cryptographic)#Keyserver examples]] を参照
  +
* {{ic|--use-tor}} を使うと [[Tor]] で鍵サーバーに接続できます。{{ic|hkp://jijrk5u4osbsr34t5.onion}} は sks-keyservers プールの onion アドレスです。[https://gnupg.org/blog/20151224-gnupg-in-november-and-december.html GnuPG のブログ記事] を参照。
  +
* {{ic|http_proxy}} 環境変数を設定して {{ic|dirmngr.conf}} で {{ic|honor-http-proxy}} を設定することでプロキシを使って鍵サーバーに接続できます。また、{{ic|dirmngr.conf}} で {{ic|http-proxy ''host[:port]''}} を設定すると {{ic|http_proxy}} 環境変数が上書きされます。}}
  +
  +
=== 暗号化と復号化 ===
  +
  +
暗号化や復号化をするときは複数の秘密鍵を使用することが可能です。複数の鍵を使うときは使用する鍵を選択する必要があります。{{ic|-u ''<user-id>''}} オプションや {{ic|--local-user ''<user-id>''}} オプションを使うことで選択できます。このオプションを使うとデフォルトの鍵を使用する代わりに指定された鍵を使用します。
  +
  +
(テキストでメッセージをコピー&ペーストするのに適している) ASCII armor を使ってファイルを暗号化するには、次を使用:
  +
  +
$ gpg --encrypt --armor secret.txt
  +
  +
単に暗号化だけしたいときは {{ic|--armor}} は不要です。
  +
  +
{{Tip|
  +
* 受取人を変更したい場合は {{ic|-r ''<user-id>''}} (または {{ic|--recipient ''<user-id>''}}) オプションで変更できます。
  +
* 暗号メッセージに受取人の鍵 ID を入れたくないときは {{ic|--recipient}} のかわりに {{ic|-R ''<user-id>''}} または {{ic|--hidden-recipient ''<user-id>''}} を追加してください。メッセージの受取人を隠蔽して、トラフィックの解析に対する対抗策になります。
  +
* バージョン番号を出力したくないときは {{ic|--no-emit-version}} を追加してください。または設定ファイルに同じ設定を追加してください。}}
  +
  +
{{Note|gnupg を使えば機密文書を暗号化できますが、一度に複数のファイルを暗号化することはできません。ディレクトリやファイルシステム全体を暗号化したいときは、[[TrueCrypt]] や [[EncFS]] などを使用するか、tarball にファイルをまとめて暗号化すると良いでしょう。}}
  +
  +
ファイルを復号化するには、次のコマンドを使用:
  +
  +
$ gpg --decrypt secret.txt.asc
  +
  +
パスフレーズの入力が求められます。復号化するには送信者の公開鍵をインポートしてある必要があります。
  +
  +
== 鍵の管理 ==
  +
  +
=== 秘密鍵のバックアップ ===
  +
  +
秘密鍵をバックアップするには以下を実行:
  +
  +
$ gpg --export-secret-keys --armor ''<user-id>'' > ''privkey.asc''
  +
  +
''gpg'' のリリース 2.1 からデフォルトの挙動が変わっており、たとえ鍵の作成時にパスワードを設定しなかった場合でも上記のコマンドを実行したときにパスフレーズによる保護が必須になっています。エクスポートされたファイルを入手してしまえば、パスフレーズを知らなくてもファイルを暗号化したり署名を加えることができてしまうためです。
  +
  +
{{Warning|パスフレーズは秘密鍵の最大の弱点となります。暗号化されたコンテナやドライブなど、秘密鍵は安全な場所に保管してください。}}
   
  +
秘密鍵のバックアップをインポートするには:
副鍵の有効期限の設定は技術的には必須ではありませんが、設定することは悪くありません。標準的なユーザーなら、1年間で十分でしょう。たとえ鍵束へのアクセスを失っても、他の人が有効でないことを知ることができるようになります。鍵を作成した後、新しい鍵を再発行しなくても満了日は延長することができます。
 
  +
$ gpg --allow-secret-key-import --import ''privkey.asc''
   
=== 鍵の管理 ===
+
=== 鍵の編集 ===
   
 
* {{ic|gpg --edit-key ''<user-id>''}} コマンドを実行するとメニューが表示され、鍵管理に関連するほとんどの作業を行うことができます。以下は満了日を設定する例です:
 
* {{ic|gpg --edit-key ''<user-id>''}} コマンドを実行するとメニューが表示され、鍵管理に関連するほとんどの作業を行うことができます。以下は満了日を設定する例です:
130行目: 220行目:
 
$ gpg -a --export-secret-subkeys [subkey id]! > /tmp/subkey.gpg
 
$ gpg -a --export-secret-subkeys [subkey id]! > /tmp/subkey.gpg
   
  +
{{Warning|''!'' を追加するのを忘れると、全ての副鍵がエクスポートされます。}}
{{Warning|If you forget to add the !, all of your subkeys will be exported.}}
 
   
 
ここで作業を終えても良いですが、パスフレーズの変更もしておくと安全です。一時フォルダに鍵をインポートします:
 
ここで作業を終えても良いですが、パスフレーズの変更もしておくと安全です。一時フォルダに鍵をインポートします:
169行目: 259行目:
 
{{Note|満了した副鍵を失効させる必要はありません、また、良い行いとは言えません。しょっちゅう鍵を無効化させているようでしたら、他人はあなたを信用しなくなるかもしれません。}}
 
{{Note|満了した副鍵を失効させる必要はありません、また、良い行いとは言えません。しょっちゅう鍵を無効化させているようでしたら、他人はあなたを信用しなくなるかもしれません。}}
   
=== 鍵のインポート ===
+
== 署名 ==
   
  +
署名は文章を証明します。文章が改変された場合、署名の検証に失敗します。公開鍵を使用して文章を暗号化する暗号化とは違って、署名はユーザーの秘密鍵を使って作成されます。署名された文章を受け取った人は送り主の公開鍵を使って署名を検証できます。
* 公開鍵を公開鍵束にインポート:
 
   
  +
=== ファイルに署名する ===
$ gpg --import public.key
 
   
  +
ファイルに署名するには {{ic|--sign}} または {{ic|-s}} フラグを使います:
* 秘密鍵を秘密鍵束にインポート:
 
   
$ gpg --import private.key
+
$ gpg --output ''doc.sig'' --sign ''doc''
   
  +
上記のコマンドは暗号化も行ってファイルをバイナリ形式で保存します。
* キーサーバーから鍵をインポート ('--keyserver' を省略した場合、デフォルトのサーバーが使われます):
 
   
  +
=== ファイルやメッセージにクリア署名 ===
$ gpg --keyserver pgp.mit.edu --recv-keys <keyid>
 
   
  +
バイナリ形式に圧縮しないでファイルに署名するには:
=== 鍵を表示 ===
 
   
  +
$ gpg --clearsign ''doc''
* 公開鍵束の鍵:
 
   
  +
上記のコマンドは文章を ASCII-armored 署名でラッピングしますが、文章に変更は加えられません。
$ gpg --list-keys
 
   
  +
=== 分離署名を作成する ===
* 秘密鍵束の鍵:
 
   
  +
文章やファイルとは別に署名ファイルを作成したい場合、{{ic|--detach-sig}} フラグを使ってください:
$ gpg --list-secret-keys
 
   
  +
$ gpg --output ''doc.sig'' --detach-sig ''doc''
== 暗号化と復号化 ==
 
   
  +
上記の方法はソフトウェアプロジェクトを配布するときによく用いられます。署名書を検証することで第三者によってファイルが改竄されていないことが確認できます。
暗号化や復号化をするときは複数の秘密鍵を使用することが可能です。複数の鍵を使うときは使用する鍵を選択する必要があります。{{ic|-u ''<user-id>''}} オプションや {{ic|--local-user ''<user-id>''}} オプションを使うことで選択できます。このオプションを使うとデフォルトの鍵を使用する代わりに指定された鍵を使用します。
 
   
  +
=== 署名の検証 ===
ファイルを暗号化するには、次を使用:
 
   
  +
署名を検証するには {{ic|--verify}} フラグを使います:
$ gpg --encrypt -o secret.tar.gpg secret.tar
 
   
  +
$ gpg --verify ''doc.sig''
* 受取人を変更したい場合は {{ic|-r ''<user-id>''}} オプションで変更できます (または {{ic|--recipient ''<user-id>''}})。
 
* gnupg を使えば機密文書を暗号化できますが、一度に複数のファイルを暗号化することはできません。ディレクトリやファイルシステム全体を暗号化したいときは、[[TrueCrypt]] や [[EncFS]] などを使用するか、tarball にファイルをまとめて暗号化すると良いでしょう。
 
   
  +
{{ic|''doc.sig''}} は検証したい署名に置き換えてください。
ファイルを復号化するには、次を使用:
 
   
  +
ファイルの検証と復号化を同時に行いたいお場合、{{ic|--decrypt}} フラグを使ってください。
$ gpg --decrypt secret.tar.gpg
 
   
  +
分離署名を検証する場合、ファイルと署名の両方が必要になります。例えば、Arch Linux の ISO を検証する場合:
パスフレーズの入力が求められます。
 
   
  +
$ gpg --verify ''archlinux-<version>-dual.iso.sig''
=== パスワードの暗号化 ===
 
   
  +
{{ic|''archlinux-<version>-dual.iso''}} が同じディレクトリに存在していなければなりません。
パスワードを暗号化すれば、設定ファイルに平文で書き込まれなくなります。メールのパスワードなどが良い例でしょう。
 
 
まずパスワードを記述したファイルを作成してください。パスワードの後に空行を'''一行'''だけ追加しておく必要があります。そうしないとファイルを評価するときに gpg がエラーメッセージを返します。
 
 
そして次を実行:
 
 
$ gpg -e -a -r ''<user-id>'' ''your_password_file''
 
 
{{ic|-e}} は encrypt、{{ic|-a}} は armor (ASCII 出力)、{{ic|-r}} は受取人のユーザー ID です。
 
 
新しく {{ic|''your_password_file''.asc}} ファイルが作られます。
 
   
 
== gpg-agent ==
 
== gpg-agent ==
   
''gpg-agent'' はキーチェインにパスワードをリクエストしたりキャッシュしたりするのに使われるデーモンです。メールクライアントなど外部のプログラムから GnuPG を利用する場合に便利です。{{ic|gpg.conf}} に次の行を追加することで使用できます:
+
''gpg-agent'' はキーチェインにパスワードをリクエストしたりキャッシュしたりするのに使われるデーモンです。メールクライアントなど外部のプログラムから GnuPG を利用する場合に便利です。
 
{{hc|~/.gnupg/gpg.conf|use-agent}}
 
 
この設定によって GnuPG はパスワードが必要になった時にエージェントを使うようになります。ただし、あらかじめエージェントを実行しておく必要があります。エージェントを自動的に起動するには、{{ic|.xinitrc}} や {{ic|.bash_profile}} に以下のエントリを追加してください。{{ic|$GNUPGHOME}} を変更していた場合は envfile のパスを忘れずに変更するようにしてください。
 
 
{{hc|~/.bash_profile|2=<nowiki>
 
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
 
</nowiki>}}
 
 
その後、セッションを一度ログアウトしてからログインしなおして下さい。''gpg-agent'' が有効になっているか確認:
 
   
  +
GnuPG 2.1.0 から ''gpg-agent'' の使用は必須となっています。''gpg-agent'' は GnuPG のツールによって必要に応じて実行されるため、手動で起動する必要はありません。
$ pgrep gpg-agent
 
   
 
=== 設定 ===
 
=== 設定 ===
263行目: 325行目:
 
=== エージェントのリロード ===
 
=== エージェントのリロード ===
   
設定を変更した後は、{{ic|gpg-connect-agent}} に {{ic|RELOADAGENT}} という文字列をパイプ渡して、エージェントをリロードしてください
+
設定を変更した後は、{{ic|gpg-connect-agent}} でエージェントをリロードしてください:
   
$ echo RELOADAGENT | gpg-connect-agent
+
$ gpg-connect-agent reloadagent /bye
   
 
シェルに {{ic|OK}} と出力されます。
 
シェルに {{ic|OK}} と出力されます。
278行目: 340行目:
 
# PIN entry program
 
# PIN entry program
 
# pinentry-program /usr/bin/pinentry-curses
 
# pinentry-program /usr/bin/pinentry-curses
# pinentry-program /usr/bin/pinentry-qt4
+
# pinentry-program /usr/bin/pinentry-qt
 
# pinentry-program /usr/bin/pinentry-kwallet
 
# pinentry-program /usr/bin/pinentry-kwallet
   
284行目: 346行目:
 
}}
 
}}
   
{{Tip|{{ic|/usr/bin/pinentry-kwallet}} を使うには {{Pkg|kwalletcli}} パッケージをインストールする必要があります。}}
+
{{Tip|{{ic|/usr/bin/pinentry-kwallet}} を使うには {{AUR|kwalletcli}} パッケージをインストールする必要があります。}}
   
 
変更を行った後は、gpg-agent をリロードしてください。
 
変更を行った後は、gpg-agent をリロードしてください。
290行目: 352行目:
 
=== systemd ユーザーで gpg-agent を起動 ===
 
=== systemd ユーザーで gpg-agent を起動 ===
   
[[Systemd/ユーザー]] 機能を使ってエージェントを起動することが可能です。
+
[[Systemd/ユーザー]]機能を使ってエージェントを起動することが可能です。
   
 
systemd ユニットファイルを作成:
 
systemd ユニットファイルを作成:
301行目: 363行目:
 
[Service]
 
[Service]
 
Type=forking
 
Type=forking
ExecStart=/usr/bin/gpg-agent --daemon --homedir=%h/.gnupg
+
ExecStart=/usr/bin/gpg-agent --daemon
ExecStop=/usr/bin/pkill gpg-agent
 
 
Restart=on-abort
 
Restart=on-abort
   
310行目: 371行目:
   
 
{{Note|
 
{{Note|
* {{ic|GNUPGHOME}} など、サービスに環境変数を設定する必要があります。詳しくは [[systemd/ユーザー#環境変数]] を見て下さい。
+
* {{ic|GNUPGHOME}} を変更している場合、サービスに環境変数を設定する必要があります。詳しくは [[systemd/ユーザー#環境変数]] を見て下さい。
 
* gnupg ホームディレクトリが {{ic|~/.gnupg}} の場合、パスを指定する必要はありません。
 
* gnupg ホームディレクトリが {{ic|~/.gnupg}} の場合、パスを指定する必要はありません。
 
* {{ic|gpg -agent}} は標準ソケットを使いません。代わりに gnupg のホームディレクトリにある {{ic|S.gpg-agent}} という名前のソケットを使います。environment ファイルを読み込んで {{ic|/tmp}} に作成されたランダムなソケットのパスを取得するスクリプトは忘れることができます。
 
* {{ic|gpg -agent}} は標準ソケットを使いません。代わりに gnupg のホームディレクトリにある {{ic|S.gpg-agent}} という名前のソケットを使います。environment ファイルを読み込んで {{ic|/tmp}} に作成されたランダムなソケットのパスを取得するスクリプトは忘れることができます。
  +
* gpg-agent の SSH 機能を使用している場合 (--enable-ssh-support)、上記の systemd ユニットは使えません。
 
}}
 
}}
   
341行目: 403行目:
 
{{Note|上流の開発者は ''gpg.conf'' で ''pinentry-mode loopback'' を設定すると他の機能が使えなくなる可能性があると示唆しています。出来るかぎりコマンドラインオプションを使うようにして下さい [https://bugs.g10code.com/gnupg/issue1772]。}}
 
{{Note|上流の開発者は ''gpg.conf'' で ''pinentry-mode loopback'' を設定すると他の機能が使えなくなる可能性があると示唆しています。出来るかぎりコマンドラインオプションを使うようにして下さい [https://bugs.g10code.com/gnupg/issue1772]。}}
   
== サイパーティ ==
+
=== SSH エジェ ===
   
  +
''gpg-agent'' には OpenSSH エージェントのエミュレーション機能が存在します。既に GnuPG スイートを使っているのであれば、SSH 鍵をキャッシュするのに使うことが可能です。さらに、パスフレーズを管理するのに GnuPG エージェントの PIN エントリダイアログを使えます。
キーサーバーやキーリングにある鍵の正当性をユーザーが確認 (つまり鍵の持ち主が本人であることを確認) できるように、PGP/GPG はいわゆる信頼の輪 ("Web of Trust") を利用しています。信頼の輪を維持するために様々なハッカーイベントが開かれており、キーサインパーティはそのひとつです。
 
   
  +
GnuPG エージェントで SSH 鍵を管理するには、{{ic|~/.gnupg/gpg-agent.conf}} ファイルで SSH のサポートを有効にしてください:
[[Wikipedia:Zimmermann–Sassaman key-signing protocol|Zimmermann-Sassaman]] 鍵署名プロトコルはキーサインパーティを効果的に行うための方式です。[http://www.cryptnet.net/fdp/crypto/keysigning_party/en/keysigning_party.html こちら] にハウツー記事があります。
 
   
  +
{{hc|~/.gnupg/gpg-agent.conf|
=== caff ===
 
  +
enable-ssh-support
  +
}}
   
  +
そして、''gpg-agent'' が常時起動するようにします。[[#systemd ユーザーで gpg-agent を起動]]のユニットファイルを使用するか、{{ic|.bashrc}} ファイルに以下の行を記述してください:
キーサインパーティの後、鍵に署名したり所有者に署名を送るのを簡略化するために、''caff'' というツールを使うことができます。AUR のパッケージ {{AUR|caff-svn}} でインストールすることができ、{{AUR|signing-party-svn}} パッケージなど他の便利なツールにも付属しています。どちらにせよ、AUR から大量の依存パッケージをインストールすることになります。また、以下のように CPAN からインストールすることも可能です:
 
cpanm Any::Moose
 
cpanm GnuPG::Interface
 
   
  +
{{hc|~/.bashrc|<nowiki>
所有者に署名を送信するには [[Wikipedia:ja:メール転送エージェント|MTA]] が必要です。MTA を設定していない場合、[[msmtp]] をインストールして下さい。
 
  +
# 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
  +
</nowiki>}}
  +
  +
SSH が ''ssh-agent'' の代わりに ''gpg-agent'' を使うように {{ic|SSH_AUTH_SOCK}} を設定してください。シェルのタイプに関係なくプロセスが ''gpg-agent'' インスタンスを使うようにするには [[環境変数#pam_env を使う|pam_env]] を使用します:
  +
  +
{{hc|~/.pam_environment|2=
  +
SSH_AGENT_PID DEFAULT=
  +
SSH_AUTH_SOCK DEFAULT="${XDG_RUNTIME_DIR}/gnupg/S.gpg-agent.ssh"
  +
}}
  +
  +
または、Bash を使う場合:
  +
  +
{{hc|~/.bashrc|<nowiki>
  +
# 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
  +
</nowiki>}}
  +
  +
{{Note|1=<nowiki></nowiki>
  +
* GnuPG の設定ファイルのディレクトリがデフォルトと異なる場合、{{ic|gpgconf --create-socketdir}} を実行して {{ic|/run/user/$UID/gnupg/}} にソケットディレクトリを作成してください。ソケットディレクトリを作成しないと GnuPG のホームディレクトリにソケットが配置されてしまいます。
  +
* エージェントを {{ic|gpg-agent --daemon /bin/sh}} で起動している場合、シェルは {{ic|SSH_AUTH_SOCK}} 変数を ''gpg-agent'' から承継します [http://git.gnupg.org/cgi-bin/gitweb.cgi?p=gnupg.git;a=blob;f=agent/gpg-agent.c;hb=7bca3be65e510eda40572327b87922834ebe07eb#l1307]。
  +
}}
  +
  +
{{ic|man gpg-agent}} にあるように、ユーザーを X セッションに切り替えた場合は GPG_TTY も設定して TTY を更新してください。例:
  +
  +
{{hc|~/.bashrc|<nowiki>
  +
# 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
  +
</nowiki>}}
  +
  +
''gpg-agent'' が起動していれば [[SSH 鍵#ssh-agent|ssh-agent]] と同じように ''ssh-add'' で鍵を追加できます。追加された鍵は {{ic|~/.gnupg/sshcontrol}} ファイルに保存されます。パスフレーズが必要になったときは毎回 ''pinentry'' ダイアログが表示されます。パスフレーズのキャッシュは {{ic|~/.gnupg/gpg-agent.conf}} ファイルで制御します。以下の例では ''gpg-agent'' で鍵を3時間キャッシュします:
  +
  +
{{hc|~/.gnupg/gpg-agent.conf|
  +
default-cache-ttl-ssh 10800
  +
max-cache-ttl-ssh 10800}}
   
 
== スマートカード ==
 
== スマートカード ==
380行目: 485行目:
   
 
OpenSC を使わない場合は {{Ic|man scdaemon}} をチェックしてください。
 
OpenSC を使わない場合は {{Ic|man scdaemon}} をチェックしてください。
  +
  +
== ヒントとテクニック ==
  +
  +
=== 他のアルゴリズム ===
  +
  +
強力なアルゴリズムを使用したい場合:
  +
  +
{{hc|~/.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 を使っている場合や、さらに高いセキュリティを求めたい場合、上記のように設定するようにしてください。
  +
  +
=== パスワードの暗号化 ===
  +
  +
{{Tip|[[pass]] は以下の作業を自動化します。}}
  +
  +
パスワードを暗号化すれば、設定ファイルに平文で書き込まれなくなります。メールのパスワードなどが良い例でしょう。
  +
  +
まずパスワードを記述したファイルを作成してください。パスワードの後に空行を'''一行'''だけ追加しておく必要があります。そうしないとファイルを評価するときに gpg がエラーメッセージを返します。
  +
  +
そして次を実行:
  +
  +
$ gpg -e -a -r ''<user-id>'' ''your_password_file''
  +
  +
{{ic|-e}} は encrypt、{{ic|-a}} は armor (ASCII 出力)、{{ic|-r}} は受取人のユーザー ID です。
  +
  +
新しく {{ic|''your_password_file''.asc}} ファイルが作られます。
  +
  +
=== 鍵の無効化 ===
  +
  +
{{Warning|
  +
*無効化証明書にアクセスできれば誰でも鍵を無効化して、利用できなくすることができてしまいます。
  +
*鍵を無効化するのは、鍵が解読されたり消失したり、あるいはパスフレーズを忘れた場合にのみ行なってください。}}
  +
  +
新しい鍵を生成すると無効化証明書が自動的に生成されます。ユーザーが手動で後から生成することも可能です。無効化証明書は {{ic|~/.gnupg/openpgp-revocs.d/}} に存在します。証明書のファイル名は無効化する鍵のフィンガープリントになります。
  +
  +
鍵を無効化したい場合、無効化証明書をインポートするだけです:
  +
  +
$ gpg --import ''<fingerprint>''.rev
  +
  +
そして鍵サーバーをアップデート:
  +
  +
$ gpg --keyserver subkeys.pgp.net --send ''<userid>''
  +
  +
=== 信頼モデルの変更 ===
  +
  +
デフォルトでは GnuPG は信頼モデルとして [[Wikipedia:Web of Trust|Web of Trust]] を使います。Web of Trust から [[Wikipedia:Trust on First|Trust on First]] に変更することが可能です。鍵を追加するときに {{ic|1=--trust-model=tofu}} を追加するか GnuPG の設定ファイルにオプションを追加してください。詳細は [https://lists.gnupg.org/pipermail/gnupg-devel/2015-October/030341.html GnuPG メーリングリストのメール] を参照。
  +
  +
=== 受取人の id を全て隠す ===
  +
  +
デフォルトでは暗号メッセージには受取人の鍵 ID が含まれます。{{ic|hidden-recipient ''<user-id>''}} を使うことで暗号化するときに ID は削除することが可能です。全ての受取人で ID を削除するには設定ファイルに {{ic|throw-keyids}} を追加してください。この設定によってメッセージの受取人を隠すことができ、トラフィックの解析に対抗することができます (ソーシャルエンジニアリングを使うことでメッセージを復号化できてしまえば誰が受取人なのか確認される可能性があります)。欠点としては、暗号鍵を全て試すことになるので復号化が遅くなります ({{ic|--try-secret-key ''<user-id>''}})。
  +
  +
=== キーサインパーティで caff を使う ===
  +
  +
キーサーバーやキーリングにある鍵の正当性をユーザーが確認 (つまり鍵の持ち主が本人であることを確認) できるように、PGP/GPG はいわゆる信頼の輪 ("Web of Trust") を利用しています。信頼の輪を維持するために様々なハッカーイベントが開かれており、キーサインパーティはそのひとつです。[[Wikipedia:Zimmermann–Sassaman key-signing protocol|Zimmermann-Sassaman]] 鍵署名プロトコルはキーサインパーティを効果的に行うための方式です。[http://www.cryptnet.net/fdp/crypto/keysigning_party/en/keysigning_party.html こちら] にハウツー記事があります。
  +
  +
キーサインパーティの後、鍵に署名したり所有者に署名を送るのを簡略化するために、''caff'' というツールを使うことができます。AUR のパッケージ {{AUR|caff-svn}} でインストールすることができます。
  +
  +
所有者に署名を送信するには [[Wikipedia:ja:メール転送エージェント|MTA]] が必要です。MTA を設定していない場合、[[msmtp]] をインストールして下さい。
  +
  +
=== 長い ID やフィンガープリントを毎回表示する ===
  +
  +
長い鍵 ID を表示させるには設定ファイルに {{ic|keyid-format 0xlong}} を追加してください。鍵の指紋を完全に表示するには、設定ファイルに {{ic|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 ===
 
=== Not enough random bytes available ===
387行目: 568行目:
 
Not enough random bytes available. Please do some other work to give the OS a chance to collect more entropy!
 
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
+
$ cat /proc/sys/kernel/random/entropy_avail
   
 
エントロピーがたくさんある健康的な Linux 環境ならマックスの 4,096 ビットに近い値が返されます。返ってくる値が 200 以下の場合、システムのエントロピーが足りていません。
 
エントロピーがたくさんある健康的な Linux 環境ならマックスの 4,096 ビットに近い値が返されます。返ってくる値が 200 以下の場合、システムのエントロピーが足りていません。
397行目: 578行目:
 
{{Ic|pinentry}} を使う場合、使用するターミナルデバイス (例: {{Ic|/dev/tty1}}) の適切なパーミッションが必要です。しかしながら、''su'' (または ''sudo'') を使用すると、所有権は元のユーザーに残り、新しいユーザーにはなくなります。これでは pinentry はたとえ root であっても起動しません。pinentry を使用する (つまりエージェントで gpg を使用する) 前にデバイスのパーミッションを同じ所に変更する必要があります。root で gpg を実行する場合、gpg を使用する直前に所有者を root に変更してください:
 
{{Ic|pinentry}} を使う場合、使用するターミナルデバイス (例: {{Ic|/dev/tty1}}) の適切なパーミッションが必要です。しかしながら、''su'' (または ''sudo'') を使用すると、所有権は元のユーザーに残り、新しいユーザーにはなくなります。これでは pinentry はたとえ root であっても起動しません。pinentry を使用する (つまりエージェントで gpg を使用する) 前にデバイスのパーミッションを同じ所に変更する必要があります。root で gpg を実行する場合、gpg を使用する直前に所有者を root に変更してください:
   
chown root /dev/ttyN # where N is the current tty
+
# chown root /dev/ttyN # where N is the current tty
   
 
そして gpg を使用した後に元に戻して下さい。おそらく {{Ic|/dev/pts/}} と同じのが正しいです。
 
そして gpg を使用した後に元に戻して下さい。おそらく {{Ic|/dev/pts/}} と同じのが正しいです。
   
  +
{{Note|tty の所有者が pinentry を実行しているユーザーと一致している必要があります。{{Ic|tty}} グループに属しているだけでは不十分です。}}
{{Note|The owner of tty ''must'' match with the user for which pinentry is running. Being part of the group {{Ic|tty}} '''is not''' enough.}}
 
   
 
=== エージェントがファイルの終末についてエラーを表示する ===
 
=== エージェントがファイルの終末についてエラーを表示する ===
411行目: 592行目:
 
=== KGpg 設定のパーミッション ===
 
=== KGpg 設定のパーミッション ===
   
There have been issues with {{Pkg|kdeutils-kgpg}} being able to access the {{ic|~/.gnupg/}} options. One issue might be a result of a deprecated ''options'' file, see the [https://bugs.kde.org/show_bug.cgi?id=290221 bug] report.
+
{{Pkg|kdeutils-kgpg}}{{Broken package link|置換パッケージ: {{Pkg|kgpg}}}} には {{ic|~/.gnupg/}} のオプションが使えないという問題がありました。非推奨となった ''options'' ファイルが原因です。[https://bugs.kde.org/show_bug.cgi?id=290221 バグ] レポートを参照してください。
   
Another user reported that ''KGpg'' failed to start until the {{ic|~/.gnupg}} folder is set to {{ic|drwxr-xr-x}} permissions. If you require this work-around, ensure that the directory contents retain {{ic|-rw-------}} permissions! Further, report it as a bug to the [https://bugs.kde.org/buglist.cgi?quicksearch=kgpg developers].
+
また、{{ic|~/.gnupg}} フォルダのパーミッションを {{ic|drwxr-xr-x}} に設定しないと ''KGpg'' が起動しないという報告もあります。パーミッションを変更したときは、ディレクトリの中身のパーミッションを {{ic|-rw-------}} にしてください。さらに、バグとして [https://bugs.kde.org/buglist.cgi?quicksearch=kgpg 開発者] に報告してください。
   
 
=== gnome-keyring と gpg-agent が衝突する ===
 
=== gnome-keyring と gpg-agent が衝突する ===
   
 
Gnome keyring は GPG エージェントコンポーネントを実装していますが、GnuPG バージョン 2.1 から、GnuPG は {{ic|GPG_AGENT_INFO}} 環境変数を無視するようになったため、Gnome keyring を GPG エージェントとして使うことはできません。
 
Gnome keyring は GPG エージェントコンポーネントを実装していますが、GnuPG バージョン 2.1 から、GnuPG は {{ic|GPG_AGENT_INFO}} 環境変数を無視するようになったため、Gnome keyring を GPG エージェントとして使うことはできません。
  +
  +
ただし、バージョン 0.9.6 から {{Pkg|pinentry}} パッケージには {{Ic|pinentry-gnome3}} プログラムが入っています。{{Ic|gpg-agent.conf}} ファイルに以下のオプションを設定することで pinentry プログラムを利用することが可能です:
  +
pinentry-program /usr/bin/pinentry-gnome3
  +
  +
バージョン 0.9.2 から、全ての pinentry プログラムでは設定によって libsecret でパスフレーズを保存することができるようになりました。例えば、{{Ic|pinentry-gnome3}} でユーザーにパスフレーズの要求がいった場合に、パスワードマネージャを使ってパスフレーズを保存するかどうか決めるチェックボックスが表示されます。残念ながら、{{Pkg|pinentry}} パッケージでこの機能は有効になっていません (理由は {{Bug|46059}} を参照)。libsecret を有効にするために {{AUR|pinentry-libsecret}} を代替として使うことができます。
  +
  +
=== mutt と gpg ===
  +
  +
GnuPG 2.1 現在、セッションごとに GnuPG のパスワードが一回要求されるようにするには、[https://bbs.archlinux.org/viewtopic.php?pid=1490821#p1490821 こちらのフォーラムスレッド] を参照してください。
   
 
=== gnupg バージョン 2.1 にアップグレードすると鍵が"消失"する ===
 
=== gnupg バージョン 2.1 にアップグレードすると鍵が"消失"する ===
442行目: 632行目:
 
スマートカードにアクセスする必要があるユーザーに {{ic|scard}} を追加することで解決できます。追加したら、以下のような [[Udev#udev ルールを記述する|udev]] ルールを作って下さい:
 
スマートカードにアクセスする必要があるユーザーに {{ic|scard}} を追加することで解決できます。追加したら、以下のような [[Udev#udev ルールを記述する|udev]] ルールを作って下さい:
 
{{hc|/etc/udev/rules.d/71-gnupg-ccid.rules|<nowiki>
 
{{hc|/etc/udev/rules.d/71-gnupg-ccid.rules|<nowiki>
ACTION=="add", SUBSYSTEM=="usb", ENV{ID_VENDOR_ID}=="1050", ENV{ID_MODEL_ID}=="0116|0111", MODE="664", GROUP="scard"
+
ACTION=="add", SUBSYSTEM=="usb", ENV{ID_VENDOR_ID}=="1050", ENV{ID_MODEL_ID}=="0116|0111", MODE="660", GROUP="scard"
 
</nowiki>}}
 
</nowiki>}}
   
449行目: 639行目:
 
== 参照 ==
 
== 参照 ==
   
* [http://gnupg.org/gph/en/manual.html GNU Privacy ハンドブック]
+
* [https://gnupg.org/ GNU Privacy Guard ホームページ]
  +
* [https://fedoraproject.org/wiki/Creating_GPG_Keys Creating GPG Keys (Fedora)]
* [http://blog.sanctum.geek.nz/series/linux-crypto/ A more comprehensive gpg Tutorial]
 
* [https://www.gnupg.org/faq/gnupg-faq.html GnuPG FAQ]
+
* [https://wiki.debian.org/Subkeys OpenPGP subkeys in Debian]
  +
* [http://blog.sanctum.geek.nz/series/linux-crypto/ 詳しい gpg のチュートリアル]
* [https://help.riseup.net/en/security/message-security/openpgp/gpg-best-practices gpg.conf recommendations and best practices]
 
  +
* [https://help.riseup.net/en/security/message-security/openpgp/gpg-best-practices gpg.conf の推奨事項とベストプラクティス]
 
* [https://github.com/ioerror/torbirdy/blob/master/gpg.conf Torbirdy gpg.conf]
 
* [https://github.com/ioerror/torbirdy/blob/master/gpg.conf Torbirdy gpg.conf]
  +
* [https://www.reddit.com/r/GPGpractice/ /r/GPGpractice - a subreddit to practice using GnuPG.]

2017年10月12日 (木) 23:16時点における版

関連記事

公式サイト によれば:

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

ヒントとテクニック

他のアルゴリズム

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

~/.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[リンク切れ: 置換パッケージ: 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 の例です。

参照