_ [debian] openssl 1.0.0 vs w3m

libssl1.0.0 でビルドされた w3m が入ってきた。その後から例えば encrypted.google.com のような https なサイトを開こうとすると、

unable to get local issuer certificate

となるようになった。strace で見てみると、/etc/ssl/certs/578d5c04.0 を開こうとしていたがそんなものはない。試しに libssl0.9.8 でビルドされた w3m を strace しつつ encrypted.google.com に接続してみると、そちらは /etc/ssl/certs/594f1775.0 を開いていた。 いろいろぐぐっていたら、OpenSSL-1.0.0 でのハッシュリンク使用は要注意 というそのものズバリな解説を発見。

このハッシュリンクを作成したディレクトリ、OpenSSLのバージョンを更新する際でも再作成せずにそのまま使用される方も多いと思いますが、OpenSSL-1.0.0 からは再作成したほうがよさそうです。 公式サイトのアナウンスで出ている主な変更点リストを見てもわからないのですが、ハッシュ計算のアルゴリズムが変更になっています。

例えば、こんな感じで 0.9.8系までと 1.0.0系で違うハッシュ値が計算されています。

ref. OpenSSL-1.0.0 でのハッシュリンク使用は要注意

そういうことか。確かに、

% ls -l /etc/ssl/certs | grep Equifax_Secure_CA.pem
lrwxrwxrwx 1 root root     21 2009-07-09 15:23 594f1775.0 -> Equifax_Secure_CA.pem
lrwxrwxrwx 1 root root     56 2009-02-17 00:39 Equifax_Secure_CA.pem -> /usr/share/ca-certificates/mozilla/Equifax_Secure_CA.crt
%

というリンクになっていて、ハッシュ値を計算してみると、

% openssl x509 -noout -hash -in /etc/ssl/certsEquifax_Secure_CA.pem                                       
578d5c04
% openssl x509 -noout -subject_hash_old -in /etc/ssl/certs/Equifax_Secure_CA.pem                                       
594f1775
% 

となった。ここまであからさまなのは BTS されてるかな、と探してみたら、ちゃんとあった。> #611102 #622679 入ってるのは openssl 1.0.0d-1 で、ちょうど openssl 1.0.0d-2 で対処されるということになっていたので降りてくるのを待ってみる。 降りてきたのをさっそく入れてみるけど、変化ない。特に /etc/ssl/certs 以下に変わりなし。対処された c_rehash を呼んでる update-ca-certificates を実行しても、/etc/ssl/certs にファイルが追加・削除されたわけではないので、

# update-ca-certificates
Updating certificates in /etc/ssl/certs... 0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d....
updating keystore /etc/ssl/certs/java/cacerts...
done.
done.
#

更新されず。仕方ないので、

# cd /etc/ssl/certs/
# /usr/bin/c_rehash .
Doing .
        :
Equifax_Secure_CA.pem => 578d5c04.0
Equifax_Secure_CA.pem => 594f1775.0
        :
#

手動で更新した。これで w3m も大丈夫になった。