Net::LDAPでのbind

久しぶりにCGIを書きました。LDAPのパスワードを変更するためのCGIです。LDAPperlから使うのでNet::LDAPを使ってプログラム。入力されたuseridをつかってanonymousでDNをsearchするところまではうまくいったのですが、そのDNをつかってパスワード認証でのbindがどうしてもできない。

$dn="cn=hoge,ou=person,dc=hoge,dc=org" ;
$password = "secret" ;

$ldap = Net::LDAP->new('localhost');

$mesg = $ldap->bind (
                $dn,
                password=>$password );

てなことをやってもInvalid credential、つまりパスワードが違うとのこと。
どうもディレクトリに収められているパスワードがSSHAでハッシュされているのが原因みたい。このパスワードの属性をplain textにしてやるとちゃんとバインドできる。
Digest::SHA1をつかって、ハッシュ値をつくってからpasswordに与えてもNG。うーむ。

あんまり考えると頭がいたくなるので、ldappasswdコマンドをつかってパスワード変更することにしました。
こんなところ。

$passchg = `/usr/bin/ldappsswd -x -D $dn -w $oldpassword -s $newpassword` ;
print $passchg ;

なんか敗北感いっぱいな感じ。なにかいい方法がありそうな気がするんだけどな。