hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

gpgコマンドの使い方



1 gpgコマンドとは?

gpgコマンドは、ファイルの暗号化・復号や署名の作成・検証等を行うコマンドです。

2 検証環境

2.1 ネットワーク構成

gpgコマンドの動作確認をするため、2台の仮想マシン(server ,client)を使用します。そして、X-sanがserver、Y-sanがclientで、それぞれ鍵ペア(公開鍵と秘密鍵)を作成します。

                 192.168.122.0/24
server ------------------------------------- client
      .14                                .87

本記事では、以下のことを確認してみます。
・ファイルの暗号化・復号
・ファイルに署名を作成・署名の検証

2.2 版数

仮想マシンのAlmaLinux版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
AlmaLinux release 9.2 (Turquoise Kodkod)

仮想マシンカーネル版数は以下のとおりです。

[root@server ~]# uname -r
5.14.0-284.11.1.el9_2.x86_64

私の環境ではpinentryパッケージのインストールが必要だったので、仮想マシンにpinentryパッケージをインストールしました。

[root@server ~]# dnf install pinentry

gpgの版数は以下のとおりです。

[root@server ~]# gpg --version
gpg (GnuPG) 2.3.3
-snip

3 オプション一覧

gpgコマンドのオプションは以下のとおりです。

[root@server ~]# gpg --help
gpg (GnuPG) 2.3.3
libgcrypt 1.10.0-unknown
Copyright (C) 2021 Free Software Foundation, Inc.
License GNU GPL-3.0-or-later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: /root/.gnupg
サポートしているアルゴリズム:
公開鍵: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
暗号方式: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256,
      TWOFISH, CAMELLIA128, CAMELLIA192, CAMELLIA256
AEAD: EAX, OCB
ハッシュ: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
圧縮: 無圧縮, ZIP, ZLIB, BZIP2

形式: gpg [オプション] [ファイル]
署名、検査、暗号化または復号
デフォルトの操作は、入力データに依存

コマンド:

 -s, --sign                         署名を作成
     --clear-sign                   クリア・テクスト署名を作成
 -b, --detach-sign                  分遣署名を作成
 -e, --encrypt                      データを暗号化
 -c, --symmetric                    暗号化には共通鍵暗号方式のみを使用
 -d, --decrypt                      データを復号 (デフォルト)
     --verify                       署名を検証
 -k, --list-keys                    鍵の一覧
     --list-signatures              鍵と署名の一覧
     --check-signatures             鍵署名の検査と一覧
     --fingerprint                  鍵とフィンガープリントの一覧
 -K, --list-secret-keys             秘密鍵の一覧
     --generate-key                 新しい鍵ペアを生成
     --quick-generate-key           すばやく新しい鍵ペアを生成
     --quick-add-uid                すばやく新しいユーザIDを追加
     --quick-revoke-uid             すばやくユーザIDを失効
     --quick-set-expire             すばやく新しい有効期限を設定
     --full-generate-key            全機能の鍵ペアを生成
     --generate-revocation          失効証明書を生成
     --delete-keys                  公開鍵リングから鍵を削除
     --delete-secret-keys           秘密鍵リングから鍵を削除
     --quick-sign-key               すばやく鍵に署名
     --quick-lsign-key              すばやく鍵へローカルに署名
     --quick-revoke-sig             すばやく鍵への署名を失効
     --sign-key                     鍵に署名
     --lsign-key                    鍵へローカルに署名
     --edit-key                     鍵への署名や編集
     --change-passphrase            パスフレーズの変更
     --export                       鍵をエクスポートする
     --send-keys                    鍵サーバに鍵をエクスポートする
     --receive-keys                 鍵サーバから鍵をインポートする
     --search-keys                  鍵サーバの鍵を検索する
     --refresh-keys                 鍵サーバから鍵を全部更新する
     --import                       鍵のインポート/マージ
     --card-status                  カード・ステイタスを表示
     --edit-card                    カードのデータを変更
     --change-pin                   カードのPINを変更
     --update-trustdb               信用データベースを更新
     --print-md                     メッセージ・ダイジェストを表示
     --server                       サーバ・モードで実行
     --tofu-policy VALUE            TOFUポリシーを鍵に設定する

