Logo address

証明書(Certificate)

目次

2004/12/12 工事中

はじめに

Pegasus での https のサポートは Plan9 4ed. の TLS ライブラリを使用している。
暗号通信を行うためには公開鍵と秘密鍵のペアを作成すれば良いはずなのだが、web の世界ではよけいな付加「価値」を付け、それによってひどく面倒になっている。公開鍵に(意味の無い)証明書を添えなければ、ブラウザが「このサーバは危ないよ」と言わんばかりの警告を発するのである。かくして CA ビジネスなるものが発生する。

Web サーバを使用してビジネスを行おうとすれば証明書を買わざるを得ないであろう。セールスマンは身だしなみを整える必要があるからである。(身だしなみはセールスマンだけではなく、詐欺師の必需品でもある。) 真の信用とは何の関係もないと分かっていても。

「証明書」の作り方

Plan 9 環境では2つの方法がある。rsagen を使う方法と ssh_genkey を使う方法である。いずれも自己証明である。

rsagen

マニュアル rsa(8) によると次のように作成する。(但しこれは Bell Labo の場合)
term% cd /sys/lib/tls
term% auth/rsagen -t 'service=tls owner=*' >key
term% auth/rsa2x509 'C=US CN=*.cs.bell-labs.com' key | auth/pemencode CERTIFICATE >cert
筆者の環境では例えば次のようになるであろう。(どっちみち正式の「証明書」ではないので、適当に書けばよい。)
term% auth/rsa2x509 'C=JP ST=Aichi L=Nagoya O=Aichi-University OU=ArLab CN=Arisawa' key | auth/pemencode CERTIFICATE >cert
これはもちろんブラウザからは警告が発せられる。ブラウザによっては内容を見る事ができる。
Mozilla 1.4 による内容確認

key を秘密にし、cert を公開する。auth/rsagen で生成された key は既に factotum 形式になっている。

term% chmod 400 key
term% chmod 444 cert

Pegasus 2.1 での実行例

Pegasus 2.1 の mon を使うには
term% b=/usr/local/bin/386
term% r=/sys/lib/tls/key
term% c=/sys/lib/tls/cert
term% $b/mon -du web -r $r $b/httpd -suM -p443 -c $c
とする。今回の mon ではユーザ web のパスワードは要らない。
httpd の -c オプションでは「証明書」のフルパスを与える。

ssh_genkey

「証明書」を作るには次の手順を踏む。(マニュアル X509(8))
  1. ssh_genkey によって RSA キーを作成する。これは /sys/lib/ssh に作成される。
  2. X509gen によって「証明書」を作成する
  3. この「証明書」を少し修正する
次のように作成する。(但しこれは Bell Labo の場合)
term% aux/ssh_genkey
term% ls -l /sys/lib/ssh
--rw-rw-r-- M 8 arisawa sys  318 Dec 13 22:57 /sys/lib/ssh/hostkey.public
--rw------- M 8 arisawa sys 1167 Dec 13 22:57 /sys/lib/ssh/hostkey.secret
--rw------- M 8 arisawa sys 1216 Dec 13 22:57 /sys/lib/ssh/hostkey.secret.factotum
term% cd /sys/lib/ssh
term% aux/X509gen -p hostkey.secret  'C=US ST=NJ L=07922 O=Lucent OU=''Bell Labs'' CN=G.R.Emlin' > cert.pem
term% ls -l
--rw-rw-r-- M 8 arisawa staff 822 Dec 13 23:12 cert.pem
--rw-rw-r-- M 8 arisawa sys   318 Dec 13 22:57 hostkey.public
--rw------- M 8 arisawa sys  1167 Dec 13 22:57 hostkey.secret
--rw------- M 8 arisawa sys  1216 Dec 13 22:57 hostkey.secret.factotum
こうして作成された hostkey.secret.factotum は現在の factotum の仕様と合致していない。多分 X509gen が古いのであろう。つまり次のようなものが生成される。
/sys/lib/ssh/hostkey.secret.factotum
key proto=sshrsa size=1024 ek=29 !dk=16F3288A28B20C38809FEF03D68B8749...
マニュアル factotum(4) によれば proto=sshrsa はサポートされていない。
	proto=sshrsa

	proto=rsa service=tls role=client
に書き換えると Pegasus で使える。すなわち
key proto=rsa service=tls role=client size=1024 ek=29 !dk=16F3288A28B20C38809FEF03D68B8749...

Pegasus 2.1 での実行例

以下では hostkey.secret.factotum は修正済みとする。
term% c=/sys/lib/ssh/cert.pem
term% r=/sys/lib/ssh/hostkey.secret.factotum
term% b=/usr/local/bin/386
term% $b/mon -du web -r $r $b/httpd -suM -p443 -c $c
term% ps
...
web            1068    0:00   0:00    1368K Open     httpd
web            1070    0:00   0:00     248K Pread    factotum
arisawa        1071    0:00   0:00     188K Pread    ps
term%
なお Pegasus 2.1 の mon ではユーザ web のパスワードが不要である。

診断

unknown proto rsa

ar% /usr/local/bin/386/mon: # setfactotum: write /mnt/factotum/ctl: unknown proto rsa
これは factotum のバージョンが古い。

参考