【ホームページに戻る】

GnuPG 鍵ペアの作成と公開鍵への署名を自動化する方法


   ● はじめに
   ● 鍵ペア作成の自動化
   ● 公開鍵への署名の自動化

● はじめに

GnuPG の鍵ペア(秘密鍵と公開鍵)の作成方法は、既に
「GnuPG の初期設定の方法」で説明した通りです。しかし、それは対話形式による作成方法でした。
ここでは、同じ作業を shell-script で自動化させる方法を紹介します。 shell-script を利用することで、面倒な繰り返し入力作業から解放されます。 shell-script は、UNIX の世界では一般的なものです。 MacOSX では、ターミナル (Terminal.app) の既定 shell (command-language-interpreter) である bash 用のプログラムです。 MacOS/MacOSX 世界の AppleScript と同じような物だと思ってください。
ここで紹介する shell-script は、小さなプログラムです。テキストファイルなので、誰でも中身を読むことができます。こんな小さなプログラムでも処理の自動化に効果的であることを実感していただければ幸いです。

さて、これから shell-script による処理の自動化を行うわけですが、そのための準備が必要です。
まず、GnuPG がインストールされている必要があります。インストール方法は「GnuPG-1.4.x のインストール方法 (MacOSX-10.3.x)」をご覧下さい。
次に、GnuPG を Terminal.app 上で使用するための Terminal.app の初期設定が必要です。「GnuPG の初期設定の方法」の「作業を始める前の準備」をご覧下さい。


● 鍵ペア作成の自動化

個人的には、一度きりの作業になる場合が殆どだと思いますので、自動化の必要は無いようにも思えますが、あながちそうとも限らないようです。
例えば、Terminal.app 上でのコマンドライン・インターフェース (command-line-interface) に不慣れな方が多いでしょうから、初めてで成功する方は多くないかもしれません。失敗した場合、始めからやり直すことになりますから面倒です。
その他、10人以上の組織において GnuPG を導入する場合、各人に作業手順を説明して個別に作業してもらうよりも、管理者が一括して全員の鍵ペアを作成し、それを配布した方が効率的かもしれません。
以上のような場合を想定して、コマンド一発で鍵ペアを作成できる shell-script を作成しましたので紹介します。

(1)
「GenerateKey.sh」をダウンロードして下さい。

(2) shell-script は、単なるテキストファイルですから、そのままでは実行できません。Terminal.app 上で実行させるには、先頭に「sh」と空白を付けて「sh ./GenerateKey.sh」とします。もし「GenerateKey.sh」を単独で実行できるようにしたい場合には「chmod u+x ./GenerateKey.sh」を実行して、実行属性を与えて下さい。
Mac:~ lisa$ chmod u+x ./GenerateKey.sh

(3) 既に GnuPG の鍵ペアを持っている場合、つまり「~/.gnupg」ディレクトリが存在する場合は、それをバックアップしてから削除します。 例えば、「cd ~/」で作業ディレクトリをホームディレクトリに移してから「gnutar -czf GnuPG_key-ring.tgz ./.gnupg/」でバックアップを取り、「rm -R ./.gnupg/」で削除します。
Mac:~ lisa$ cd ~/
Mac:~ lisa$ gnutar -czf GnuPG_key-ring.tgz ./.gnupg/
Mac:~ lisa$ rm -R ./.gnupg/
【注意】 ここで「~/」の「~」は「-」ではありません。「~」はホームディレクトリを表します。また、「./」の「.」は現在の作業ディレクトリを表します。

