証明書チェーンの崩壊
サーバーの設定ミスにより、中間CA証明書を返してこないサイトがある
curlやFTPクライアントなどで検証エラー

しかし、Webブラウザーでは正常に通信できることが多い

実は、最近のWebブラウザーには中間CA証明書を補う仕組みが搭載されている
Firefoxの場合
Firefoxでは、Mozillaが収集した中間CA証明書を元にして作られた証明書リストを使用している
(Preloading Intermediate CA Certificates: https://blog.mozilla.org/security/2020/11/13/preloading-intermediate-ca-certificates-into-firefox/)

Google Chrome (Chromium)の場合
Google Chrome (Chromium)ではAIA (Authority Information Access) fetchingという仕組みが使われている
サーバ証明書に中間証明書のダウンロード先URLが書かれている

ここから中間CA証明書をダウンロードし、証明書チェーンを構築する
ダウンロードした中間CA証明書はルート証明書によって検証される
なぜFirefoxはAIA fetchingをしないのか?
ごちゃごちゃ書いてあるが、要約すると、
- パフォーマンス上の問題がある(中間CA証明書をダウンロードしてくるのに時間がかかる)
- セキュリティやプライバシー上の問題がある(サーバ証明書は検証されたものではないため、AIAフィールドに任意のURLを指定できる -> 任意のURLにアクセスさせることができる)
具体的にFirefoxがどのようにして中間CA証明書を補うのか
証明書リストはリモート設定より取得される
リモート設定はFirefox本体をアップデートしなくても特定機能の有効化や無効化、悪意のあるアドオンのブロックなどを適用することができる
リモート設定はもしMozillaに悪意があればブラウザーに保存されているありとあらゆるデータ(セッショントークン、パスワード、クレカ情報など)を窃取することがてきるほどになんでもできる
中間CA証明書リストを取得する部分の該当コード
やってることとしては、
- https://firefox.settings.services.mozilla.com/v1/buckets/security-state/collections/intermediates/records から中間CA証明書リストを取得
- 取得したリストから証明書のダウンロード先を抽出
- 証明書をダウンロード&読み込み
証明書を抽出
これらの処理やデータ構造を解析して、リモート設定から中間CA証明書を抽出する簡単なスクリプトを作成

抽出した証明書をcurlやFTPクライアントなどに読み込ませることで、不適切な設定になっているサーバ間でもセキュアな通信ができる

作成したスクリプト
今回作成したスクリプトはGitHubに公開している
