GNU Privacy Guard(GPG)鍵を作ってみた

はじめに

GNU Privacy Guard(GPG)は、データの暗号化と署名に使用します。
使用例としては、下記のものがあります。

  1. 暗号化メール
  2. 電子署名
    • RPMパッケージの署名
    • Git Tagの署名

かつて、Gmailでのメール暗号化のため、Firegpgとともに導入しようとしましたが、日本語が文字化けする・ブラウザが突然落ちるという問題で断念していましたが、今回、GitのTag署名のため、MacOSXで再挑戦したため、その記録を残しておきます。

環境

MacOSX v10.6
CentOS v5.5

導入

MacOSXであれば、下記のコマンドで導入します。

$ brew install gnupg

CentOSであれば、下記のコマンドで導入します。

$ yum install gnupg

鍵生成

    $ gpg --gen-key
    gpg (GnuPG) 1.4.10; Copyright (C) 2008 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: ディレクトリー「/Users/hoge/.gnupg」ができました
    gpg: 新しい構成ファイル「/Users/hoge/.gnupg/gpg.conf」ができました
    gpg: 警告: 「/Users/hoge/.gnupg/gpg.conf」のオプションは起動している間、有効になりません
    gpg: 鍵輪「/Users/hoge/.gnupg/secring.gpg」ができました
    gpg: 鍵輪「/Users/hoge/.gnupg/pubring.gpg」ができました
    ご希望の鍵の種類を選択してください:
       (1) RSA and RSA (default)
       (2) DSA and Elgamal
       (3) DSA (署名のみ)
       (4) RSA (署名のみ)
    選択は? 1
    RSA keys may be between 1024 and 4096 bits long.
    What keysize do you want? (2048) 
    要求された鍵長は2048ビット
    鍵の有効期限を指定してください。
             0 = 鍵は無期限
          <n>  = 鍵は n 日間で満了
          <n>w = 鍵は n 週間で満了
          <n>m = 鍵は n か月間で満了
          <n>y = 鍵は n 年間で満了
    鍵の有効期間は? (0)
    Key does not expire at all
    これで正しいですか? (y/N) y

    あなたの鍵を同定するためにユーザーIDが必要です。
    このソフトは本名、コメント、電子メール・アドレスから
    次の書式でユーザーIDを構成します:
        "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

    本名: Gonbe Nanashi
    電子メール・アドレス: hoge@gmail.com
    コメント: gpg key
    次のユーザーIDを選択しました:
        “Gonbe Nanashi (hoge) <hoge@gmail.com>”

    名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? O
    秘密鍵を保護するためにパスフレーズがいります。

    今から長い乱数を生成します。キーボードを打つとか、マウスを動かす
    とか、ディスクにアクセスするとかの他のことをすると、乱数生成子で
    乱雑さの大きないい乱数を生成しやすくなるので、お勧めいたします。
    +++++
    ....+++++
    今から長い乱数を生成します。キーボードを打つとか、マウスを動かす
    とか、ディスクにアクセスするとかの他のことをすると、乱数生成子で
    乱雑さの大きないい乱数を生成しやすくなるので、お勧めいたします。
    +++++
    .......+++++
    gpg: /Users/hoge/.gnupg/trustdb.gpg: 信用データベースができました
    gpg: 鍵1234FEDCを絶対的に信用するよう記録しました
    公開鍵と秘密鍵を作成し、署名しました。

    gpg: 信用データベースの検査
    gpg: 最小の「ある程度の信用」3、最小の「全面的信用」1、PGP信用モデル
    gpg: 深さ: 0  有効性:   1  署名:   0  信用: 0-, 0q, 0n, 0m, 0f, 1u
    pub   2048R/1234FEDC 2010-09-23
                     指紋 = A1C4 89E8 47BD E506 15BF  B6DA 5585 8592 7B7F FB9C
    uid                  Gonbe Nanashi (hoge) <hoge@gmail.com>
    sub   2048R/ABCD9876 2010-09-23

公開鍵サーバへ自分の公開鍵を登録

下記のサイトにて、公開鍵の登録と検索が可能ですが、今回はコマンドラインから公開鍵サーバへ鍵を登録してみます。
Public Key Server Commands


公開鍵の送信

$ gpg --keyserver pgp.nic.ad.jp --send-keys 1234FEDC
gpg: 鍵1234FEDCをhkpサーバーpgp.nic.ad.jpへ送信


公開鍵の検索と取得をするには、下記のようにします。

公開鍵の検索

    $ gpg --keyserver pgp.nic.ad.jp --search-keys hoge
    gpg: “hoge”をhkpサーバーpgp.nic.ad.jpから検索
    (1)	Gonbe Nanashi (hoge) <hoge@gmail.com>
          2048 bit RSA key 1234FEDC, 作成: 2010-09-23
    番号(s)、N)次、またはQ)中止を入力してください >1    #<=番号を入力すると該当の公開鍵を入手できる
    gpg: 鍵1234FEDCをhkpからサーバーpgp.nic.ad.jpに要求
    gpg: 鍵1234FEDC:“Gonbe Nanashi (hoge) <hoge@gmail.com>”変更なし
    gpg:     処理数の合計: 1
    gpg:         変更なし: 1

これで、RPMパッケージの署名とか、GitのTag署名とかできますね。また、他の人の公開鍵を使って署名を検証するとか、暗号化メッセージを複合化するとかできますよね。(なお、他人の公開鍵を使用する場合、警告が出ますが、ローカルの信用データベースの更新とかの追加のタスクを実施することにより出なくなります。)