主要各社ルート証明書リストに収録されているルート証明書の数を比較する

御社のルート証明書リスト管理は適切ですか。

ルート証明書リストはSSL/TLSのクライアントに必要なもので、ブラウザはもちろんですが、他にもIEEE802.1xでEAP-TLSとかその手のヤツを使う場合、サプリカント側で必要になります。また、メールサーバ (MTA) 同士の通信でTLSを使う場合は、送信側に必要です。また、コードサイニングやS/MIME署名の検証にも必要になります。

信頼__しない__証明書リスト（ブラックリスト）も重要で、重大な情報漏洩や不正な証明書の発行などを行った認証局は、このリストに収録することになります。

あなたがTLSでサーバにアクセスするIoTデバイスの開発者なら、ルート証明書の管理が必要です。あなたがホスティングとかクラウドとかそれ系を提供する事業者の場合、ルート証明書リストをユーザに提供する場合がありますからそれも管理が必要です。ルート証明書リストに証明書を収録するということは、その認証局を信頼するということですので、それなりに責任が伴います。偽造ルート証明書を掴まされてそれを収録してしまったら、利用者全員が危険に晒されてしまいます。

あなたがTLSサーバの管理者なら、サーバ証明書をどの認証局から取得するかの選択が必要です。ここで安易な選択をすると、ブラウザによっては正しくアクセスできず、お客さんからクレームを受けてしまうかもしれません。あなたがアプリの開発者なら、コードサイニング証明書を取得する際に同じ選択が必要です。

かくもめんどくさいルート証明書リスト管理ですが、ここではMicrosoftやMozillaなどの大手がどんな様子かを見ていきたいと思います。

#Microsoft (Windows, Windows Phone 8)

