GPGを使い始める備忘録

こんにちは、ひろかずです。 セキュリティ系の関係者とメールでやり取りする時、GPG(GNU Privacy Guard)を使ったやり取りが発生すると思います。  
普段利用する機会がなく、お作法がよくわからなかったので、忘れっぽい自分のために一筆書きます。   日本国内では、CSIRT間でのやり取りでGPGの利用が推奨されていますね。

参考ドキュメント

GnuPG チートシート(鍵作成から失効まで)
  • 神ドキュメントです。これ見れば良いんじゃないか?感

実行環境

macOS Mojave 10.14.1(18B75)

工程

  1. セットアップ
  2. 署名

1. セットアップ

GPGのインストール

$ brew install gpg

鍵の生成

  • ターミナル上で操作する際、文字化けするプロンプトが表示される場合があります
  • パスフレーズに入力画面なので、慌てず騒がず入力しましょう。
$ gpg --gen-key
gpg (GnuPG) 2.2.11; Copyright (C) 2018 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.

注意: 全機能の鍵生成には "gpg --full-generate-key" を使います。

GnuPGはあなたの鍵を識別するためにユーザIDを構成する必要があります。

本名: hirokazu
電子メール・アドレス: name@email.com
次のユーザIDを選択しました:
    "hirokazu <name@email.com>"

名前(N)、電子メール(E)の変更、またはOK(O)か終了(Q)? O

たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動か
す、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生
成器に十分なエントロピーを供給する機会を与えることができます。
たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動か
す、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生
成器に十分なエントロピーを供給する機会を与えることができます。
gpg: /Users/USERNAME/.gnupg/trustdb.gpg: 信用データベースができました
gpg: 鍵xxxxxxxxxxxxxxxxを究極的に信用するよう記録しました
gpg: ディレクトリ'/Users/USERNAME/.gnupg/openpgp-revocs.d'が作成されました
gpg: 失効証明書を '/Users/USERNAME/.gnupg/openpgp-revocs.d/xxxxxxxxxxxxxxxxxxxxxxxxxxxxx.rev' に保管しました。
公開鍵と秘密鍵を作成し、署名しました。

pub   rsa2048 2018-11-17 [SC] [有効期限: 2020-11-16]
      xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
uid                      hirokazu <name@email.com>
sub   rsa2048 2018-11-17 [E] [有効期限: 2020-11-16]

公開鍵の確認

$ gpg -k hirokazu
gpg: 信用データベースの検査
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: 深さ: 0  有効性:   1  署名:   0  信用: 0-, 0q, 0n, 0m, 0f, 1u
gpg: 次回の信用データベース検査は、2020-11-16です
pub   rsa2048 2018-11-17 [SC] [有効期限: 2020-11-16]
      xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
uid           [  究極  ] hirokazu <name@email.com>
sub   rsa2048 2018-11-17 [E] [有効期限: 2020-11-16]

秘密鍵の確認

$ gpg -K hirokazu
sec   rsa2048 2018-11-17 [SC] [有効期限: 2020-11-16]
      yyyyyyyyyyyyyyyyyyyyyyyyyyyyy
uid           [  究極  ] hirokazu <name@email.com>
ssb   rsa2048 2018-11-17 [E] [有効期限: 2020-11-16]

鍵指紋の表示(4桁10ブロックのものが鍵指紋)

$ gpg --fingerprint hirokazu
pub   rsa2048 2018-11-17 [SC] [有効期限: 2020-11-16]
      AAAA 1111 BBBB 2222 CCCC  3333 DDDD 4444 EEEE 5555
uid           [  究極  ] hirokazu <name@email.com>
sub   rsa2048 2018-11-17 [E] [有効期限: 2020-11-16]

公開鍵をエクスポート

$ gpg -a --export hirokazu > hirokazu-pubkey.asc
$ cat hirokazu-pubkey.asc
-----BEGIN PGP PUBLIC KEY BLOCK-----
:
中略
:
-----END PGP PUBLIC KEY BLOCK-----

署名

いろいろ用途がありそうなやり方を並べます

クリア署名

テキスト文字列にそのまま署名する場合に使います。

テキストの署名

