GPG のお話

gpg

まず gpg をインストールしましょう。

 $ sudo apt install gnupg

gpg を利用するなら、鍵を作らなければなりません。

 $ gpg --gen-key

を実行すると、主鍵 (Master key) の作成をインタラクティブに開始できます。 その過程であなたは名前やメールアドレスなどを要求されるでしょう。 それらはこの Master key に紐付けられ、 Master key はインターネット上におけるあなたのアイデンティティそのものになります。 この鍵によって、インターネットを介していても、第三者があなたと他の人とを区別できるようになります。

一方、そのために、 Master key が漏洩すれば何者かがあなたを騙ることができるようになりますし、 Master key を失うことはすなわちインターネット上のアイデンティティの喪失を意味します。 そうすると、あなたはインターネット上における信用形成をゼロからやり直さなくてはならなくなります。 gpg --gen-key が生成する Master key はこのような重要な役割を果たす鍵ですので、確実に守らなければなりません。

Subkey

そんな大事な鍵は普段使いしたくはありませんね。 そのため、 gpg では 副鍵 (Subkey) という Master key とは別の鍵を利用することができます。

 $ gpg --edit-key <Master keyのIDなど>
 <中略>
 gpg> addkey

とすると、 Subkey の作成をインタラクティブに開始できます。

  • <Master keyのIDなど> の部分には、 Master key の ID そのもの以外にも、 fingerprint やメールアドレスなども指定できます。 詳しくは man gpgHOW TO SPECIFY A USER ID の項を参照してください。

この Subkey は対応する Master key によって署名されており、 Master key と同等の認証情報をもちます。 一方で、 Subkey が漏洩しても Master key 自体の情報は漏洩しません。 漏洩した Subkey のみを無効化し、新しい Subkey に置き換えることを、 Master key の信用を傷つけることなく行うことができます。

そこで、

  1. Master key を作成したら、
  2. 早速 Subkey を作成し、
  3. 普段利用するマシンには Subkey だけを残し、
  4. Master key はどこか安全な場所にしまっておく、

という運用をします。 Master key を使う場面は、 Subkey を無効化したり、有効期限を変更したりするなど、設定変更のときだけです。 そのため、 Master key を普段オフラインの状況においておいて、 Master key が漏洩する心配を減らすことができます。

鍵を作る例

Master key と Subkey の役割を理解したところで、実際にやってみましょう。

 $ gpg --expert --full-gen-key
 gpg (GnuPG) 2.1.15; Copyright (C) 2016 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.

 ご希望の鍵の種類を選択してください:
    (1) RSA と RSA (デフォルト)
    (2) DSA と Elgamal
    (3) DSA (署名のみ)
    (4) RSA (署名のみ)
    (7) DSA (機能をあなた自身で設定)
    (8) RSA (機能をあなた自身で設定)
    (9) ECC と ECC
   (10) ECC (署名のみ)
   (11) ECC (機能をあなた自身で設定)
 あなたの選択は? 11

今回は、せっかくなので、デフォルトのアルゴリズム (RSA) ではなく楕円曲線暗号 (ECC) の方を使ってみようと思います。

  • --gen-key ではなく --full-gen-key を指定して --expert も指定しないと ECC の選択肢が現れないことに注意してください。

鍵には署名や認証などの機能を個別に設定したり[2][footnote2]、同時に暗号化 Subkey も生成したり[3][footnote3]することができます。

鍵ECDSA/EdDSAに認められた操作: Sign Certify Authenticate 
現在の認められた操作: Sign Certify 

   (S) 署名機能を反転する
   (A) 認証機能を反転する
   (Q) 完了

あなたの選択は? s

鍵ECDSA/EdDSAに認められた操作: Sign Certify Authenticate 
現在の認められた操作: Certify 

   (S) 署名機能を反転する
   (A) 認証機能を反転する
   (Q) 完了

あなたの選択は? q

機能をあなた自身で設定を選択すると Sign Certify Authenticate のどの機能を Master key に持たせるかを選択できます。 機能フラグを適宜反転させて、現在の認められた操作にほしい機能が並んでいることを確認したら完了を選択します。

  • 今回は Master key には最低限の機能 Certify だけをもたせ、それ以外の機能は Subkey を用いて実現することにします。
ご希望の楕円曲線を選択してください:
   (1) Curve 25519
   (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
あなたの選択は? 1

楕円曲線暗号で用いる楕円曲線の種類を選択します。

  • ここでは、 Curve 25519[4][footnote4] を選択してみます。
鍵の有効期限を指定してください。
         0 = 鍵は無期限
      <n>  = 鍵は n 日間で期限切れ
      <n>w = 鍵は n 週間で期限切れ
      <n>m = 鍵は n か月間で期限切れ
      <n>y = 鍵は n 年間で期限切れ
鍵の有効期間は? (0) 0
(null)は無期限です
これで正しいですか? (y/N) y

鍵には有効期限を設定することができます。 有効期限が切れた鍵は、有効期限を延長しない限り使えなくなるので、いざ鍵を盗まれたときに、その鍵を悪用される期間を制限することができます。 しかし、有効期限の延長は Master key を用いて行うので、 Master key に対する有効期限はほとんど無意味です。 なので、ここは 0 でよいでしょう。

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

本名: <あなたの名前>
電子メール・アドレス: <あなたの@メールアドレス>
コメント: <任意のコメント(この鍵の役割とか?)>
次のユーザIDを選択しました:
    "あなたの名前 (コメント) <あなたの@メールアドレス>"

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

鍵にあなたの個人情報を関連付けます。

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

pub   ed25519 2017-12-10 [C]
      XXXXXXXXXXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYY
uid                      あなたの名前 (コメント) <あなたの@メールアドレス>

あとは乱数生成器にエントロピーが溜まるのを待つだけです。 XXXXXXXXXXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYY の部分がこの Master key の ID になります。