診断出力を制御するオプション:
 -v, --verbose                      冗長
 -q, --quiet                        いくらかおとなしく
     --options FILE                 FILEからオプションを読み込みます
     --log-file FILE                FILEにサーバ・モードのログを書き出す

コンフィグレーションを制御するオプション:
     --default-key NAME             デフォルトの秘密鍵としてNAMEを用いる
     --encrypt-to NAME              ユーザID NAMEにも暗号化する
     --group SPEC                   電子メールエイリアスを設定する
     --openpgp                      厳密なOpenPGPの振舞を採用
 -n, --dry-run                      無変更
 -i, --interactive                  上書き前に確認

出力を制御するオプション:
 -a, --armor                        ASCII形式の外装を作成
 -o, --output FILE                  出力をFILEに書き出す
     --textmode                     正準テキスト・モードを使用
 -z N                               圧縮レベルをNに設定 (0は非圧縮)

鍵のインポートとエクスポートを制御するオプション:
     --auto-key-locate MECHANISMS   メールアドレスによって鍵を特定する際、MECHANISMSを使用する
     --auto-key-import              署名から手元にない鍵をインポートする
     --include-key-block            署名に公開鍵を含める
     --disable-dirmngr              dirmngrへのすべてのアクセスを無効とする

鍵を指定するオプション:
 -r, --recipient USER-ID            USER-ID用に暗号化
 -u, --local-user USER-ID           署名や復号にこのUSER-IDを使用

Project-Id-Version: gnupg 2.3.0
Report-Msgid-Bugs-To: translations@gnupg.org
PO-Revision-Date: 2021-04-08 10:15+0900
Last-Translator: NIIBE Yutaka <gniibe@fsij.org>
Language-Team: none
Language: ja
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Plural-Forms: nplurals=1; plural=0;
:

(コマンドとオプション全部の一覧は、マニュアル・ページをご覧ください)

例:

 -se -r Bob [ファイル]      ユーザBobへ署名と暗号化
 --clear-sign [ファイル]     クリア・テクスト署名を作成
 --detach-sign [ファイル]   分遣署名を作成
 --list-keys [名前]         鍵を表示
 --fingerprint [名前]       フィンガープリントを表示

バグは <https://bugs.gnupg.org> までご報告ください。

4 基本的な使い方

実践編の前に、gpgコマンドの基本的な使い方を確認してみます。

4.1 鍵ペアを作成する方法(--gen-key)

--gen-keyオプションは、公開鍵と秘密鍵の鍵ペアを作成するオプションです。

[root@server ~]# gpg --gen-key

「本名」はX-san、「電子メールアドレス」はX-san@hoge.comと入力します。そして、「O」を入力して「Enter」キーを押下します。

秘密鍵が盗まれても、悪用されにくくするため、秘密鍵パスフレーズを設定します。パスフレーズを設定したら、「Tab」キーを押下して「OK」にカーソルをあわせます。そして、「Enter」を押下します。

再度、パスフレーズを入力します。

鍵ペアの作成が完了すると、以下のようになります。

4.2 公開鍵を確認する方法( --list-keys、または-k(小文字))

--list-keysオプションは、公開鍵を表示するオプションです。4.1で作成した公開鍵を確認してみます。公開鍵のidがX-sanであることがわかります。

[root@server ~]# gpg --list-keys
/root/.gnupg/pubring.kbx
------------------------
pub   rsa3072 2023-11-27 [SC] [有効期限: 2025-11-26]
      DC4A5479C1E3417346F1AC5C084F72AF5B2AFB76
uid           [  究極  ] X-san <X-san@hoge.com>
sub   rsa3072 2023-11-27 [E] [有効期限: 2025-11-26]

4.3 秘密鍵を確認する方法(--list-secret-keys、または-K(大文字))

--list-secret-keysオプションは、秘密鍵を表示するオプションです。4.1で作成した秘密鍵を確認してみます。

