普段利用する機会がなく、お作法がよくわからなかったので、忘れっぽい自分のために一筆書きます。 日本国内では、CSIRT間でのやり取りでGPGの利用が推奨されていますね。
参考ドキュメント
GnuPG チートシート(鍵作成から失効まで)- 神ドキュメントです。これ見れば良いんじゃないか?感
実行環境
macOS Mojave 10.14.1(18B75)工程
- セットアップ
- 署名
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>"からの正しい署名 [究極]
所感
実際のやり取りでは、相手から貰った公開鍵で暗号化して、自分の鍵で署名するとか発生すると思います。それは実際に体験してみてから書くことにします。 今日はここまでです。
お疲れ様でした。