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」は検証され*ませんでした*!