Firefoxと認証局証明書(信頼されたルート証明機関)
Firefoxは、Chromeとは違い、デフォルトで信頼する認証局(トラストストア;Windowsで言う「信頼されたルート証明機関」)が内部にハードコードされている。一方、ChromeはWinでもMacでもOSのトラストストアを参照する。
ということで、Firefoxのソースコードからこのリストを取り出そうとしたのだけど、いろいろ面倒だったのでメモ。特にOpenSSLはトラストストアを持たないため、Firefoxの(すなわちMozillaの)トラストストアを流用するケースなどを想定。
Firefoxのソースと認証局証明書
Firefoxのデフォルトの認証局証明書は、ソースツリーでは以下のcertdata.txtにある。
しかし上記ファイルは、次のように一般的な形式(PEMなど)では書かれておらず、OpenSSLなど他のアプリでそのまま利用することはできない。
# # Certificate "GlobalSign Root CA" # # Issuer: CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE # Serial Number:04:00:00:00:00:01:15:4b:5a:c3:94 # Subject: CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE # Not Valid Before: Tue Sep 01 12:00:00 1998 # Not Valid After : Fri Jan 28 12:00:00 2028 # Fingerprint (MD5): 3E:45:52:15:09:51:92:E1:B7:5D:37:9F:B1:87:29:8A # Fingerprint (SHA1): B1:BC:96:8B:D4:F4:9D:62:2A:A8:9A:81:F2:15:01:52:A4:1D:82:9C CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE CKA_TOKEN CK_BBOOL CK_TRUE CKA_PRIVATE CK_BBOOL CK_FALSE CKA_MODIFIABLE CK_BBOOL CK_FALSE CKA_LABEL UTF8 "GlobalSign Root CA" CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 CKA_SUBJECT MULTILINE_OCTAL \060\127\061\013\060\011\006\003\125\004\006\023\002\102\105\061 \031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154 \123\151\147\156\040\156\166\055\163\141\061\020\060\016\006\003 \125\004\013\023\007\122\157\157\164\040\103\101\061\033\060\031 \006\003\125\004\003\023\022\107\154\157\142\141\154\123\151\147 \156\040\122\157\157\164\040\103\101 END CKA_ID UTF8 "0" CKA_ISSUER MULTILINE_OCTAL \060\127\061\013\060\011\006\003\125\004\006\023\002\102\105\061 \031\060\027\006\003\125\004\012\023\020\107\154\157\142\141\154 .....(省略).....
これは、Firefoxのビルド時にこのcertdata.txtからcertdata.cが作られてコンパイルされるため、Cで扱いやすい形式で書かれた歴史的理由による(たぶん)。ということでこれを解決するにいくつかの方法がある。
curlプロジェクトの配布物を利用
curlはhttpsにも対応していることから、トラストストアと密接に関連している。
ということで、curlプロジェクトが独自にcertdata.txtをPEMに加工したものを配布している。
これは比較的定期的に更新されており、ちゃんとメンテナンスされているため、特に理由が無ければこれを使えばいい。しかし、世の中にはもちろん、「オレはcurlプロジェクトは信頼ならん」という人もいるだろうから、そういう人は自分でcertdata.txtを加工する必要がある。
Distrustの罠
自前でcertdata.txtの加工スクリプトを書く場合、ハマりがちなのがこのDistrustの罠である。
certdata.txtは、やっかいなことに「信頼されない(Distrust)証明書」もまぜこぜにして格納されている。有名なモノは、侵入者により偽証明書が発行されてしまったDigiNotarのものである。
# # Certificate "Explicitly Distrust DigiNotar Root CA" # # Issuer: E=info@diginotar.nl,CN=DigiNotar Root CA,O=DigiNotar,C=NL # Serial Number:0f:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff # Subject: E=info@diginotar.nl,CN=DigiNotar Root CA,O=DigiNotar,C=NL # Not Valid Before: Fri Jul 27 17:19:37 2007 # Not Valid After : Mon Mar 31 18:19:22 2025 # Fingerprint (MD5): 0A:A4:D5:CC:BA:B4:FB:A3:59:E3:E6:01:DD:53:D9:4E # Fingerprint (SHA1): C1:77:CB:4B:E0:B4:26:8E:F5:C7:CF:45:99:22:B9:B0:CE:BA:21:2F CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE CKA_TOKEN CK_BBOOL CK_TRUE CKA_PRIVATE CK_BBOOL CK_FALSE CKA_MODIFIABLE CK_BBOOL CK_FALSE CKA_LABEL UTF8 "Explicitly Distrust DigiNotar Root CA" CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 CKA_SUBJECT MULTILINE_OCTAL \060\137\061\013\060\011\006\003\125\004\006\023\002\116\114\061 \022\060\020\006\003\125\004\012\023\011\104\151\147\151\116\157 \164\141\162\061\032\060\030\006\003\125\004\003\023\021\104\151 .....(省略).....
上記の、「CKA_LABEL」に"Distrust"があることに注意して欲しい。つまりこれは、信頼してはいけないルート証明書なのだ。そのため自作ツールでは、これらを取り除く処理をしないといけない。いやはやめんどい。