過去にCentOS/RHEL5にてGlobalSignのルート証明書が期限切れとなる事態が起きました(参考: RHEL5/CentOS5でGlobalSignのルート証明書が有効期限切れで大騒ぎ)。一般的なGNU/Linuxディストリビューションでは、SSLのルート証明書等をパッケージとして配布しています。たとえばDebianではca-certificatesパッケージがそれに該当します。
かたやWindowsは、XPまではWindows Updateで最新の証明書セットを配布していました。しかしVista以降はマイクロソフトが各種証明局と連携して、自動的に更新する仕組みを導入しています。しかし、システムが利用するhttp proxyがユーザー認証つきの場合、これが動作しないということに最近気付きましたので、記録として残しておきます。
CryptoAPI
SSL証明書の自動更新は、CryptoAPIのサービス、Cryptographic Servicesが行います。管理ツールのサービス一覧を見ると、このサービスが動作しているのがわかります。
まったく新規のWindows環境を用意して、台湾のVISA取得サービス(https://visawebapp.boca.gov.tw/BOCA_MRVWeb/subroot/MRVWeb0_form.jsp)にアクセスする場合を例示してみます。
新規のWindows環境では、台湾のルート証明書は古いものが搭載されています。前述のURLにアクセスすると、CryptoAPIサービスが新しい証明書(http://grca.nat.gov.tw/repository/CRL/CA.crl)を取得し、検証用のエンドポイント(http://gca.nat.gov.tw/cgi-bin/OCSP/ocsp_server.exe)で証明書が正しいことを確認した上で、OSの証明書ストアを新しいものに更新します。
困ったことに、CryptoAPIは認証つきhttp proxyを経由したアクセスをサポートしていません。これは仕様としてそうなっているようです。
したがって、認証つきhttp proxyしかない環境下では、SSL証明書の更新がうまく動作しません。
一つの対応策として、User-Agentが”Crypto-API”である場合に認証を不要とする方法があります。それ以外には、stone等を使って認証不要なhttp proxyをローカルに立ち上げるという手段も考えられます。