$ echo Hello world | gpg -u hirokazu --clear-sign
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

Hello world
-----BEGIN PGP SIGNATURE-----

iQFPBAEBCAA5FiEElDiQwOm3cAAVqT1x8Tm7w0zb4k4FAlwDofobHGhpcm9rYXp1
QGNsb3VkbmF0aXZlLmNvLmpwAAoJEPE5u8NM2+JOxk0H/3mXC+ls/Djk4K7hheY+
OGBvgyNIWjbNtjPBA/Dp3f1iECy5G99SWz86f2wyjIAHqcZUx52EsmkUp3fekN1P
RZgQzlroM5ruq9NnZx7S6zi2xgQYrZN7r5wKR7zNu9jIxNANwITyxPY8KDTpl8tA
3CuiwjkMOvX5bRaiJpE1MVhr0Jgjcq1xo1yiN/JHlhTmqVV7c6GYw2LUf+dz2HPc
KVdupRFxP6oTLXK3SgktcFdMahOuZRxFzferiWa3fB2onUlGBEShJq2VF2h/2bYl
Nxmdc+Bim/1jiusSuG4jRk+36ELyoIYpaUOnHbkMWBwa8N6yOmsk/CoKb5ydli3q
CTI=
=jA75
-----END PGP SIGNATURE-----

トラブルシュート

このように表示されてしまった場合は…
$ echo Hello world | gpg -u hirokazu --clear-sign
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

Hello world
gpg: 署名に失敗しました: Inappropriate ioctl for device
gpg: [stdin]: clear-sign failed: Inappropriate ioctl for device
このコマンドを実行してみてください
$ export GPG_TTY=$(tty)

署名の検証

自分の署名をそのまま検証するのでこんな感じになります。
$ echo Hello world | gpg -u hirokazu --clear-sign | gpg -d
Hello world
gpg: 日 12/ 2 18:34:26 2018 JSTに施された署名
gpg:                RSA鍵1234567890123456789012345678901234567890を使用
gpg:                発行者"name@email.com"
gpg: "hirokazu <name@email.com>"からの正しい署名 [究極]

分離署名

ファイルに署名(ファイルと署名を分離)をする場合は、分離署名を使います。

ファイルの署名

コマンドを実行すると、<ファイル名.sig>が作成されます
  • 両方のファイルを相手に渡します。
  • テキストファイルの場合は--textmodeを使います
$ gpg -u hirokazu --textmode -b test.txt
$ ll | grep test
-rwx------    1 hirokazu  staff      1491  7 12 16:38 test.txt
-rw-r--r--    1 hirokazu  staff       338 12  2 18:47 test.txt.sig

署名の検証

受信者は、以下コマンドで検証します。
$ gpg --verify test.txt.sig test.txt
gpg: 日 12/ 2 18:47:18 2018 JSTに施された署名
gpg:                RSA鍵1234567890123456789012345678901234567890を使用
gpg:                発行者"name@email.com"
gpg: "hirokazu <name@email.com>"からの正しい署名 [究極]

埋め込み署名

ファイルに署名(ファイルに署名を埋め込む)する場合は、埋め込み署名を使います。

ファイルの署名

$ gpg -u hirokazu -s test.txt
<ファイル名.gpg>ファイルが作成されます
  • ファイルの中身はバイナリとなって、可読性はありません
$ ll | grep test
-rwx------    1 hirokazu  staff      1491  7 12 16:38 test.txt
-rw-r--r--    1 hirokazu  staff       830 12  2 18:57 test.txt.gpg

署名の検証

内容付きで検証する場合
$ gpg -d test.txt.gpg
:
前略
36 39 63 25 32 32 25 37
44 25 35 44 25 37 44
gpg: 日 12/ 2 18:57:17 2018 JSTに施された署名
gpg:                RSA鍵1234567890123456789012345678901234567890を使用
gpg:                発行者"name@email.com"
gpg: "hirokazu <name@email.com>"からの正しい署名 [究極]

所感

実際のやり取りでは、相手から貰った公開鍵で暗号化して、自分の鍵で署名するとか発生すると思います。
それは実際に体験してみてから書くことにします。 今日はここまでです。
お疲れ様でした。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です