(4) 「GenerateKey.sh」を適当な作業場所にコピーします。勿論、ホームディレクトリでもかまいません。 Terminal.app 上での作業場所も同じ場所へ移します。そこで「./GenerateKey.sh 本名 電子メールアドレス コメント パスフレーズ」を実行します。
以下はその実行例です。パラメータの本名やパスフレーズなどは、必ずシングル・クォーテーション「'」で括ってください。なぜなら、空白は区切りと解釈されますし、記号には特別の意味を持つものがあるからです。さらに、パスフレーズの中でシングル・クォーテーションを使わないでください。その他の記号「,<.>/?;:[{]}\|`~!@#$%^&*()-_=+""」は使えます。
Mac:~ lisa$ ./GenerateKey.sh 'Lisa Heartiness' 'lisa@mac.com' 'Singer' 'PASSPHRASE'
'~/.gnupg' directory was created.
gpg: 鍵輪「/Users/lisa/.gnupg/secring.gpg」ができました
gpg: 鍵輪「/Users/lisa/.gnupg/pubring.gpg」ができました
gpg: Generating a standard key
++++++++++.+++++.++++++++++.++++++++++...+++++++++++++++++++++++++..++
+++.+++++++++++++++++++++++++....++++++++++.++++++++++++++++++++++++++
++++.+++++>+++++>..+++++....<.+++++........<.+++++..+++++
.+++++.++++++++++++++++++++++++++++++.+++++++++++++++..+++++...+++++++
+++++++++++++.+++++++++++++++...++++++++++++++++++++++++++++++..+++++.
+++++>+++++...........................................................
.......................+++++^^^
gpg: /Users/lisa/.gnupg/trustdb.gpg: 信用データベースができました
gpg: done
* Key-pair Generation was done. [~/.gnupg]
* Backup Key-ring was created. [LisaHeartiness.tgz]
* Public-Key file was created. [LisaHeartiness.pub]
/Users/lisa/.gnupg/pubring.gpg
-------------------------------
pub  1024D/E58C429C 2004-12-05 Lisa Heartiness (Singer) <lisa@mac.com>
                指紋 = 5E6D 8DEE 820A 9045 8F28  A87C C9AE AFB6 E58C 429C
sub  1024g/686C5396 2004-12-05

Mac:~ lisa$ 

実行結果として、鍵ペアが「~/.gnupg」に作成されます。同時に「~/.gnupg」のバックアップファイル「本名.tgz」と公開鍵「本名.pub」も作成されます。上の例では「LisaHeartiness.tgz」と「LisaHeartiness.pub」がそれです。そして「指紋」も表示されます。
バックアップファイルは、大切に保管してください。公開鍵は、通信相手に渡します。

ちなみに、バックアップファイルから鍵ペアを復元する方法は、次の通りです。ただし、バックアップファイル「GnuPG_key-ring.tgz」がホーム・ディレクトリにあると仮定しています。
Mac:~ lisa$ cd ~/
Mac:~ lisa$ gnutar -xzf ./GnuPG_key-ring.tgz


● 公開鍵への署名の自動化

公開鍵への署名も、たまに一件行うぐらいならば対話形式の入力でも良いかもしれません。しかし、GnuPG 導入当初はたくさんの公開鍵に署名しなければならない場合もあります。
そのような場合に便利な shell-script を作成しましたので紹介します。これによって、複数の公開鍵への署名がコマンド一発で行えます。

(1)
「SignKeys.sh」をダウンロードして下さい。
ただし、GnuPG-1.4.x をインストールした方は「SignKeys140.sh」をダウンロードして下さい。(ダウンロード後、ファイル名を SignKeys.sh に変更して下さい)

(2) shell-script は、単なるテキストファイルですから、そのままでは実行できません。 Terminal.app 上で実行させるには、先頭に「sh」と空白を付けて「sh ./SignKeys.sh」とします。もし「SignKeys.sh」を単独で実行できるようにしたい場合には「chmod u+x ./SignKeys.sh」を実行して、実行属性を与えて下さい。
Mac:~ lisa$ chmod u+x ./SignKeys.sh
【注意】 ここで「~/」の「~」は「-」ではありません。「~」はホームディレクトリを表します。また、「./」の「.」は現在の作業ディレクトリを表します。

(3) 必要な公開鍵を入手して、自分の鍵輪に読み込みます。以下の実行例では、「pgp_test.asc」と「stephane.asc」との二つの公開鍵を読み込んでいます。(一つのファイルに複数の公開鍵が入っている場合があります)
Mac:~ lisa$ gpg --import ./pgp_test.asc ./stephane.asc
gpg: 鍵5A8B747E: 公開鍵「pgp_test <pgp-verification@chldren.net>」を読み込みました
gpg: 鍵992020D4: 公開鍵「St〓phane Corth〓sy (Sen:te) <stephane@sente.ch>」を読み込みました
gpg: 鍵DE1BF91B: 公開鍵「pgp_test <pgp-verification@chldren.net>」を読み込みました
gpg:          処理数の合計: 3
gpg:                読込み: 3  (RSA: 1)
Mac:~ lisa$ 

 また、公開鍵を「公開鍵サーバー」から入手したい場合には、「公開鍵を入手する方法」を参照して下さい。

