2009年7月31日

新江ノ島水族館

今週末は鎌倉の海岸で海水浴予定だったが、あいにくの天気に見舞われ、新江ノ島水族館に行き先を変更。
朝一の館内は、そんなに人も混んでおらずそこそこ展示物を楽しめたが、イルカショーの後のころには、ペンギンもカメタッチも人混み過ぎてあまり楽しめず。
イルカショーは、へんちくりんな格好した人間のパフォーマンスが目に付き、肝心のイルカの芸が迫力がない。でも、それはあくまで大人目線で、ムスメは一人で拍手しながら大興奮。
正直、イルカショーに限っていえば、近場の品川アクアスタジアムの方が数倍は楽しい。明らかに客の歓声の数も大きさも違った。
でも展示物はこちらの方が多いし、ムスメがもう少し大きくなってゆっくり回れるようになったら、もう一度来てみようか。


2009年7月14日

apacheのサイト証明書を設定 - 調査

確認環境


  • Debian(etch)

  • apache2-mpm-prefork 2.2.3-4+etch6

手順

①証明書要求の作成

~# cd
~# mkdir www33.atwiki.jp
~# cd www33.atwiki.jp
~/www33.atwiki.jp#
~/www33.atwiki.jp# openssl req -new -keyout site_key.pem -out site_csr.pem
...
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
...
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:KANTO
Locality Name (eg, city) []:KANAGAWA
Organization Name (eg, company) [Internet Widgits Pty Ltd]:NONE
Organizational Unit Name (eg, section) []:NONE
Common Name (eg, YOUR name) []:www33.atwiki.jp
Email Address []:NONE
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:tekitou
An optional company name []:
~/www33.atwiki.jp#

②証明書要求の送付

サイト証明書を発行してもらうため、証明書要求をベリサイン等の認証機関に送付する。もしくは、独自認証局で自分でサイト証明書を作成する。

(1)サイト証明書の配置と設定

scp等でサイト証明書を/root/www33.atwiki.jp/site_cert.pemに配置

~# ls www33.atwiki.jp/site_cert.pem
www33.atwiki.jp/site_cert.pem

(2)サイトキーからパスワードを削除

~# openssl rsa -in ./www33.atwiki.jp/site_key.pem -out ./www33.atwiki
.jp/site_key.pem.nopasswd

(3)apacheの定義ファイルで以下を設定(SSLサイト作成の詳細は割愛)

SSLCertificateFile "/root/www33.atwiki.jp/site_cert.pem"
SSLCertificateKeyFile "/root/www33.atwiki.jp/site_key.pem.nopasswd"

(4)apacheを再起動する

~# /etc/init.d/apache2 restart

2009年7月6日

RPCサンプルプログラム - 調査

