2004年04月28日

PostgreSQL an Ruby on Cygwin・その3

前々回前回のまとめ。
Win98 でも動きました. やはり, system() で createdb/dropdb していたのを DBI で template1 につないでおいて, CREATE DATABASE/DROP DATABASE するようにしたら動くようになりました.
推測ですが, Cygwin 側の問題のような気がします. しかも, compile 環境の違いが原因なのではないかと. WinXP で, 配布されているバイナリなら実行できて, source から build すると実行できないわけですから. CYGWIN1.DLL 等の DLL の差かとも考えましたが、違うようです。 配布されているバイナリでも source から build した物でも, 実行時には同じ(Cygwin 1.5.9-1に入っている)DLLを使っているわけですから.
gcc が原因なのか, ld が原因なのか, 静的にリンクしているライブラリの問題なのか. その辺りだと思います.
かなり遠回りしてしまいましたが、気を取り直して開発するぞ!

2004年04月27日

PostgreSQL an Ruby on Cygwin・その2

前のエントリの調査結果。
まず、#3および#7。これは、GCCのバージョンアップに伴って、GCCに同梱されているw32apiのバージョンも上がり、このために#includeする必要のあるヘッダファイルが変わったことが原因だということです。従って、そのヘッダファイルを追加してあげればbuildできるはず。
つぎに、#4。調べてみると、system()を呼んで、createdbを実行しているあたりでエラーが出ていました。これをDBIでtemplate1にconnectして、CREATE DATABASEするように書き換えてやるとうまく動きました。ソースからbuildしたものがエラーを出して、バイナリで配布されているものはエラーを出さない、ということですから、buildした環境が影響しているのでしょう。例えば、CYGWIN1.DLLやGCCの違いとか。#6や#8(Windows98)でも同様の変更で動くようになるといいなぁ。後で試してみて追記します。
でも、
#!/usr/local/bin/ruby
R_DB_NAME="cert"
system("createdb #{R_DB_NAME}")
system("dropdb #{R_DB_NAME}")
みたいな単純なスクリプトは問題なく動くんですよね... どういうことだろう?

PostgreSQL an Ruby on Cygwin

Win98ではまだ動いていない。ちょっとまとめてみる。
# OS Cygwin Ruby PostgreSQL Result
1 Windows XP 1.5.9-1 ruby-1.8.1-i386-cygwin.tar.gz 7.4.1 OK
2 Windows XP 1.5.9-1 ruby-1.8.1-20040416-i386-cygwin.tar.gz 7.4.1 OK
3 Windows XP 1.5.9-1 ruby-1.8.1.targz - Ruby complie error in win32ole
4 Windows XP 1.5.9-1 stable-snapshot.tar.gz 7.4.1 Test Script Error
5 Windows 98 1.5.9-1 ruby-1.8.1-i386-cygwin.tar.gz 7.4.1 Not tested
6 Windows 98 1.5.9-1 ruby-1.8.1-20040416-i386-cygwin.tar.gz 7.4.1 Test Script Error
7 Windows 98 1.5.9-1 ruby-1.8.1.targz - Ruby complie error in win32ole
8 Windows 98 1.5.9-1 stable-snapshot.tar.gz 7.4.1 Test Script Error
やはりWindows 98はダメなのか...
以下詳細。まず#3だが、これは以下のようなエラーになる
make[1]: Entering directory `/home/Fujino/Src/Lang/Ruby/ruby-1.8.1/ext/win32ole'
gcc -g -O2 -I. -I/home/Fujino/Src/Lang/Ruby/ruby-1.8.1 -I/home/Fujino/Src/Lang/Ruby/ruby-1.8.1 -I/home/Fujino/Src/Lang/Ruby/ruby-1.8.1/ext/win32ole -DNONAMELESSUNION -DHAVE_WINDOWS_H -c win32ole.c
win32ole.c: In function `find_default_source':
win32ole.c:5010: error: `GUIDKIND_DEFAULT_SOURCE_DISP_IID' undeclared (first use in this function)
win32ole.c:5010: error: (Each undeclared identifier is reported only once
win32ole.c:5010: error: for each function it appears in.)
make[1]: *** [win32ole.o] Error 1
make[1]: Leaving directory `/home/Fujino/Src/Lang/Ruby/ruby-1.8.1/ext/win32ole'
make: *** [all] Error 1
次の#4だが、TestRCertDB.rb以前に、ruby-dbiのテストスクリプトからしてエラーになる。
$ ruby ../testdbi.rb

