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
というメッセージ出されて使えなかった。残念。