[root@server ~]# gpg --list-secret-keys
/root/.gnupg/pubring.kbx
------------------------
sec   rsa3072 2023-11-27 [SC] [有効期限: 2025-11-26]
      DC4A5479C1E3417346F1AC5C084F72AF5B2AFB76
uid           [  究極  ] X-san <X-san@hoge.com>
ssb   rsa3072 2023-11-27 [E] [有効期限: 2025-11-26]

4.4 秘密鍵を削除する方法(--delete-secret-keys)

--delete-secret-keysオプションは、秘密鍵を削除するオプションです。鍵の削除は秘密鍵、公開鍵の順で行わないと、gpgコマンドでエラーが出力されるので、まず、X-sanの秘密鍵から削除します。

[root@server ~]# gpg --delete-secret-keys X-san

「鍵を削除するか?」と聞かれるので、「y」を入力します。

「鍵を削除するか?」と聞かれるので、「Tab」キーを押下して、「鍵を削除する」にカーソルを合わせます。そして、「Enter」キーを押下します。

再度、「鍵を削除するか?」と聞かれるので、「Tab」キーを押下して、「鍵を削除する」にカーソルを合わせます。そして、「Enter」キーを押下します。


秘密鍵を確認すると、リストから削除されたことがわかります。

[root@server ~]# gpg --list-secret-keys
[root@server ~]#

4.5 公開鍵を削除する方法(--delete-keys)

--delete-keysオプションは、公開鍵を削除するオプションです。X-sanの公開鍵を削除します。

[root@server ~]# gpg --delete-keys X-san
gpg (GnuPG) 2.3.3; Copyright (C) 2021 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

pub  rsa3072/084F72AF5B2AFB76 2023-11-27 X-san <X-san@hoge.com>

この鍵を鍵リングから削除しますか? (y/N) y

リストを確認すると、X-sanの公開鍵が削除されたことがわかります。

[root@server ~]# gpg --list-keys
gpg: 信用データベースの検査
gpg: 究極的に信用する鍵が見つかりません

4.6 鍵をエクスポートする方法(--export)

4.4, 4.5でX-sanの公開鍵、秘密鍵を削除したので、4.1の手順にしたがって、X-sanの公開鍵、秘密鍵を作成しておきます。

--exportオプションは、公開鍵をファイルにエクスポート(書き出す)するオプションです。X-sanの公開鍵をエクスポートします。

[root@server ~]# gpg -ao X-san.pub --export X-san

公開鍵を確認すると、X-sanの公開鍵がファイルにエクスポートされたことがわかります。

[root@server ~]# ls X-san.pub
X-san.pub

4.7 鍵をインポートする方法(--import)

clientで作成した公開鍵をserverに送信します。そして、公開鍵のリストにインポートしてみます。

--importオプションは、公開鍵をリストに追加するオプションです。clientでY-sanの公開鍵を作成します。

[root@client ~]# gpg --gen-key

clientで作成したY-sanの公開鍵をエクスポートします。

[root@client ~]# gpg -ao Y-san.pub --export Y-san

serverに公開鍵を送信します。

[root@client ~]# scp Y-san.pub root@192.168.122.14:/root

serverでY-sanの公開鍵を確認します。

[root@server ~]# ls Y-san.pub
Y-san.pub

Y-sanの公開鍵をインポートします。

[root@server ~]# gpg --import Y-san.pub
gpg: 鍵F12039A2064B868E: 公開鍵"Y-san <Y-san@hoge.com>"をインポートしました
gpg:           処理数の合計: 1
gpg:             インポート: 1

公開鍵のリストを確認します。X-sanの公開鍵の他に、Y-sanの公開鍵もリストに追加されていることがわかります。

[root@server ~]# gpg --list-keys
/root/.gnupg/pubring.kbx
------------------------
pub   rsa3072 2023-11-27 [SC] [有効期限: 2025-11-26]
      D8AC6658FC22B64CAD46DC005098AB5CC2CA9B28
uid           [  究極  ] X-san <X-san@hoge.com>
sub   rsa3072 2023-11-27 [E] [有効期限: 2025-11-26]

