PGP鍵管理
GnuPGインストール
code:shell
# pinentry-macはPINやパスフレーズ入力で使う
brew install gnupg pinentry-mac
# pinentry-programの設定
echo "pinentry-program $(which pinentry-mac)" >> .gnupg/gpg-agent.conf
# 依存でついてきてデフォルトで設定されている(はず)のpinentryを使用する場合は環境変数の設定が必要
export GPG_TTY=$(tty)
GnuPGのデータに関して
GnuPGで使用したデータはデフォルトではすべて${HOME}/.gnupgディレクトリに置かれる
GNUPGHOMEという環境変数を設定しておくことで任意のディレクトリにデータを置ける
コマンド実行時に--homedir <PATH>でもディレクトリ指定が可能
バックアップとして.gnupgごとバックアップしてGNUPGHOMEでそのパスを指定すれば一時的にバックアップの方を使用するということも可能
.gnupgには設定ファイルや鍵本体の他にキーチェーンなどもあるためまるごとバックアップして安全な場所に保管しておくことを勧める
主鍵作成
鍵のアルゴリズムはECCのCurve 25519/448かNIST p-521が望ましい
Curve 448の方が暗号強度が高いが、GnuPG 2.3以降でしか作成できないため注意
Curve 25519→128bit、Curve 448→224bit
NIST p-521は暗号強度が256bitだが、NIST p楕円曲線のシード値がNSAに有利になるように選択しているのではないかという疑惑があったりなかったりするので気になる人はCurve 25519/448を使ったほうが良い
主鍵の用途はCertifyのみにする
デフォルトではSignもついているが外す
主鍵は基本的にPC内に入れず、普段の運用では使わないようにするため
主鍵は有効期限を設けない
主鍵は主鍵さえあれば有効期限を伸ばすことができるので意味がない
名前やE-mailやコメントはお好きに
一応PGP鍵の信用モデル的に鍵は頻繁に変えるものではないので注意
code:sh
# full-gen-keyでないと鍵の詳細な設定ができない
# expertを使用しないと鍵用途の指定ができない
gpg --full-gen-key --expert
gpg (GnuPG) 2.3.4; 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.
Please select what kind of key you want:
(1) RSA and RSA
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
(7) DSA (set your own capabilities)
(8) RSA (set your own capabilities)
(9) ECC (sign and encrypt) *default*
(10) ECC (sign only)
(11) ECC (set your own capabilities)
(13) Existing key
(14) Existing key from card
Your selection? 11
Possible actions for this ECC key: Sign Certify Authenticate
Current allowed actions: Sign Certify
(S) Toggle the sign capability
(A) Toggle the authenticate capability
(Q) Finished
Your selection? s
Possible actions for this ECC key: Sign Certify Authenticate
Current allowed actions: Certify
(S) Toggle the sign capability
(A) Toggle the authenticate capability
(Q) Finished
Your selection? q
Please select which elliptic curve you want:
(1) Curve 25519 *default*
(2) Curve 448
(3) NIST P-256
(4) NIST P-384
(5) NIST P-521
(6) Brainpool P-256
(7) Brainpool P-384
(8) Brainpool P-512
(9) secp256k1
Your selection? 2
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0)
Key does not expire at all
Is this correct? (y/N) y
GnuPG needs to construct a user ID to identify your key.
Real name: <NAME>
Email address: <EMAIL>
Comment: <COMMENT>
You selected this USER-ID:
"<NAME> <<EMAIL>>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
gpg: directory '<HOME>/.gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '<HOME>/.gnupg/openpgp-revocs.d/<FINGERPRINT>.rev'
public and secret key created and signed.
<FINGERPRINT>
uid <NAME> <<EMAIL>>
副鍵作成
鍵用途ごとに一つの鍵を作る
合わせても良い、お好みで
なお、アルゴリズムの関係上Sign/AuthenticateとEncryptは一緒にできないので注意
有効期限はお好みで
1年くらいがちょうど良いと思われる
CLI上ではあたかも期間でのみ指定ができるように見えるが、普通に日付指定も可能
誕生日とか何かしらの記念日にしておくとわかりやすい(かも)
鍵の追加が終わったらかならずsaveして抜ける
saveしないと鍵の追加がなかったことになる
code:shell
# expertをつけないと鍵用途の指定ができない
gpg --expert --edit-key <KEYIDENTITY>
gpg (GnuPG) 2.3.4; 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.
Secret key is available.
sec ed448/<KEYID>
created: 2022-04-03 expires: never usage: C
trust: ultimate validity: ultimate
gpg> addkey
Please select what kind of key you want:
(3) DSA (sign only)
(4) RSA (sign only)
(5) Elgamal (encrypt only)
(6) RSA (encrypt only)
(7) DSA (set your own capabilities)
(8) RSA (set your own capabilities)
(10) ECC (sign only)
(11) ECC (set your own capabilities)
(12) ECC (encrypt only)
(13) Existing key
(14) Existing key from card
Your selection? 11
Possible actions for this ECC key: Sign Authenticate
Current allowed actions: Sign
(S) Toggle the sign capability
(A) Toggle the authenticate capability
(Q) Finished
Your selection? q
Please select which elliptic curve you want:
(1) Curve 25519 *default*
(2) Curve 448
(3) NIST P-256
(4) NIST P-384
(5) NIST P-521
(6) Brainpool P-256
(7) Brainpool P-384
(8) Brainpool P-512
(9) secp256k1
Your selection? 2
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0) 2023-04-22
Key expires at Sat Apr 22 12:00:00 2023 JST
Is this correct? (y/N) y
Really create? (y/N) y
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
sec ed448/<KEYID>
created: <ISSUEDATE> expires: never usage: C
trust: ultimate validity: ultimate
ssb ed448/<KEYID>
created: <ISSUDATE> expires: <EXPIRESDATE> usage: S
# 必要なだけ副鍵を追加する
gpg> save
失効証明書の作成
失効証明書は主鍵作成時に${GNUPGHOME}/opengpg-revocs.dに自動的に生成される
鍵の信頼性が損なわれたときなどに使用する
また、--gen-revoke <KEYIDENTITY>で失効証明書を作成することもできる
失効理由なども書けるので必要な場合は書く
失効証明書は主鍵同様非常に重要であるため安全な場所に保管しておく
鍵のエクスポート
--export-secret-keys <KEYIDENTITY>で秘密鍵をエクスポートできる
主鍵、副鍵どちらを指定しても主鍵も副鍵もすべてエクスポートされる
<KEYIDENTITY>の末尾に!をつけた場合は主鍵なら主鍵のみ、副鍵なら主鍵とその副鍵のみエクスポートされる
秘密鍵には公開鍵の情報も含まれているためわざわざどちらもエクスポートする必要はない
--export-secret-subkeys <KEYIDENTITY>で副鍵の秘密鍵をエクスポートできる
厳密には主鍵の部分がダミーになる
末尾に!をつけたときの挙動もおおよそ同じ(主鍵はダミーになる)
--export <KEYIDENTITY>で公開鍵をエクスポートできる
こちらも主鍵、副鍵どちらを指定しても主鍵も副鍵もすべてエクスポートされる
<KEYIDENTITY>の末尾に!をつけたときの挙動も同じ
--armorでASCII形式のエクスポート、--output <PATH>で出力先をファイル名を指定できる
デフォルトでは標準出力されるためリダイレクト等でファイルにすることもできるが、--outputを使うとパーミッションが600になるので--outputを使うことを勧める
ちなみに--list-packetで出力されたファイルの情報を見ることができる
公開鍵の配布
公開鍵を鍵サーバと呼ばれるところに送信しておけば、誰でも自分の公開鍵をDLすることができるようになる
--send-keys <KEYIDENTITY>で公開鍵を送信できる
おそらく主鍵、副鍵すべて送信される(未検証)
おそらく!で特定の鍵のみ送信することも可能(未検証)
--keyserver <IP or DOMAINNAME>で送信する鍵サーバの指定も可能
主鍵を消す
主鍵は基本的に使用しないためPCから消しておく
${GNUPGHOME}/private-keys-v1.d/に鍵の本体がある
ファイル名は<KEYGRIP>.key
該当Keygripのファイルを消せば鍵が消える
Keygripの見方は「鍵情報をみる」参照
鍵本体がない場合、表示したときにsecやsubの末尾に#がつく
${GNUPGHOME}/opengpg-revocs.d/にある失効証明書も消しておくと良い
鍵情報を見る
code:shell
# 秘密鍵一覧
gpg -K
# 公開鍵一覧
gpg -k
# 鍵情報全表示欲張りセット
# 鍵ID、フィンガープリント、Keygripが追加で表示される
gpg -K --keyid-format=LONG --with-fingerprint --with-keygrip
Configファイルの設定
${GNUPGHOME}/<プログラム名>.confにコマンドラインオプションを--なしで書くと該当プログラムを実行したときに自動で渡される
--expertなどの忘れがちで指定しておいたほうが良いオプションを書いておくと良い
#で行コメントもできる
code:gpg.conf
# 常にエキスパートモードを使用する
expert
# 常に出力をASCII形式にする
armor
# 常に欲張りセットを使うようにする
keyid-format LONG
with-fingerprint
with-keygrip
鍵の期限を延ばしたいとき
--edit-key <KEYIDENTIFY>で鍵編集のプロンプトを開く
key <KEYID>で鍵の選択/選択解除ができる
secやssbの末尾に*がついていれば選択状態
expireで選択した鍵の有効期限を編集できる
主鍵でも副鍵でも鍵編集には主鍵が必要なので注意
終わったらかならずsaveして抜ける
やめたい場合はquitでそのまま抜ければ良い
鍵を失効したいとき
なんらかの理由で鍵を失効したいときは失効証明書を--import <PATH>でインポートすればよい
デフォルトで生成される失効証明書は先頭に:がついておりインポートできないようになっているので編集して:を消す必要がある
鍵を失効したあとは失効した公開鍵を配布する