新しい GPG 鍵ペアを生成する手順
フリー暗号化ソフトウェア GPG で新しい鍵ペアを生成する手順を説明します.
手順で使用するGPG のバージョンは 2.2.6
になります.
GPG で鍵ペアの生成をする場合 --gen-key
と --full-gen-key
の 2 つのコマンドがあります.
前者はデフォルトの設定で簡易的に鍵ペアを生成してくれるのに対し後者は advanced key generation (より進んだ鍵生成) と言われ細かい設定ができます.
今回は後者の --full-gen-key
コマンドを使って鍵ペアを生成したいと思います.
gpg --full-gen-key
最初に暗号化で使用するアルゴリズムを選ぶように聞かれます.
ほとんどの場合, デフォルトの RSA and RSA で大丈夫です.
RSA とは RSA を設計した Ron Rivest, Adi Shamir, Leonard Adleman のそれぞれのラストネームの頭文字からとっています.
RSA は公開鍵暗号システムの一つで安全なデータのやり取りに広く使われています.
RSA and RSA というのは RSA (主鍵用) and RSA (副鍵用) という意味です.
Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
Your selection? 1
次は RSA のビット長を指定します.
ビット長は大きいほど暗号の強度が高くなります.
なので通常最大の 4096 bits がいいと思います.
ビット長を大きくすると暗号化や署名の際の処理時間が多少長くなりますが, たとえ 4096 bit にしたとしても今の PC なら一瞬だと思いますのでそれほど大きな問題はないと思います.
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 4096
Requested keysize is 4096 bits
次は鍵が有効な期間を決めます.
有効な期限を無期限とするために 0
と入力することもできるのですが, 有効な期限を設定しておくと万が一秘密鍵が流出した時にその設定した期限を過ぎると自動的にその鍵は無効になるので被害を抑えることができます.
ただ流出した秘密鍵が副鍵ではなく主鍵でしかもパスフレーズも総当たり攻撃などで知られてしまった場合, その攻撃者は秘密鍵の主鍵を完全にコントロール下においている状況なので, いくら有効期限を設定したとしても後からいくらでも書き換えられてしまうので意味を成しません.
なので本質的には秘密鍵と後述する失効証明書という秘密鍵を永久的に使えなくするその 2 つを流出しないように最大限, 気をつける以外に生成した鍵の所有権を守る方法はありません.
なので有効期限を設定したからといってそれが絶対の保証になるということにはなりませんので, そのことは留意しておく必要があります.
さて, 有効期限を決める手順に戻りますが, どのくらいの期間を設定するかは個人の裁量に委ねられています.
ただあまり短過ぎるとより頻繁に更新しなくてはいけなくなりますのである程度の期間を開けた方がいいと思われます.
かといって長過ぎると有効期限を設定した意味が薄れてしまいます.
なので 2 年ぐらいがちょうどいいのではないかと思いますので 2y
とします.
ちなみに 1 日は 1
, 1 週間は 1w
, 1 ヶ月は 1m
, 1 年は 1y
となります.
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) 2y
Key expires at Sat Apr 11 04:02:39 2020 JST
この設定で正しい? と聞かれるので Yes の y
を入力します.
Is this correct? (y/N) y
次にユーザー ID を決める手順に入ります.
ユーザー ID は名前, メールアドレス, コメントの 3 つから構成されます.
ユーザー ID は複数持つことができて後から付け加えることができますが, 一度作ったユーザー ID は削除したり失効することはできても変更することはできないので慎重に決める必要があります.
1. 鍵所有者の名前を入力します.
Real name (本名) とありますように, 鍵はいわば個人の身分証明書のようなものです.
また鍵は他の人を署名したり, 他の人から署名されたりします.
なので信用性という観点からニックネームではなく本名を入力すべきなのでしょう.
今回はあくまで例ですので Taro Yamada を使用します.
Real name: Taro Yamada
2. メールアドレスを入力します.
Email address: taroyamada@example.com
3. コメントを入力します.
空欄も可能です.
と言うよりほとんどの場合において空欄のままにした方が簡潔でいいようです.
Comment:
Okay の o
を入力して確認を完了します.
You selected this USER-ID:
"Taro Yamada <taroyamada@example.com>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o
パスフレーズを求められるので入力します.
パスフレーズは秘密鍵が万が一流出した場合に第三者の不正使用から守ってくれる唯一のセキュリティなので大文字小文字のアルファベットに加えて数字や記号が組み合わさったある程度の長さのものが望ましいです.
これで公開鍵と秘密鍵のペアを作ることができました.
pub rsa4096 2018-04-11 [SC] [expires: 2020-04-10]
605B8B327568D3A67970670D3CD33B7DE5441403
uid Taro Yamada <taroyamada@example.com>
sub rsa4096 2018-04-11 [E] [expires: 2020-04-10]
表示される公開鍵の情報は次のような意味です.
pub
– 公開鍵の主鍵を意味しています.uid
– ユーザー ID です.sub
– 公開鍵の副鍵を意味しています.rsa4096
– RSA 暗号アルゴリズムの 4096 ビット長を意味しています.- フラグ
S
– Sign の S を意味しファイルに対する署名ができます.C
– Certify の C を意味し鍵に対する署名ができます.E
– Encrypt の E を意味しファイルを暗号化できます.
2018-04-11
– 鍵の生成日です.expires: 2020-04-10
– 鍵の有効期限が2020年4月10日までという意味です.605B8B327568D3A67970670D3CD33B7DE5441403
– 40 桁の 16 進数からなる指紋と呼ばれるものです.
鍵の生成日が 2018-04-11
で有効期限を 2 年としたのに有効期限が切れるのが 2020-04-11
ではなく 2020-04-10
なのは 2020 がうるう年だからです.
生成された公開鍵と秘密鍵の情報はそれぞれ --list-public-keys
と --list-secret-keys
もしくは -k
と -K
で表示することができます.
gpg -k taroyamada@example.com
のように鍵を特定する情報を指定してその鍵の情報のみを表示することもできます.
鍵ペア生成後, 失効証明書が ~/.gnupg/openpgp-revocs.d
ディレクトリに保存されます.
失効証明書のファイル名は鍵の指紋に拡張子 .rev
が付いた形式になります.
今回の場合は 605B8B327568D3A67970670D3CD33B7DE5441403.rev
と言う名前で保存されました.
この失効証明書は秘密鍵を失効する際に使われます.
秘密鍵を失効しなければいけないような状況は想像したくないですが, 万が一秘密鍵が流出してしまった場合, 失効証明書を使って失効しなければ秘密鍵は自身の身分証明書そのものなので誰かがあなた自身になりすまして不正な活動を行う可能性があります.
反対に失効証明書が流出してしまうと誰かが悪意を持ってあなたの秘密鍵を失効して使い物にならなくしてしまうかもしれません.
なのでその失効証明書は秘密鍵と同じくらい大切なものなので, 大切に保管しておく必要があります.
まとめ
GPG でファイルを暗号化したり署名したり, 他の人の鍵に署名したりする際に鍵ペアが必要になってくると思います.
GPG を使うにあたって鍵ペアを作るというのは最初のステップだと思いますので, 今回の記事を参考にしていただけたら幸いです.
関連記事
Ruby の正規表現を備忘録としてまとめてみた2018.08.30
GPG で複数の受取人で暗号化する時に --group オプションが便利2018.07.29
Git のコミット履歴を大胆に書き換えるなら git rebase -i がオススメ2018.08.23
Git で変更されたファイルを部分的にステージする方法2018.11.01
find コマンドを使ってファイルを検索する方法2018.05.22