pub   rsa3072 2023-11-27 [SC] [有効期限: 2025-11-26]
      3F605381256675ADC76A2ECDF12039A2064B868E
uid           [  不明  ] Y-san <Y-san@hoge.com>
sub   rsa3072 2023-11-27 [E] [有効期限: 2025-11-26]

特定の公開鍵だけを表示するには、--list-keysオプションのパラメータにuidを指定します。
たとえば、X-sanだけの公開鍵を表示するには、以下のように実行します。

[root@server ~]# gpg --list-keys X-san
pub   rsa3072 2023-11-27 [SC] [有効期限: 2025-11-26]
      D8AC6658FC22B64CAD46DC005098AB5CC2CA9B28
uid           [  究極  ] X-san <X-san@hoge.com>
sub   rsa3072 2023-11-27 [E] [有効期限: 2025-11-26]

5 実践編(ファイルを暗号化・復号する方法)

以下の順でファイルを暗号化・復号する方法を確認してみます。
1. serverでY-sanの公開鍵でファイルを暗号化する
2. 暗号化したファイルをserverからclientに送信する
3. clientでY-sanの秘密鍵でファイルを復号する

5.1 事前準備

clientで鍵ペアを作成します。作成した公開鍵を確認します。

[root@client ~]# gpg --list-keys
/root/.gnupg/pubring.kbx
------------------------
pub   rsa3072 2023-11-27 [SC] [有効期限: 2025-11-26]
      3F605381256675ADC76A2ECDF12039A2064B868E
uid           [  究極  ] Y-san <Y-san@hoge.com>
sub   rsa3072 2023-11-27 [E] [有効期限: 2025-11-26]

Y-sanの公開鍵をファイルにエクスポートします。

[root@client ~]# gpg -ao Y-san.pub --export Y-san

エクスポートしてファイルをserverに送信します。

[root@client ~]# scp Y-san.pub root@192.168.122.14:/root

エクスポートしたY-sanの公開鍵はいつでもリストから取り出すことができるので、削除します。

[root@client ~]# rm Y-san.pub
rm: 通常ファイル 'Y-san.pub' を削除しますか? y

Y-sanの公開鍵を確認します。

[root@server ~]# ls Y-san.pub
Y-san.pub

Y-sanの公開鍵をインポートしてリストに追加します。

[root@server ~]#  gpg --import Y-san.pub
gpg: 鍵F12039A2064B868E:"Y-san <Y-san@hoge.com>"変更なし
gpg:           処理数の合計: 1
gpg:               変更なし: 1

Y-sanの公開鍵をリストに追加したので、Y-sanの公開鍵を削除します。

[root@server ~]# rm Y-san.pub
rm: 通常ファイル 'Y-san.pub' を削除しますか? y

公開鍵を確認すると、X-sanの公開鍵の他に、Y-sanの公開鍵が追加されたことがわかります。

[root@server ~]# gpg --list-keys
/root/.gnupg/pubring.kbx
------------------------
pub   rsa3072 2023-11-27 [SC] [有効期限: 2025-11-26]
      D8AC6658FC22B64CAD46DC005098AB5CC2CA9B28
uid           [  究極  ] X-san <X-san@hoge.com>
sub   rsa3072 2023-11-27 [E] [有効期限: 2025-11-26]

pub   rsa3072 2023-11-27 [SC] [有効期限: 2025-11-26]
      3F605381256675ADC76A2ECDF12039A2064B868E
uid           [  不明  ] Y-san <Y-san@hoge.com>
sub   rsa3072 2023-11-27 [E] [有効期限: 2025-11-26]

5.2 ファイルを暗号化・復号する方法

serverでテスト用ファイルを作成します。

[root@server ~]# vi test.txt
[root@server ~]# cat test.txt
0123456789

Y-sanの公開鍵でテスト用ファイルを暗号化します。

[root@server ~]# gpg -r Y-san -ea test.txt
gpg: FBA0E21345620F47: この鍵が本当に本人のものである、という兆候が、ありません

