2005年10月アーカイブ

サイボウズみたいなグループウェアで、フリーのものはないのかな~とずっと思っていたのですが、La! cooda WIZと言うオープンソースのグループウェアを発見しました。
ASPでのサービスの提供とか、販売とかをしない限りは、仕事で使っても無料!と言うのが良いですね。
さっそく最新版の1.4.0のLinux版をダウンロードして、FreeBSDで動かしてみました。
デフォルトではFreeBSDには対応していないので、いろいろ手動でやることはありましたが、簡単に動きます。FreeBSDでの動かし方は、いろいろなサイトで書かれているのでここでは割愛します。

で、使ってみたのですが、不満がちらほら・・・。
  • ユーザは部門と言う単位でわけるのと、グループと言う単位でわけるのがあるらしいが、グループと言うのは個人がユーザをグルーピングできるだけのものらしい。私のような業種だと、プロジェクトのカレンダーとか、プロジェクト内の掲示板とか欲しいんだけど、その辺は弱い。
  • スケジュールに、「場所」がない
で、DBのテーブルを見たり、ソースをちょこちょこ読んだ限りだと、「場所」の概念はあるようだ。
どこかのバージョンで使わなくなっちゃったのかな?
ソースの改変も再配布もおっけ~と書いてあるので、早速ソースをいじいじ。
もともと、昔のバージョン(?)では場所があったようなので、簡単な変更でスケジュールに場所が追加できた。
と、言うわけで、とりあえずパッチを上げておきます。
wizのインストールディレクトリで
zcat wiz_place.patch.gz | patch -p1
とやればパッチがあたります。

openid

| | コメント(2) | トラックバック(0)| Edit
世の中には、openidっちゅーものがあるらしい。
それがなんなのか?はそれぞれググってもらうこととして、http://videntity.org/なんて言うものが立ち上がったそうだ。
思わず、http://false.videntity.org/ なんて言うのを取得したくなってしまうが、 http://videntity.org/ でotsuneというIDを確保しといたによると(と言うかそのリンク先のただのにっきさんによると)TypeKeyのアカウントを持っている場合は、わざわざアカウントを新しく取る必要はないらしい。
そこで、上のリンクを参考に、自分のサイトのトップページのヘッダに以下を追加してみる。
<link rel="openid.delegate" href="http://profile.typekey.com/false/" />
<link rel="openid.server" href="https://www.typekey.com/t/openid" />
で、videntity.org のログインページで www.wizard-limit.net と TypeKeyのパスワードでログインしたら、http://videntity.org/profile/www.wizard-limit.net ができたのでありました。

ってゆーか、おいらの場合TypeKey役に立ってないよ・・・、MT3系にあげたいなあ・・・、でもライセンス料がなあ・・・、でも秀丸とかBeckey!とかには払ってるしなあ・・・、でも買っても3系に移行するの大変そうだしなあ・・・、と悩む毎日なのでありました。
暗号化について、わかっていなかったことが多かったので、ちょっとだけ勉強してみた。
主に、RSAについて。
備忘録のようなもの。まだ間違っていることは多そうなので、見つけたらご指摘いただけるとありがたい。

鍵の生成について

ここで少し書いたけど、そのときは他のサイトで書いてあることをあまり理解せずに書いていた。
RSAの鍵の生成に必要なのは、以下。
% openssl genrsa -out private.pem 1024
  • genrsa は、RSAの鍵を生成すると言うopensslのコマンド
  • -out は、出力する鍵ファイル名
  • 1024 は、鍵のbit数。(省略すると512)
  • 鍵の生成時に、-des3 をつけると、生成された鍵をdes3で暗号化する。des3による暗号化には、パスフレーズを使う。
私が理解していなかったのはこの -des3 の部分で、このオプションをつけると鍵の生成アルゴリズムとして des3 が採用されると思っていたのだが、どうも違うらしい。
-des3 はあくまで生成された鍵を暗号化して保存するかどうかで、生成される鍵自身の強度にはなんら影響を与えない。
だから、apacheのサーバー鍵などで、apache起動時にパスフレーズを聞かれたくない場合には、最初から -des3 オプションなしでサーバ鍵を作ればよい。
ちなみに、上記リンク先で、
% openssl rsa -in server.key -out server_.key
とやるとパスフレーズを外せると書いたが、-des3で鍵を作ってこの作業を行うことと、最初から-des3をつけないことは等価である。
さらに、des3で暗号化されていない鍵に対して、
% openssl rsa -in server.key -des3 -out server_.key
とやると、逆に鍵を暗号化することができる。

genrsa で生成したファイルには、秘密鍵と公開鍵が入っている。
このファイルから、公開鍵のみを取り出すには、
% openssl rsa -in private.pem -out public.pem -pubout -outform PEM
のようにする。以下で述べるような署名、暗号化を行うには、鍵を分離して公開鍵のみを通信相手に配布しておく。

署名と検証について

