証明書がどういう仕組で機能を実現しているのかざっくりは理解していた(https(ssl)通信設定の概要 - やる気がストロングZERO)つもりだったが、改めて考えてみたら、ルート証明書がどこにあって、どうやって使われているのかいまいちよくわかってなかったので調べてみた。
結果的に結局まだよくわかってないが、わかったことについてメモ。
Ubuntuでは/etc/ssl/certs/にルート証明書が入っていた
例えばrubygems.orgのサーバー証明書のルート証明書は「GlobalSign Root CA - R3」である。
ブラウザから確認できるし、ブラウザが使えない状況であれば
$ openssl s_client -connect rubygems.org:443 -showcerts
で確認できる。
サーバー内のどこかにこの証明書がインストールされているはず。 調べると/etc/ssl/certs/内に「GlobalSign_Root_CA-R3.pem」という名前のそれっぽいものがあった。
ただ、本当にこれなのかid的なもので確認したい感じ。 Serial Numberというのがあるので、これが一致すれば同一と言えそう。
GlobalSign_Root_CA-R3.pemの中身をcatで見てもbase64ぽい文字列が見えるだけだったが、
openssl x509 -text -noout -in /etc/ssl/certs/GlobalSign_Root_CA_-_R3.pem
を実行することで内容を見ることができ、それによってSerial Numberが同一であることが確認できた。
参考)
opensslコマンドで証明書情報を確認したい | GMOグローバルサイン サポート
ベンダー毎、アプリごとに使われるルート証明書は異なる?
※以下は色々調べていて得た情報から自分が推察した内容なので正しくないかもしれない。
どのルート証明書を採用するかはベンダー毎に異なるらしい。
例えばMicrosoftとGoogleとMozzillaでは取り扱うルート証明書が異なるということらしい。
なのでEdgeでは見れるサイトがChromeやFireFoxでは見れないという場合があるとのこと。
ということはそれぞれのアプリで参照しているルート証明書が異なるはずである。
ここからは更に想像だが、アプリケーション毎にルート証明書の参照場所を設定できるのではないかと思った。
/etc/ssl/certs/はUbuntuが選んで用意しているルート証明書で、各アプリはこれを使ってもいいし、別に自分で用意してもいい。
opensslはパッケージからインストールするとUbuntuの用意したルート証明書を参照するようになっていて、opensslを使うアプリは自動的に(もしくは設定できるのかもしれないが)このルート証明書を参照することになる。
で、Chromeとかfirefoxとか明確に「この証明書を使う」と定義しているアプリはインストール時にUbuntu証明書とは別に独自にルート証明書をインストールしていて、これを参照するようになっているのではないか?
という仮説を立てたが、それを示す情報はまだ見つけられていない。chromeとかfirefoxのソースやドキュメント原書にあたれば記載あるかもしれないなぁと思っているが英語なのもあって腰が重くまだ見てない。