「恥の多い生涯を歩んできました」
最近、私はPKIな人ではなく、雑用に忙殺される悲しい毎日を送っております。先日、同僚にそそのかされ「中華パッド」なるものを買ってしまいサルのように喜んでつかっております。
組み込みのルート証明書ストア
何やら、Android 4.0 ICSになってからルート証明書ストアの方式が変わってしまったそうで、BouncyCastleプロバイダのJava Key Storeだったものが、OpenSSLのそれに変更になったそうです。
■Android 4.0 より前のルート証明書ストア
/system/etc/security/cacerts.bks ファイル
■Android 4.0 以降のルート証明書ストア
/system/etc/security/cacerts ディレクトリ
ディレクトリの中を覗いてみると、各ルート証明書はPEM形式で、 "00673b5b.0" みたいなファイル名で、まさにOpenSSLの"ca"コマンドで使われるハッシュファイル名形式になっています。
OpenSSL 1.0.0 コマンドでハッシュファイル名の計算方法を見てみましょう。
% openssl x509 -in 00673b5b.0 -hash -noout
2e4eed3c ←うーん一致しない
% openssl x509 -in 00673b5b.0 -subject_hash_old -noout
00673b5b ←おお、一致した
ということは、OpenSSL 1.0.0 で導入されたハッシュファイル名の計算方法ではなく、OpenSSL 0.9.8とかの古いハッシュファイル名の計算方法でファイルが置かれていることがわかります。
初期状態でのルート証明書の数は134個で、最近の多くのブラウザやOSからしてみると割と少ない方かもしれませんね。
ユーザが追加した認証局証明書ストア
前述のストアはシステム組み込みの認証局証明書ストアなようで、例えばPKCS#12などを読み込んだ際の中間認証局証明書は上の場所には入らずに別の場所に入ります。
/data/misc/keychain/cacerts-added/
ユーザの秘密鍵と証明書、パスワードのストア
ユーザの秘密鍵と証明書、パスワードは下記のフォルダに保存されます。
/data/misc/keystore/クレデンシャルには名前をつけて保存されますが、秘密鍵、ユーザ証明書、ルート証明書までのチェーンはそれぞれ下記のファイル名で保存されているようです。ファイル形式は独自のバイナリで、先頭4バイトが0である以外は、どのようにそれらが作られているのかはわかりませんでした。
番号_USRPKEY_名前
番号_USRCERT_名前
番号_CACERT_名前
otacerts.zipファイルの謎
ちなみに、cacertsディレクトリはotacerts.zip なるファイルがあり何が入っているのか気になったので覗いてみました。ただ testkey.x509.pem というマルチRDNの自己署名公開鍵証明書が入っているだけなんですが、
DN: C=US, ST=California, L=Mountain View, O=Android, OU=Android, CN=Android/emailAddress=android@android.com
公開鍵の公開指数がいまどきセキュリティ上問題のある3なのがちょっと気になるところでしょうか。
あと、古いOpenSSL 1.0.0より前のやつでみると有効期間がだと化けちゃうのかなぁと思って見てみたら
Not Before: Feb 8 09:29:20 2012 GMT
Not After : May 21 03:01:04 1903 GMT <<これ
ASN.1レベルでも
UTCTime '120208092920Z'
GeneralizedTime '19030521030104Z'
本当に開始が2012年で終了が1903年というものすごい証明書でした。いろいろ突っ込み所がある証明書を入れとく意義って何なんすかねぇ?
今日はこの辺で