データが改竄されていないことを証明するために、RSAのキーペアを使って署名と検証を行うことができる。
ただし、データそのものに対してやるとはげしくコストがかかるので、メッセージダイジェストに対して署名を行う。
  • 署名
    % openssl dgst -sign private.pem -sha1 < data.dat > data.sig
    
  • 検証
    % openssl dgst -verify public.pem -sha1 -signature data.sig < data.dat
    
※ -sha1 の部分は、ダイジェストのアルゴリズムを指定する。-sha1 の他に、-md5, -dss1 など。

暗号化/復号化

RSA を使った暗号化/復号化は、「秘密鍵で暗号化→公開鍵で復号」、「公開鍵で暗号化→秘密鍵で復号」が行える。
openssl を使う場合、rsautl コマンドで実現できるのだが、鍵サイズよりも小さなデータしか扱えない。
じゃあ、元データがでかい場合はどうするかと言うと、元データを小さく分割して暗号化してやれば良いのではないだろうか?
サンプルとして、以下のプログラムを書いてみた。(あくまでサンプルなので、エラー処理とか、リリースの解放とかぜんぜんです)
#include <openssl/ssl.h>

int main(int argc, char *argv[]) {
    FILE *keyfp, *orig, *enc, *dec;
    EVP_PKEY *private;
    RSA *rsa;
    char *orig_buf;
    char *crypted_buf;
    char *decrypted_buf;
    int crypted_len;
    int decrypted_len;
    int size;
    int read_len;
    time_t t1, t2, t3;

    ERR_load_crypto_strings();
    
    keyfp = fopen(argv[1], "r");
    if (keyfp == NULL) {
	fprintf(stderr, "ファイルが開けません: %s\n", argv[1]);
	return 1;
    }

    private = PEM_read_PrivateKey(keyfp, NULL, NULL, NULL);
    if (private == NULL) {
	fprintf(stderr, "PEM_read_PrivateKey:%s\n", ERR_error_string(ERR_get_error(), NULL));
	return 1;
    }
    fclose(keyfp);

    rsa = EVP_PKEY_get1_RSA(private);
    if (rsa == NULL) {
	fprintf(stderr, "EVP_PKEY_get1_RSA:%s\n", ERR_error_string(ERR_get_error(), NULL));
	return 1;
    }
    RSA_print_fp(stdout, rsa, NULL);

    printf("RSA_size: %d\n", RSA_size(rsa));

    orig = fopen(argv[2], "r");
    if (orig == NULL) {
	fprintf(stderr, "ファイルが開けません: %s\n", argv[2]);
	return 1;
    }

    enc = fopen(argv[3], "w");
    if (enc == NULL) {
	fprintf(stderr, "ファイルが開けません: %s\n", argv[3]);
	return 1;
    }

    size = RSA_size(rsa);

    orig_buf = malloc(size);
    crypted_buf = malloc(size);
    decrypted_buf = malloc(size);

    t1 = time(NULL);

    while (read_len = fread(orig_buf, 1, size - 11, orig)) {
	crypted_len = RSA_private_encrypt(read_len, orig_buf, crypted_buf, rsa, RSA_PKCS1_PADDING);
	if (crypted_len == -1) {
	    fprintf(stderr, "RSA_private_encrypt:%s\n", ERR_error_string(ERR_get_error(), NULL));
	    return 1;
	}
	fwrite(crypted_buf, 1, crypted_len, enc);
    }
    fclose(orig);
    fclose(enc);

    t2 = time(NULL);
    printf("encrypt: %d\n", t2 - t1);

    enc = fopen(argv[3], "r");
    if (enc == NULL) {
	fprintf(stderr, "ファイルが開けません: %s\n", argv[3]);
	return 1;
    }

    dec = fopen(argv[4], "w");
    if (dec == NULL) {
	fprintf(stderr, "ファイルが開けません: %s\n", argv[4]);
	return 1;
    }

    while (read_len = fread(crypted_buf, 1, size, enc)) {
	decrypted_len = RSA_public_decrypt(read_len, crypted_buf, decrypted_buf, rsa, RSA_PKCS1_PADDING);
	if (decrypted_len == -1) {
	    fprintf(stderr, "RSA_public_decrypt:%s\n", ERR_error_string(ERR_get_error(), NULL));
	    return 1;
	}
	fwrite(decrypted_buf, 1, decrypted_len, dec);
    }
    fclose(enc);
    fclose(dec);

    t3 = time(NULL);
    printf("decrypt: %d\n", t3 - t2);
    
    EVP_PKEY_free(private);
    RSA_free(rsa);
    return 0;
}
これを、
% gcc test.c -lssl -lcrypto
とコンパイルして、
% ./a.out private.pem 元ファイル名 暗号化されたファイル名 復号化されたファイル名
なんて実行すると、private.pem と元ファイル名から、暗号化されたファイル名、復号化されたファイル名が作成される。
  • private.pem は、 -des3 指定していないものしか使えない。(これ、PEM_read_PrivateKey の第3パラメータにコールバックとか指定してみても駄目なんですよね~。暗号化されてる鍵は読み方が違うんだろうな・・・)
  • 元ファイルが大きいと、果てしない時間がかかる。
    (Pentium3 500MHzのマシンで、14Mのファイルの暗号化に4000秒、復号化に200秒)