参考資料(http://www.cs.tsukuba.ac.jp/~yas/sie/cdsoft-2005/2006-01-20/index.html)を元にRPCサンプルプログラムを動作させてみた際のメモ。


ソースコードほかの入手
$ wget http://www.cs.tsukuba.ac.jp/~yas/sie/cdsoft-2005/2006-01-20/ex/dirlist.x $ wget http://www.cs.tsukuba.ac.jp/~yas/sie/cdsoft-2005/2006-01-20/ex/dirlist_server.c $ wget http://www.cs.tsukuba.ac.jp/~yas/sie/cdsoft-2005/2006-01-20/ex/dirlist_client.c $ wget http://www.cs.tsukuba.ac.jp/~yas/sie/cdsoft-2005/2006-01-20/ex/Makefile
コンパイル
$ make rpcgen -C dirlist.x gcc -g -DDEBUG -c -o dirlist_clnt.o dirlist_clnt.c gcc -g -DDEBUG -c -o dirlist_client.o dirlist_client.c gcc -g -DDEBUG -c -o dirlist_xdr.o dirlist_xdr.c gcc -g -DDEBUG -o dirlist_client dirlist_clnt.o dirlist_client.o dirlist_xdr.o -lnsl gcc -g -DDEBUG -c -o dirlist_svc.o dirlist_svc.c gcc -g -DDEBUG -c -o dirlist_server.o dirlist_server.c gcc -g -DDEBUG -o dirlist_server dirlist_svc.o dirlist_server.o dirlist_xdr.o -lnsl
実験その1 単純動作 ※サーバとクライアントで端末を分けること
<サーバ側>
$ ./dirlist_server
<クライアント側>
$ /usr/sbin/rpcinfo -p localhost プログラム バージョン プロトコル ポート 100000 2 tcp 111 portmapper 100000 2 udp 111 portmapper 100024 1 udp 1010 status 100024 1 tcp 1013 status 536875011 1 udp 50085 536875011 1 tcp 32775 $ ./dirlist_client localhost /usr errno: 0 (Success) . .. share (後略)
ふーん。
実験その2 サーバを強制停止してみる
<サーバ側>
$ ./dirlist_server ^C (※強制停止) $
<クライアント側> $ /usr/sbin/rpcinfo -p localhost プログラム バージョン プロトコル ポート 100000 2 tcp 111 portmapper 100000 2 udp 111 portmapper 100024 1 udp 1010 status 100024 1 tcp 1013 status 536875011 1 udp 50085 536875011 1 tcp 32775 $ ./dirlist_client localhost /usr localhost: RPC: Remote system error - Connection refused
サーバが死んだが、portmapの情報は生きているのね
実験その3 サーバを再起動してみる
<サーバ側>
$ ./dirlist_server
<クライアント側> $ /usr/sbin/rpcinfo -p localhost プログラム バージョン プロトコル ポート 100000 2 tcp 111 portmapper 100000 2 udp 111 portmapper 100024 1 udp 1010 status 100024 1 tcp 1013 status 536875011 1 udp 42517 536875011 1 tcp 32791 $ ./dirlist_client localhost /usr errno: 0 (Success) . .. share (後略)
あぁ。ポート番号が再登録されているね、、消せないのかな?
実験その4 portmapのポート番号を消してみる
<クライアント側>
$ su - Password: ********** # rpcinfo -d 536875011 1 # rpcinfo -p localhost プログラム バージョン プロトコル ポート 100000 2 tcp 111 portmapper 100000 2 udp 111 portmapper 100024 1 udp 1010 status 100024 1 tcp 1013 status # exit $ ./dirlist_client localhost /usr localhost: RPC: Program not registered $
なるほどね。再登録は?
実験その5 portmapのポート番号を再登録してみる
<クライアント側>
$ su - Password: # rpcinfo -p localhost プログラム バージョン プロトコル ポート 100000 2 tcp 111 portmapper 100000 2 udp 111 portmapper 100024 1 udp 1010 status 100024 1 tcp 1013 status # cat test 536875011 1 udp 42517 536875011 1 tcp 32791 # cat test | pmap_set # rpcinfo -p localhost プログラム バージョン プロトコル ポート 100000 2 tcp 111 portmapper 100000 2 udp 111 portmapper 100024 1 udp 1010 status 100024 1 tcp 1013 status 536875011 1 udp 42517 536875011 1 tcp 32791 # exit
出来た。でもこれはサーバが動作継続していたことが前提だ。サーバプログラム自身で削除、再登録等の状況にマッチした登録って出来ないのか?→多分rpcgebが作るサーバスケルトンを改造しないとできなさそうだ。また今度。

2009年7月5日

pmap_getport(2)

ポートマッパ(portmap)からRPCサービスのポート番号を取得するpmap_getport関数の使い方。

用例
...
addr.sin_port = htons(111); /* (1) portmapのポート番号を設定 */
if ((addr.sin_port = htons(pmap_getport(&addr, 0x20000000, 1, IPPROTO_TCP))) == 0) { /* (2) 使用したいRPCサービスのポート番号で置き換え */
perror("pmap_getport");
exit(1);
}

/* (3) ポート番号が置き換わったところで、コネクトする */
if (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0){
perror("connect");
exit(1);
}
備考
上記は、独自プロトコルのポート取得にportmapを使う例になっている。本来、connectなんて書かずに、キチンとRPCの関数を使ってRPCプロトコルで通信すべきなんだろうが。

pmap_set(2)

ポートマップ(portmap)にRPCサービスを登録するpmap_set関数。

用例
pmap_unset(0x20000000, 1);
if (pmap_set(0x20000000, 1, IPPROTO_TCP, ntohs(saddr.sin_port)) != 1) {
perror("pmap_set");
exit(1);
}

getsockname(2)

soctnameを取得する関数。

用例
len = sizeof(saddr);
if (getsockname(fd1, (struct sockaddr *)&saddr, &len) != 0){
 perror("getsockname");
 exit(1);
}
printf("port number is %d.\n", ntohs(saddr.sin_port));
メモ
manページを眺めても使い方が良く分かんらんかった。試行錯誤の上、上記に到達。