Microsoftのサイトにルート証明書リストが[authrootstl.cab](http://ctldl.windowsupdate.com/msdownload/update/v3/static/trustedr/en/authrootstl.cab)として置いてあります。Windows内部では、このファイルを定期的にダウンロードして使っています。ファイルの中身を見るとフィンガープリントしか入ってなくて、証明書本体はどこにあるのかと思いますが、それについては独自解析が[今日も明日もググったー](http://ggutter.blogspot.jp/2009/12/authrootseqtxt-authrootstlcab.html)などで報告されています。

信頼しないリストは[disallowedcertstl.cab](http://ctldl.windowsupdate.com/msdownload/update/v3/static/trustedr/en/disallowedcertstl.cab)と[disallowedcert.sst](http://ctldl.windowsupdate.com/msdownload/update/v3/static/trustedr/en/disallowedcert.sst)に入っています。[disallowedcertstl.cab](http://ctldl.windowsupdate.com/msdownload/update/v3/static/trustedr/en/disallowedcertstl.cab)はフィンガープリントのみ、[disallowedcert.sst](http://ctldl.windowsupdate.com/msdownload/update/v3/static/trustedr/en/disallowedcert.sst)は証明書の内容を含む全リストです。ちなみにsstという拡張子は「Microsoft シリアル化された証明書ストア」だそうで、Windows上でクリックすると専用ビューアが開いて中身を閲覧できます。OpenSSL等では読めません。

2016年9月時点で、ルート証明書リストは299項目、信頼しないリストは71項目あります。

#Apple (iOS, Mac OS X)

[Mac OS X](https://support.apple.com/ja-jp/HT202858)、[iOS](https://support.apple.com/ja-jp/HT204132)それぞれの一覧が公開されています。

アップルのルート証明書リストは、信頼された証明書、__常に確認される証明書__、ブロック済み証明書の３段階になっているのが特徴です。

Mac OS X El Capitanの信頼された証明書は187項目、常に確認される証明書は13項目、ブロック済み証明書は18項目あります。

iOS9の信頼された証明書は188項目、常に確認される証明書は12項目、ブロック済み証明書は21項目あります。

iOS9のほうが新しいリストになっており、信頼された証明書に``OISTE WISeKey Global Root GB CA``が追加されています。

#Mozilla (Firefox, Thunderbird)

FirefoxやThunderbirdには、Mozilla Projectが独自に維持管理しているルート証明書リストが収録されています。このリストはcertdata.txtとして公開されているのですが、ファイル形式が独特で、このままでは扱いにくいので、もっと普通のPEM形式に変換されたファイルがcURLのページから[cacert.pem](https://curl.haxx.se/ca/cacert.pem)として入手可能です。

Firefoxは今のところcentral, aurora, beta, releaseの４つの開発段階に分かれており、それぞれに収録されているcertdata.txtの内容がちょっとずつ違います。上記cURLの[cacert.pem](https://curl.haxx.se/ca/cacert.pem)は[release](http://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt)版に基づいています。

ここで__注意！__[modssl-users](http://www.mail-archive.com/modssl-users@modssl.org/msg16980.html)に載っているperlスクリプトを__使ってはいけません。__このスクリプトは信頼する証明書と信頼しない証明書の区別ができないため、DigiNotarなどの信頼してはいけない証明書がルート証明書リストに混ざってしまいます。では何を使えばいいのかという話ですが、cURLの[mk-ca-bundle](https://curl.haxx.se/docs/mk-ca-bundle.html)というツールが良いようです。

Mozillaのルート証明書リストの内部構造はちょっと複雑で、SERVER_AUTH（TLSサーバ証明書）、EMAIL_PROTECTION（S/MIME）、TRUST_CODE_SIGNING（コードサイニング）などの用途それぞれについて、TRUSTED_DELEGATOR（信頼する）、MUST_VERIFY_TRUST（確認が必要）、NOT_TRUSTED（信頼しない）にレベルに分けされています。

2016年9月時点のmozilla-release版[certdata.txt](http://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt)のSERVER_AUTHを見ると、TRUSTED_DELEGATORが157項目、MUST_VERIFY_TRUSTが18項目、NOT_TRUSTEDが28項目です。ちなみにcURL版[cacert.pem](https://curl.haxx.se/ca/cacert.pem)にはTRUSTED_DELEGATORの157項目だけしか含まれていません。

#Google (Android)

メーカーごとに独自のルート証明書リストを搭載しているようです。具体的な一覧表は残念ながら見つけられませんでした。

#Oracle (Java)

Oracle JDK/JREのcacertsファイルにはルート証明書リストが格納されており、以下のようなコマンドラインで一覧が出てきます。

```bash
keytool -list -rfc -keystore C:/Java/jre1.8.0_102/lib/security/cacerts -storepass changeit
```

信頼しないリストは``cacerts``と同じフォルダの``blacklisted.certs``ファイルにフィンガープリントだけ入っています。

Windows版jre1.8.0_102を調べたところ、ルート証明書リストは104項目、信頼しないリストは19項目でした。

ちなみに[OpenJDK](http://openjdk.java.net/groups/security/)のcacertsファイルは空白の状態で配布されているとのことです。

#OpenSSL

現在、OpenSSLプロジェクトはルート証明書リストの配布を行っていません。ルート証明書リストの調達はユーザ各自にて自己責任で行ってください。

。。。と、それだけではあんまりなので、一般に配布されているコンパイル済みのOpenSSLは、Mozillaのルート証明書リストをバンドルしていることが多いようです。

#ガラケー

ガラケーのルート証明書リストの項目数は総じて非常に少ないです。

[NTTドコモ](https://www.nttdocomo.co.jp/service/developer/make/content/ssl/spec/)、[KDDI](http://www.au.kddi.com/ezfactory/web/zip/ssl_download.zip)、[ソフトバンクモバイル](http://creation.mb.softbank.jp/mc/tech/doc/A-426-111-SSLCertificates_1.0.5.pdf)が各々情報公開していますが、項目数でいうとNTTドコモが30、KDDIが45、ソフトバンクモバイルが31となっています。また、端末に搭載されているルート証明書リストは機種によって違い、一部の証明書しか収録されていない機種もあります。

信頼しないリストは見当たりませんでした。提供されていないようです。

#考察

Microsoftのルート証明書プログラムが、やはり数の上では圧倒的に充実しています。ということは、IEやEdgeやWindows版Chromeで動いたからといって安心していると、他の環境では動かない可能性があるということですので、テストの際は注意が必要です。

Appleはマイクロソフトよりも小規模なルート証明書リストで頑張っていますが、印象としては、米国内・大手認証局にはそれなりに強いのですが、米国外・中小認証局にはうーんどうなのかという感じです。

Mozillaのルート証明書は、ライセンス的にも製品開発に応用されることが多いかと思いますが、やはり収録数がちょっと少なく、用途によっては自前でルート証明書を追加する必要が出てきます。例えば日本政府のGPKI ApplicationCA2がFirefoxで動かない状態になっていることが[スラド](http://security.srad.jp/story/13/12/10/0917220/)に載りましたが、この状態は今でも続いています。
一つ注意としては、cURL版[cacert.pem](https://curl.haxx.se/ca/cacert.pem)にはサーバ証明書用の認証局しか入っておらず、一部で運用されているコードサイニング専用ルート認証局やメール保護専用ルート認証局が含まれません。こういうのが必要なときは、オリジナルの[release](http://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt)から持ってくるようにして下さい。

Oracle Javaは収録数が少なめで、全体的にちょっと古いかも、という印象です。JSSEを積極的に使ってクローラーなどを開発していこうという向きには、keytoolを駆使して、かなり多数のルート証明書をご自身でインストールすることになるかもしれません。

以上！あくまで個人の感想で、効果には個人差があります。

#参考文献

##Microsoft関係

マイクロソフト (2015)
Windows Vista、Windows Server 2008、Windows 7、および Windows Server 2008 R2 の信頼されていない証明書の自動更新ツールについて
https://support.microsoft.com/ja-jp/kb/2677070

今日も明日もググったー (2009)
authrootseq.txt authrootstl.cab
http://ggutter.blogspot.jp/2009/12/authrootseqtxt-authrootstlcab.html

##Apple関係

Appleサポート (2015)
OS X で利用できる信頼されたルート証明書の一覧
https://support.apple.com/ja-jp/HT202858

Appleサポート (2015)
iOS で利用できる信頼されたルート証明書の一覧
https://support.apple.com/ja-jp/HT204132

##Mozilla関係

Mozilla Wiki （随時更新）
CA:IncludedCAs
https://wiki.mozilla.org/CA:IncludedCAs

cURL （随時更新）
CA certificates extracted from Mozilla
https://curl.haxx.se/docs/caextract.html

##Java関係

keytool - 鍵と証明書の管理ツール
https://docs.oracle.com/javase/jp/6/technotes/tools/windows/keytool.html

OpenJDK
The Security Group
http://openjdk.java.net/groups/security/

##ガラケー関係

NTTドコモ
主なスペック
作ろうiモードコンテンツ
https://www.nttdocomo.co.jp/service/developer/make/content/ssl/spec/

NTTドコモ
iモード対応機種 対応コンテンツ・機能一覧
https://www.nttdocomo.co.jp/binary/pdf/service/developer/make/content/spec/imode_spec.pdf

KDDI (2015)
EZwebブラウザに搭載されているルート証明書
EZfactory
http://www.au.kddi.com/ezfactory/web/zip/ssl_download.zip

ソフトバンクモバイル
SSL証明書一覧
http://creation.mb.softbank.jp/mc/tech/doc/A-426-111-SSLCertificates_1.0.5.pdf

##その他

OpenSSL FAQ
How can I set up a bundle of commercial root CA certificates?
https://www.openssl.org/docs/faq.html#USER16