果てしなく遅いって言うことは、httpsとかsshとかの暗号は、rsaじゃないんでしょうね~。まだまだ勉強しないと、暗号のことはわからないことばかりです・・・。

うちのmailmanを利用している人から、メールが配信されないとの連絡を受けたのでログを見てみたら、
Oct 23 22:54:31 2005 (403) Uncaught runner exception:
Oct 23 22:54:31 2005 (403) Traceback (most recent call last):
  File "/usr/local/mailman/Mailman/Queue/Runner.py", line 111, in _oneloop
    self._onefile(msg, msgdata)
  File "/usr/local/mailman/Mailman/Queue/Runner.py", line 167, in _onefile
    keepqueued = self._dispose(mlist, msg, msgdata)
  File "/usr/local/mailman/Mailman/Queue/IncomingRunner.py", line 130, in _dispose
    more = self._dopipeline(mlist, msg, msgdata, pipeline)
  File "/usr/local/mailman/Mailman/Queue/IncomingRunner.py", line 153, in _dopipeline
    sys.modules[modname].process(mlist, msg, msgdata)
  File "/usr/local/mailman/Mailman/Handlers/ToDigest.py", line 91, in process
    send_digests(mlist, mboxfp)
  File "/usr/local/mailman/Mailman/Handlers/ToDigest.py", line 132, in send_digests
    send_i18n_digests(mlist, mboxfp)
  File "/usr/local/mailman/Mailman/Handlers/ToDigest.py", line 218, in send_i18n_digests
    subject = oneline(msgsubj, lcset)
  File "/usr/local/mailman/Mailman/Handlers/ToDigest.py", line 389, in oneline
    h = make_header(decode_header(s))
  File "/usr/local/mailman/pythonlib/email/Header.py", line 113, in decode_header
    raise HeaderParseError
HeaderParseError

Oct 23 22:54:31 2005 (403) SHUNTING: 130075671.7457731+84684b7d004a9c519b405af300556f4dd8e0a0f6
なんてエラーが出ている。
ダイジェストを作ろうとしてエラーになっている?でも、ダイジェスト会員なんていないんだけどなあ・・・。
良くわからないので、mailmanを2.1.5から2.1.6にバージョンアップしてみる。
これで直れば良いんだけど・・・。
いい加減2.661を使うのもどうだろうと思って、MT3.2 にバージョンアップできないか調べてみる。
かなり影響があるっぽいので、まずは別のマシンにDBをコピーして、DBのアップグレードから。
手順通りにやってみると、mt_categoryのアップグレードでエラーが出る。
アップグレード中にエラーが発生しました: ERROR: adding columns with defaults is not implemented HINT: Add the column, then use ALTER TABLE SET DEFAULT.
どうも、カラムを追加するときに、NOT NULL とか書いてあると、PostgreSQLが対応していないらしくてエラーになるようだ。
手動で、
alter table mt_category add category_parent;
update mt_category set category_parent = 0;
alter table mt_category alter category_parent set not null;
なんてやると、なんとかなるみたいだけど、もう一度実行したら今度はmt_templateで同じエラーが出た。
今度はカラムも多いし、初期値になにを入れたら良いかもわからないので、面倒くさくてここで挫折。
ソースを読んでも、該当箇所がわからなかった・・・(泣)。もうちょっと前のバージョンのアップグレードのソースは、SQLが直接書いてあったっぽいんだけど、今回はカラムの追加/削除等はやり方が変わったらしい。
google で調べてみても、同じケースにあたらないんだけど、みんな困ってないのかなあ・・・。
# 2.6系からバージョンアップする人は、すでに3.0とかのときにやっていて、いまさら問題にならないのかも。

無線LANを、11bから11gに変えたいな~とか思う。
調べてみると、アクセスポイントが9,000円くらい。
問題はインターフェイスの方で、現在のうちのノート2台に内蔵させようと思うと、
  • SONY VAIO SRX-7
    →玄人志向の802.11G-MPCIが使える。5,000円くらい
  • IBM ThinkPad X31
    →(一応)純正しか使えない。8,400円
となる。ThinkPadは、BIOSを書き換えれば3rd partyのもいけるらしいけど、そんなに安くない上に電波法的に違法になるらしい。(じゃあ、玄人志向は良いのか?っちゅー話はありますが)
合計すると2万以上の出費。
でも、無理に内蔵にしないでPCカードのを使うと、1枚2,980円くらいで買えるのだ。
どうせPCMCIAのスロットなんていつもあいてるし、スマートさ(と換装に失敗する危険性)と安さを天秤にかけると、安さになるのかなあ・・・。
なんて悩むと、また今回も見送りと言うことに・・・。
2005年10月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          

このアーカイブについて

このページには、2005年10月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2005年9月です。

次のアーカイブは2005年11月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 6.1.1