Running with Config File example.cfg
FF 3 [main] ruby 2664 sync_with_child: child 2748(0x67C) died before initialization with status code 0x1
13121 [main] ruby 2664 sync_with_child: *** child state child loading dlls
1077183 [main] ruby 2664 sync_with_child: child 2936(0x670) died before initialization with status code 0x1
1086703 [main] ruby 2664 sync_with_child: *** child state child loading dlls
2149202 [main] ruby 2664 sync_with_child: child 2052(0x664) died before initialization with status code 0x1
2159169 [main] ruby 2664 sync_with_child: *** child state child loading dlls
以下、これが繰り返しになるので、[Ctrl]+[C]で止める。
../testdbi.rb:465:in `system': Interrupt from ../testdbi.rb:465:in `teardown'
from ../testdbi.rb:471:in `run'
from ../testdbi.rb:494:in `run'
from ../testdbi.rb:491:in `each'
from ../testdbi.rb:491:in `run'
from /usr/local/lib/ruby/1.8/test/unit/ui/testrunnermediator.rb:46:in `run_suite'
from /usr/local/lib/ruby/1.8/test/unit/ui/console/testrunner.rb:67:in `start_mediator'
from /usr/local/lib/ruby/1.8/test/unit/ui/console/testrunner.rb:41:in `start'
from /usr/local/lib/ruby/1.8/runit/cui/testrunner.rb:27:in `run'
from /usr/local/lib/ruby/1.8/runit/cui/testrunner.rb:14:in `run'
from ../testdbi.rb:505
当然、TestRCertDB.rbを実行しても同様になる。

ちなみに、うまく行った#1および#2だが、これは、#4でcompileしたruby-dbiやruby-postgresでもうまく動くことは確認した。つまり、#4でcompileしたruby-dbiやruby-postgresをインストールした状態で、Ruby本体のバイナリを展開し、ruby-dbiやruby-postgresを再buildせずにTestRCertDB.rbを実行してもOK。

2004年04月26日

PostgreSQL on Cygwin/WinXP・その2

前のエントリの続編。
  1. 2004.4.26(月)現在の最新版Cygwin上で、
  2. ruby-1.8.1のバイナリ)(ruby-1.8.1-20040416-i386-cygwin.tar.gz)をここから落としてきてインストールし、
  3. ruby-postgresおよびruby-dbをコンパイル・インストール後、
  4. TestRCertDB.rbを実行
これもうまく行きます。どうも、rubyのソースをgcc version 3.3.1 (cygming special) on Cygwin 1.5.9(0.112/4/2)でcompileするとおかしくなるようだ。GCCが原因なのか、Cygwinが原因なのか...

PostgreSQL on Cygwin/WinXP

色々試した結果、RCertDBのテストスクリプトがWindows XP上のCygwin環境で動作するようになった。しかしながら、色々な要因が絡み合って、うまく行かないケースがあるようだ。
うまくいったケースは、
  1. 2004.4.26(月)現在の最新版Cygwinをインストールした状態で、
  2. ruby-1.8.1のバイナリ(ruby-1.8.1-i386-cygwin.tar.gz)をここから落としてきてインストールし、
  3. ruby-postgresおよびruby-dbiをコンパイル・インストール
すれば動く、というものだ。
なぜかうまく動かないのは、
  1. 2004.4.26(月)現在の最新版Cygwin上で、
  2. ruby-1.8.1.targzをソースからコンパイルすること
このケースでは、コンパイル不能で、win32oleのコンパイルに失敗する。
  1. 2004.4.26(月)現在の最新版Cygwin上で、
  2. CVS安定版スナップショットをソースからコンパイルして(コンパイル可能)、
  3. ruby-postgresおよびruby-dbをコンパイル・インストール後、
  4. TestRCertDB.rbを実行
このケースでは、TestRCertDB.rbを実行時に子プロセスにエラーが発生する。Windows 98の場合に似ている。
最新のCywin上でruby-1.8.1.tar.gz(リリース版)をコンパイルできないのは何故だろう?GCC-3.3.1になったのが原因なのか?うーん.....

2004年04月25日

がーん→PostgreSQL on Win98

大岡さんおよびナガイさんに作ってもらっているRCertDBをSimpleCAおよびCACAnetCAへ組込むために、PosgresSQLをWindows 98上のCygwin環境で動かそうと頑張っていたのだが、どうも異常終了してしまう。
そこで調べてみるとこのページに、
Windows2000、Windows98での確認をしております。尚、Win98では、postgreSQLは動きません。(安定してません)
と書いてあった。がーん。ダメじゃん。どうしよう。

2004年04月23日

タグ

メインストリームに、C16r-0-1というタグを打った。
また、Ruby Stableに含まれるOpenSSLに対応するため、C16r-0-1-1というタグを持ったブランチを作った。

2004年04月21日

CACAnetCAの実装

だいたい、思ったようなextensionを組み込めるようになりました。つーか、もともと組み込めるんですが、証明書のプロファイルがよくわからないので完成していない、というのが正直なところです。
ところで、実装してて思ったんですが、SimpleCAおよびCACAnetCAは、単に受取ったCSRにお定まりのextensionをつけて盲判を押すだけですから、CAと呼ぶのは適当でない気もします。せいぜいIA(Issuer Authority)かな、と。いや、Authorityという名前自体、JAROに訴えられるかも(笑)。
それはともかく、はやくRCertDBをSimpleCAに組み込めるようにしなければなりません。そろそろ、SessionDBの実装の準備も進めなければ...

2004年04月19日

RCertDB

RCertDBの機能を実装完了しました。

テストケースとライブラリはTextCertDBのものを流用しています。

RDBということで、ライブラリにdbiを使っています。
現在テストケースでは、PostgreSQLを用いたテストのみ想定してます。
TextCertDBからの変更点はIO周りのみです。

テーブルについては、各項目をすべて文字列として格納しています。
このあたりどうしましょうか?
TextCertDBとコードを変わらないようにするのであれば、文字列としておいていいと思います。
CertDBで共通の部分をまとめてやれば、RCertDBではRDBの機能をフルに使った実装がいいのかな?

注意点、データベースクラスのインスタンスは、使用後はdisconnectだけでなく、インスタンスにnilを入れてGCを実行しないとデータベースの最大アクセス数を超えてしまうと思われます。
このあたり、意識しないで行う方法はないんでしょうか。

投稿者 echizen : 15:20 | コメント (2) | トラックバック

2004年04月18日

開発コミュニティが広がりました!

ナガイケイさんと、大岡さんがSQLを使った、RCertDBを実装してくれることになりました。

2004年04月16日

と思ったけど

昨日のアイデアだけど、問題点が見つかりました。証明書の自動生成のときに、有効期限を指定する方法がありませんでした。
仕方がないので、SimpleCAのクラスメソッドとして実装したいと思ったのですが、serialをどうするか、という問題は残ってるんだよな。ということは、こういうことかな?
  1. SimpleCA#initializeで、certをX509::Nameにして呼び出すことを可能とする。Keyはnilにできない。"RSA:2048"のように指定すると、自動生成する。ただし、このときには証明書を生成しない(正確に言うと、X509::Certificate.newはするが、X509::Certificate#signを実行しない)。
  2. で、インスタンスを生成した後で、SimpleCA#create_self_signed_certificate()で証明書を生成する。
これに伴って、CAが有効な状態かそうでないかを調べるSimpleCA#valid?も必要かな。

CACAnetCAクラスのテストスクリプト

書きました。
でも、昨日言ったことはまだ実装していません。やります。すぐやります。

2004年04月15日

SimpleCAの生成

よく考えたら、何もない状態からnewする方法を考えていませんでした。 現在、CA生成に必要なパラメータは、
SimpleCA#initialize(cert,key,dbtype,*dbargs)
ですから、要するに、
cert
OpenSSL::X509::Certificate: CAの証明書
key
OpenSSL::Pkey::Pkey: CAの秘密鍵
dbtype,*dbargs
証明書データベース情報
となっています。このうち、keyは自動生成できて、それを元に自己署名のcertを作ることができます。ただし、subject DNは別途与えてあげる必要があります。keyもDSA/RSA、鍵長を指定してやれるといいですが。
以上の観測から、certにOpenSSL::X509::Name、keyにStringで"RSA:2048"と書くと、CAの証明書とCAの鍵を自動的に生成するインターフェースにしよう。これに伴って、以下のメソッドも定義する必要があるかな。
SimpleCA#certificate
CAの証明書を読み出す(OpenSSL::X509::Certiricate)
SimpleCA#private_key
CAの秘密鍵を読み出す(OpenSSL::Pkey::Pkey)
永続化のため、CAの証明書および秘密鍵などをファイルへ書き出す操作は、SimpleCAのメソッドとした方がよいのだろうか?思案中...

2004年04月14日

Directory構成

と言っても、LDAPがどうしたとか、subject DNがどうしたという話ではありません(笑)。
C16r/lib/*.rb
C16r/lib/CACAnet/*.rb
に変更したというだけです。
C16r/lib/C16r/*.rb
とか
C16r/lib/CACAnet/C16r/*.rb
の方がよかったかなぁ?

CAの設計

とりあえず, extension を証明書に入れる準備はできました. あとは, どのようなルールで extension を組み込むか, という事になります. CACAnet の認証局としては, ほとんどの extension は, デフォルトの物を組み込めば良いはずです. 例外は,
  1. subjectKeyIdentifier
  2. issuerIdentifier
  3. subjectAltName
  4. issuerAltName
あたりですかね.
この内, bに付いてはCA自身が知っているので問題無し. aとcについては, CSRをもらった時点で必ず判明するはずです. subject DNにemailAddressが含まれてなければcは不明になりますが.
最後のdにはRAのメールアドレスを入れる事になっています. RAのメールアドレスを取得する方法は, 次の二つ考えられます.
  1. CSRに入れる
  2. CSRとは別の方法で指定する
どちらを仮定するのがいいんでしょうね? UMLを見て考えれば良いのでしょうが... CSR って, 誰がつくるんでしたっけ? RAサーバかな? だったらCSRで指定されることを仮定しても良さそうですね.
とりあえずですが, SimpleCAは, add_default_extensionとsignの第二引数で指定された物のみを無条件にextensionとして組み込むという実装にしたいと思います. 重複のチェックも行いません. CSR から extensionを取りだす事もしません. で, SimpleCAを継承したCACAnetCA(仮称)をつくって, 適当な既定のextensionを組み込んだり, 重複した場合は適切な優先順位で残すべきものを残し, CSRからissuerAltNameを取りだしたりしたいと思います.
  • SimpleCA ... 基本的なCA
    • CACAnetCA ... デフォルトで適切なextensionを組み込むCA

2004年04月13日

複雑なextension

複雑なextensionを扱えるようにしました... というか、複雑なextensionをconfigから読んで入れられるようになったというだけです。例えば、コンフィグファイル cacanet.cnf に、
[polsect]
CPS=http://www.cacanet.org/CACAnetClassACA/ClassAMembersRACPS.html
userNotice=@notice

[ notice ]
explicitText="This certificate is issued for your PKI as a non-profit public service."
organization="Citizen's Association for Certification Authority Network Fukuoka"
noticeNumbers=1
と書いておいて、プログラムの方で、
ef = X509::ExtensionFactory.new
ef.config = Config.new('cacanet.cnf')
exts1 = []
exts1 << ef.create_extension("certificatePolicies","ia5org,@polsect")
とやると、ちゃんと期待通りの動作をします。
が、できれば、configを読まずにやらせたいと考えています。もちろん、ここでやったように、事前にDERを用意しておけばOKですが... やっぱ、OpenSSL::ASN1あたりを駆使して最後にDERにするのが正しい方法かな?

匿名投稿

を許可しました。 本当は、許可したくないんですが、でも、email addressをインターネットへさらさないとコメントできないってのもどうかと思うので。

拡張領域が付く様になりましたが...

ef = X509::ExtensionFactory.new
ef.create_extension("policyConstraints", "DER:3005A003020103")
みたいな形式は扱えないようです。
ただ、ruby-1.8.1のソースをつらつらと眺めていると、opensslのconfigを読み込んだり、X509::RequesetやX509::CRLを読み込んだりするインターフェースが付いているようです。これで何とかなるのかな?

2004年04月12日

SimpleCA: 拡張領域

SimpleCA ですが, 現在は, X509::Request を受け取って, 拡張領域が全く無い証明書を発行できるところまで実装しています. 残る課題は,
  1. 拡張領域の付加
  2. CRL の発行
です. bは現在構想中です. 要するに, まだ手をつけてません(笑).
上のaについては, SimpleCA のインスタンスに,
ca.add_extensions(default_extensions)
みたいな形でデフォルトの拡張領域を設定しておき,
ca.sign(req,override_extensions=[])
みたいな形で, それを上書きする, みたいなインターフェースにしようと考えています.
このとき, req 内の拡張領域をどう扱おうか思案中です. まぁ, req 内のextension は無視するという実装でも構わないような気もしますが. ちょっとRuby のOpenSSL を調べてみましたが, X509::Request から extension を取りだすmethod は無いような気がします.

CommunityPKIBuilderLibのリポジトリ

リポジトリは、
  • CVSROOT=:ext:cvs.cacanet.org:/CACAnet/CVS
  • CVS_RSH=/usr/bin/ssh
です。もし開発に参加されたいとか、藤野のコードに文句をつけ... じゃなく、レビューしてあげよう、という奇特な方がおられましたら、CACAnet-TalkとかCACAnet-memberとかで表明していただければ、リポジトリ管理者から折り返し連絡が行くと思います。 リポジトリのWebインターフェースがhttp://cvs.cacanet.org/cgi-bin/cvsweb.cgi/CommunityPKIBuilderLib/にあるようです。

CommunityPKIBuilderLibのクラス構成

クラス構造は以下の通り.
  • Object...
    • SimpleCA... 証明書の発行, CRL の発行等を扱う
    • CertDB... 証明書データベースの基本クラス
      • TextCertDB... openssl ca コマンドの index.txt 型式を扱う
現在, CertDB および TextCertDB は, 基本的な実装は終了しています.

新装開店

ブログ武者修行は閉店して、CommunityPKIBuilderLib通信を新規開店しました。