(4) 「./SignKeys.sh パスフレーズ ユーザID」を実行します。
以下はその実行例です。パスフレーズは、必ずシングル・クォーテーションで括ってください。なぜなら、記号には特別の意味を持つものがあるからです。そして、パスフレーズの中にシングルクォーテーションは使えません。その他の記号は使えます。
ユーザID は、複数指定できます。実際のユーザID は、公開鍵を自分の鍵輪に読み込んだときに表示される情報から得られます。電子メールアドレスでもかまいませんが、鍵ID による指定の方が確実です。マウスカーソルで鍵ID をダブルクリックし、Copy&Paste すれば良いのです。
「SignKeys.sh」を実行すると、たくさんのメッセージが表示されますが、これは、対話形式のときに表示されるものと同じです。処理の過程に興味が無ければ、無視してください。
以下は、その実行例です。
Mac:~ lisa$ ./SignKeys.sh 'PASSPHRASE' '5A8B747E' 'DE1BF91B' 'stephane@sente.ch'

署名が正常に行われたかどうかは「gpg --list-sigs」コマンドで確認できます。
以下は、その例です。公開鍵の各ユーザID に対して「Lisa Heartiness」による署名が付いています。よって、署名は正常に行われました。
Mac:~ lisa$ gpg --list-sigs '5A8B747E' 'DE1BF91B' 'stephane@sente.ch'
pub  1024D/5A8B747E 2000-02-13 pgp_test <pgp-verification@chldren.net>
sig         5A8B747E 2000-02-13   pgp_test <pgp-verification@chldren.net>
sig 2       E58C429C 2004-12-05   Lisa Heartiness (Singer) <lisa@mac.com>
sub  2048g/3393D630 2000-02-13
sig         5A8B747E 2000-02-13   pgp_test <pgp-verification@chldren.net>

pub  1024D/992020D4 2001-08-16 St〓phane Corth〓sy (Sen:te) <stephane@sente.ch>
sig 3       992020D4 2001-08-16   St〓phane Corth〓sy (Sen:te) <stephane@sente.ch>
sig         BE42DCA6 2001-11-29   [\xa5\xe6\xa1\xbc\xa5\xb6\xa1\xbcid\xa4\xac\xb8\xab\xa4\xc4\xa4\xab\xa4\xea\xa4\xde\xa4\xbb\xa4\xf3\x5d
sig 3       992020D4 2001-08-16   St〓phane Corth〓sy (Sen:te) <stephane@sente.ch>
sig 2       E58C429C 2004-12-05   Lisa Heartiness (Singer) <lisa@mac.com>
uid                            St〓phane Corth〓sy (davelopper) <davelopper@users.sourceforge.net>
sig 3       992020D4 2001-10-11   St〓phane Corth〓sy (Sen:te) <stephane@sente.ch>
sig         BE42DCA6 2001-11-29   [\xa5\xe6\xa1\xbc\xa5\xb6\xa1\xbcid\xa4\xac\xb8\xab\xa4\xc4\xa4\xab\xa4\xea\xa4\xde\xa4\xbb\xa4\xf3\x5d
sig 2       E58C429C 2004-12-05   Lisa Heartiness (Singer) <lisa@mac.com>
uid                            St〓phane Corth〓sy (GPGMail) <gpgmail@sente.ch>
sig 3       992020D4 2002-05-29   St〓phane Corth〓sy (Sen:te) <stephane@sente.ch>
sig 2       E58C429C 2004-12-05   Lisa Heartiness (Singer) <lisa@mac.com>
sub  1024g/23FD62FC 2001-08-16
sig         992020D4 2001-08-16   St〓phane Corth〓sy (Sen:te) <stephane@sente.ch>

pub  1024R/DE1BF91B 2000-02-13 pgp_test <pgp-verification@chldren.net>
sig         DE1BF91B 2000-02-13   pgp_test <pgp-verification@chldren.net>
sig 2       E58C429C 2004-12-05   Lisa Heartiness (Singer) <lisa@mac.com>

Mac:~ lisa$ 
この例の中で、「Stephane」の公開鍵には三つのユーザID が割り当てられているにもかかわらず、その全てに「Lisa」の署名が付いていることにも注目してください。



By: Tomio
【ホームページに戻る】