御社のルート証明書リスト管理は適切ですか。
ルート証明書リストはSSL/TLSのクライアントに必要なもので、ブラウザはもちろんですが、他にもIEEE802.1xでEAP-TLSとかその手のヤツを使う場合、サプリカント側で必要になります。また、メールサーバ (MTA) 同士の通信でTLSを使う場合は、送信側に必要です。また、コードサイニングやS/MIME署名の検証にも必要になります。
信頼__しない__証明書リスト(ブラックリスト)も重要で、重大な情報漏洩や不正な証明書の発行などを行った認証局は、このリストに収録することになります。
あなたがTLSでサーバにアクセスするIoTデバイスの開発者なら、ルート証明書の管理が必要です。あなたがホスティングとかクラウドとかそれ系を提供する事業者の場合、ルート証明書リストをユーザに提供する場合がありますからそれも管理が必要です。ルート証明書リストに証明書を収録するということは、その認証局を信頼するということですので、それなりに責任が伴います。偽造ルート証明書を掴まされてそれを収録してしまったら、利用者全員が危険に晒されてしまいます。
あなたがTLSサーバの管理者なら、サーバ証明書をどの認証局から取得するかの選択が必要です。ここで安易な選択をすると、ブラウザによっては正しくアクセスできず、お客さんからクレームを受けてしまうかもしれません。あなたがアプリの開発者なら、コードサイニング証明書を取得する際に同じ選択が必要です。
かくもめんどくさいルート証明書リスト管理ですが、ここではMicrosoftやMozillaなどの大手がどんな様子かを見ていきたいと思います。
#Microsoft (Windows, Windows Phone 8)
Microsoftのサイトにルート証明書リストがauthrootstl.cabとして置いてあります。Windows内部では、このファイルを定期的にダウンロードして使っています。ファイルの中身を見るとフィンガープリントしか入ってなくて、証明書本体はどこにあるのかと思いますが、それについては独自解析が今日も明日もググったーなどで報告されています。
信頼しないリストはdisallowedcertstl.cabとdisallowedcert.sstに入っています。disallowedcertstl.cabはフィンガープリントのみ、disallowedcert.sstは証明書の内容を含む全リストです。ちなみにsstという拡張子は「Microsoft シリアル化された証明書ストア」だそうで、Windows上でクリックすると専用ビューアが開いて中身を閲覧できます。OpenSSL等では読めません。
2016年9月時点で、ルート証明書リストは299項目、信頼しないリストは71項目あります。
#Apple (iOS, Mac OS X)
アップルのルート証明書リストは、信頼された証明書、常に確認される証明書、ブロック済み証明書の3段階になっているのが特徴です。
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として入手可能です。
Firefoxは今のところcentral, aurora, beta, releaseの4つの開発段階に分かれており、それぞれに収録されているcertdata.txtの内容がちょっとずつ違います。上記cURLのcacert.pemはrelease版に基づいています。
ここで__注意!__modssl-usersに載っているperlスクリプトを__使ってはいけません。__このスクリプトは信頼する証明書と信頼しない証明書の区別ができないため、DigiNotarなどの信頼してはいけない証明書がルート証明書リストに混ざってしまいます。では何を使えばいいのかという話ですが、cURLのmk-ca-bundleというツールが良いようです。
Mozillaのルート証明書リストの内部構造はちょっと複雑で、SERVER_AUTH(TLSサーバ証明書)、EMAIL_PROTECTION(S/MIME)、TRUST_CODE_SIGNING(コードサイニング)などの用途それぞれについて、TRUSTED_DELEGATOR(信頼する)、MUST_VERIFY_TRUST(確認が必要)、NOT_TRUSTED(信頼しない)にレベルに分けされています。
2016年9月時点のmozilla-release版certdata.txtのSERVER_AUTHを見ると、TRUSTED_DELEGATORが157項目、MUST_VERIFY_TRUSTが18項目、NOT_TRUSTEDが28項目です。ちなみにcURL版cacert.pemにはTRUSTED_DELEGATORの157項目だけしか含まれていません。
#Google (Android)
メーカーごとに独自のルート証明書リストを搭載しているようです。具体的な一覧表は残念ながら見つけられませんでした。
#Oracle (Java)
Oracle JDK/JREのcacertsファイルにはルート証明書リストが格納されており、以下のようなコマンドラインで一覧が出てきます。
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のcacertsファイルは空白の状態で配布されているとのことです。
#OpenSSL
現在、OpenSSLプロジェクトはルート証明書リストの配布を行っていません。ルート証明書リストの調達はユーザ各自にて自己責任で行ってください。
。。。と、それだけではあんまりなので、一般に配布されているコンパイル済みのOpenSSLは、Mozillaのルート証明書リストをバンドルしていることが多いようです。
#ガラケー
ガラケーのルート証明書リストの項目数は総じて非常に少ないです。
NTTドコモ、KDDI、ソフトバンクモバイルが各々情報公開していますが、項目数でいうとNTTドコモが30、KDDIが45、ソフトバンクモバイルが31となっています。また、端末に搭載されているルート証明書リストは機種によって違い、一部の証明書しか収録されていない機種もあります。
信頼しないリストは見当たりませんでした。提供されていないようです。
#考察
Microsoftのルート証明書プログラムが、やはり数の上では圧倒的に充実しています。ということは、IEやEdgeやWindows版Chromeで動いたからといって安心していると、他の環境では動かない可能性があるということですので、テストの際は注意が必要です。
Appleはマイクロソフトよりも小規模なルート証明書リストで頑張っていますが、印象としては、米国内・大手認証局にはそれなりに強いのですが、米国外・中小認証局にはうーんどうなのかという感じです。
Mozillaのルート証明書は、ライセンス的にも製品開発に応用されることが多いかと思いますが、やはり収録数がちょっと少なく、用途によっては自前でルート証明書を追加する必要が出てきます。例えば日本政府のGPKI ApplicationCA2がFirefoxで動かない状態になっていることがスラドに載りましたが、この状態は今でも続いています。
一つ注意としては、cURL版cacert.pemにはサーバ証明書用の認証局しか入っておらず、一部で運用されているコードサイニング専用ルート認証局やメール保護専用ルート認証局が含まれません。こういうのが必要なときは、オリジナルのreleaseから持ってくるようにして下さい。
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