sub  rsa3072/FBA0E21345620F47 2023-11-27 Y-san <Y-san@hoge.com>
  主鍵フィンガープリント: 3F60 5381 2566 75AD C76A  2ECD F120 39A2 064B 868E
  副鍵フィンガープリント: 65FF F682 24BA B68B CF42  3169 FBA0 E213 4562 0F47

この鍵は、このユーザIDをなのる本人のものかどうか確信でき
ません。今から行うことを*本当に*理解していない場合には、
次の質問にはnoと答えてください。

それでもこの鍵を使いますか? (y/N) y

暗号化したファイルを確認します。

[root@server ~]# cat test.txt.asc
-----BEGIN PGP MESSAGE-----

hQGMA/ug4hNFYg9HAQwAo4TLQiL3dvIucsupKIHZ+PxUrrg4fSxErG0R16ZMtB5R
C/vWll1bgPIiHaDpSgvx0iFNdbJN6PXzDsxqIxBy3LaasdmjamYcPIUF0PvXzWmE
VOH2ZMPJtNDQsySQ78oLov/iiRdGX5WjdF7vWm05HxS1JrYaKSblke9FpPJMii39
NiqRA+zKACIjOYrNZVYXDQGk0kiO8OvIAO2HJ2Qa4Y1XGk/T8Mv6aRfOxnqz6owN
ljG/hFDMilgAeiMT1VtUkwfCll9rKEGzjvAGniknkncBKhu+o/BlGA+1x9Oazfei
Dz6T/MGmslqow7xvInSFOdPFIBLPZEWEvu2+3XydECMMxrbXHL/VFVLAN0nuIzNE
H2oGweYQ0G+bBTpSKL2GYadNrXbV6oa6wEp+ZmjfljjAu9UEGHz+0TMUnNI4oXur
3NojbeUc4PC6my+XMICLZSpjvPA8Cg7iqwUoFdEBw29P+XYhK5wGtUu+kwwn2dqg
dqjsiUhZrP9HeGYNzchy1FgBCQIQdIrpYtGYNGCyzVy2AxZyi67PN9QogNlU0uuG
NP1isCnp581T4oLdU+pYyKAUmnq4mfarNx0SsjB/yq7uiccnW9csBrDHX10Hm82j
IZtqu2r0VByy
=YYzY
-----END PGP MESSAGE-----

暗号化したファイルをclientに送信します。

[root@server ~]# scp test.txt.asc root@192.168.122.87:/root

clientで暗号化したファイルを確認します。

[root@client ~]# ls test.txt.asc
test.txt.asc

暗号化したファイルをY-sanの秘密鍵で復号します。-oオプションを使用して、復号した結果をtest.txtに出力します。

[root@client ~]# gpg -d -o test.txt test.txt.asc
gpg: rsa3072鍵, ID FBA0E21345620F47, 日付2023-11-27に暗号化されました
      "Y-san <Y-san@hoge.com>

復号したファイルを確認します。正しく復号できていることがわかります。

[root@client ~]# cat test.txt
0123456789

6 実践編(署名を作成・検証する方法)

以下の順で署名の作成・検証する方法を確認してみます。
1. serverでX-sanの秘密鍵でファイルに署名する
2. 署名したファイルをserverからclientに送信する
3. clientでX-sanの公開鍵で署名を検証する

6.1 事前準備

serverでテスト用ファイルを作成します。

[root@server ~]# vi test.txt
[root@server ~]# cat test.txt
0123456789

X-sanの秘密鍵で署名したファイルをclientで検証するには、X-sanの公開鍵をclientに送信しておく必要がありますので、X-sanの公開鍵をファイルにエクスポートします。

[root@server ~]# gpg -ao X-san.pub --export X-san

エクスポートしたファイルをclientに送信します。

[root@server ~]# scp X-san.pub root@192.168.122.87:/root

X-sanの公開鍵を削除します。

[root@server ~]# rm X-san.pub
rm: 通常ファイル 'X-san.pub' を削除しますか? y

X-sanの公開鍵をインポートします。

