OpenSSL-1.0.0 でのハッシュリンク使用は要注意
先日(03/29)、OpenSSL のメジャーバージョンアップ版 1.0.0 がリリースされました。
ちょうど1年ほど前から beta リリースが出ていましたが、ついに正式にリリースとなりました。
早速ソースコードをダウンロードして試してみたところ、気になるところを見つけたので記事にします。
サブジェクトのハッシュ
OpenSSLには、証明書や CRL に含まれるサブジェクトや発行者名を 8文字で表現されるハッシュ値に変換する機能があります。
このハッシュ値は、OpenSSL のコマンドラインや SSL/TLS の実装として OpenSSL をリンクしているアプリケーションに対して、個々の CA証明書や CRL のファイルをディレクトリごと指定する際にファイル名として使用します。
$ openssl x509 -noout -hash -in hoge.pem
このようなコマンドラインで、サブジェクト名に対するハッシュ値が計算できます。
得られたハッシュ値を元に「 1a2b3c4d.0 (ハッシュ値が衝突した場合は 1a2b3c4d.1、1a2b3c4d.2 と連番をふる)」といったファイル名で証明書を保存して使います。
しかし、実際のファイル名がハッシュ値だと、ファイル名のみから元の証明書を見分けるのは難しいので、わかりやすいファイル名を付けた元ファイルに対するシンボリックリンク(ハッシュリンク)として作成しておく場合も多いと思います。
(ちなみに、このハッシュリンクを一気に簡単に作る補助スクリプトとして c_rehash という Perlスクリプトが添付されています。)
1.0.0 からハッシュアルゴリズムが変更に
このハッシュリンクを作成したディレクトリ、OpenSSLのバージョンを更新する際でも再作成せずにそのまま使用される方も多いと思いますが、OpenSSL-1.0.0 からは再作成したほうがよさそうです。
公式サイトのアナウンスで出ている主な変更点リストを見てもわからないのですが、ハッシュ計算のアルゴリズムが変更になっています。
例えば、こんな感じで 0.9.8系までと 1.0.0系で違うハッシュ値が計算されています。
$ openssl x509 -noout -subject -in equifax.pem subject= /C=US/O=Equifax/OU=Equifax Secure Certificate Authority $ /usr/bin/openssl version OpenSSL 0.9.8k 25 Mar 2009 $ /usr/bin/openssl x509 -noout -hash -in equifax.pem 594f1775 $ /opt/openssl-1.0.0/bin/openssl version OpenSSL 1.0.0 29 Mar 2010 $ /opt/openssl-1.0.0/bin/openssl x509 -noout -hash -in equifax.pem 578d5c04
具体的には、旧アルゴリズムでは MD5ハッシュを元にして計算していたものが、SHA1ハッシュを元にしたものに変更されています。
OpenSSLのコマンドラインオプションでは、-subject_hash、-issuer_hash ともに新アルゴリズムを使用するものになっていて、旧アルゴリズムを使用する場合にはそれぞれ -subject_hash_old と -issuer_hash_old を使用するようになっています。
-hash を指定した場合には新アルゴリズムを使う -subject_hash が呼ばれます。
OpenSSLコマンドライン内部で実際に呼ばれているライブラリの関数名も X509_subject_name_hash と X509_issuer_name_hash に対して X509_subject_name_hash_old と X509_issuer_name_hash_old が定義されているようです。
最後に
私も、まさかハッシュ計算アルゴリズムが変更になることはないだろうと思い、0.9.8ベースで作ったハッシュリンクを 1.0.0 で使おうとして、verifyが通らずにハマりました。
メジャーバージョンアップ時には、面白い機能の追加や改良以外にも、今まであった機能への変更点についても注意しないといけないですね。