2006-09-19

λ [FreeBSD] DHCPサーバに依存しないDynamic DNSの実現

Apache の SSL 通信でクライアント証明書使うことにして、CNに host.example.com 仕込んでおけば(というかWebサーバ用証明書なら普通そうする) 認証+必要なパラメータ渡しが済むな。

CGIプログラムからすれば、環境変数 REMOTE_ADDR,SSL_CLIENT_S_DN_CN を参照するだけだから、シェルスクリプトでも書けそうだ。

でけた。

#!/bin/sh
nsupdatekey=/local/named/Kexample.com.+000+00000.private
ttl=600

PATH=/usr/bin:/usr/local/bin
export PATH

echo Content-Type: text/plain
echo

nsupdate -k $nsupdatekey << __EOF__
update delete $SSL_CLIENT_S_DN_CN IN A
update add $SSL_CLIENT_S_DN_CN $ttl IN A $REMOTE_ADDR
show
send
__EOF__

nsupdate の返り値で成功したかどうかを伝達した方がいい気はするが、そもそもまともなプロトコル設計してないのでとりあえず。

クライアント側からはこんな感じでアクセス。Apache側はこれ専用のクライアント証明書認証の設定をしたいので、443ではなく別ポートにしてある。 

curl --ipv4 -o- --capath /usr/local/etc/apache22/ssl.crt --cert host.example.com.crt --key host.example.com.key https://www.example.jp:10443/cgi-bin/nsupdate_jsub.net.cgi

ここのクライアント証明書として、Webサーバ証明書を流用できると思ったが、apache 側のerror_logに

Certificate Verification: Error (26): unsupported certificate purpose

というメッセージ出されて使えなかった。残念。

[]