[root@client ~]# gpg --import X-san.pub
gpg: 鍵5098AB5CC2CA9B28: 公開鍵"X-san <X-san@hoge.com>"をインポートしました
gpg:           処理数の合計: 1
gpg:             インポート: 1

X-sanの公開鍵をリストに追加したので、X-sanの公開鍵を削除しておきます。

[root@client ~]# rm X-san.pub
rm: 通常ファイル 'X-san.pub' を削除しますか? y

公開鍵のリストを確認します。X-sanの公開鍵がリストに追加されてことがわかります。

[root@client ~]# gpg --list-keys
/root/.gnupg/pubring.kbx
------------------------
pub   rsa3072 2023-11-27 [SC] [有効期限: 2025-11-26]
      3F605381256675ADC76A2ECDF12039A2064B868E
uid           [  究極  ] Y-san <Y-san@hoge.com>
sub   rsa3072 2023-11-27 [E] [有効期限: 2025-11-26]

pub   rsa3072 2023-11-27 [SC] [有効期限: 2025-11-26]
      D8AC6658FC22B64CAD46DC005098AB5CC2CA9B28
uid           [  不明  ] X-san <X-san@hoge.com>
sub   rsa3072 2023-11-27 [E] [有効期限: 2025-11-26]

X-sanの公開鍵を削除します。

[root@client ~]# rm X-san.pub
rm: 通常ファイル 'X-san.pub' を削除しますか? y

6.2 署名の作成・検証する方法

X-sanの秘密鍵でテスト用ファイルに署名をします。

[root@server ~]# gpg --clearsign test.txt

署名したファイルを確認します。

[root@server ~]# cat test.txt.asc
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

0123456789
-----BEGIN PGP SIGNATURE-----

iQGzBAEBCAAdFiEE2KxmWPwitkytRtwAUJirXMLKmygFAmVkdNQACgkQUJirXMLK
myi9rgv+OXcaDKzYzB1zMuLeeHiKp+8Cxvx7dNcA57Pso0awgiQlYdRZjJKrbPki
ymasPetS5Y9AQlFfY/Hd3BSw+rd4TI+IwjDBcoCxEI5OrEWvonSVWxD0cZnuy7Ux
1DlzR58xEwlWafA433EKk7i1FmWFeObTMhZjIA0z32d8Asu+XBNZtvDhbB1y4F+f
w26bZVSfYunf3TUICOWNOvvmBrH+RJSuZYuKUJ3Swm+3jcJUyj8OX05pmexqWRwC
5vjCyrVk/KOhm4WGawC+eT1HFiB7/AlUWHOuE/f6mKK0WLXF9Wnya4wlZHGyIAGk
nynAoJSVl0zA+LnHWDs941KN/W7mKNU58XgxfDAC8I4GX5BlzguETCMS3/K8s/dD
bpO8pMsVLPae+InEshDPbnGlRJeQjVhmfB0fz+ChfsdDLaJmC4DQb/Sl7/sHFtU9
FalEKweOJUA1b+rgr1iwYZk2hx8yavie76s3mFqvEbqQPjmd/HWr0c73AsU+kPuP
9tjRCpBG
=tynM
-----END PGP SIGNATURE-----

署名したファイルをclientに送信します。

[root@server ~]# scp test.txt.asc root@192.168.122.87:/root

署名を検証します。X-sanが署名したことがわかります。

[root@client ~]# gpg --verify test.txt.asc
gpg: 2023年11月27日 19時52分04秒 JSTに施された署名
gpg:                RSA鍵D8AC6658FC22B64CAD46DC005098AB5CC2CA9B28を使用
gpg: "X-san <X-san@hoge.com>"からの正しい署名 [不明の]
gpg: *警告*: この鍵は信用できる署名で証明されていません!
gpg:       この署名が所有者のものかどうかの検証手段がありません。
 主鍵フィンガープリント: D8AC 6658 FC22 B64C AD46  DC00 5098 AB5C C2CA 9B28
gpg: *警告*: 分遣署名ではありません。ファイル「test.txt」は検証され*ませんでした*!

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ

GPGによる公開鍵暗号と署名