Mozillaの認証局証明書をArduino/ESPに取り込む

投稿者: | 2025年7月23日

通常Webブラウザは複数の認証局の証明書を内部に用意しているので色々なサイトにhttpsでアクセスできる。Arduino/ESPのような組み込みシステムでhttpsのクライアントを作成するときは、多くの場合は1つのサイトを対象にしているので、そのサイトに適した認証局証明書(cacert)を用意すれば問題ない。しかしながら、色々なサイトにhttpsでアクセスするニーズもあるかも知れない。Firefoxブラウザが使っているMozillaが用意している認証局証明書を使って、Webブラウザのように色々なサイトをアクセスする組み込みシステムをつくるためのヒントを載せておく。

ESP32のためのRoot CA証明書

次のステップで作成する。

  1. 変換ツールgen_crt_bundle.pyの入手
  2. cacert.pemを入手
  3. x509_crt_bundle.h を生成

ESP32で使うためのフォーマットを作成するツールを入手する

まずespressifがgithubで公開しているgen_crt_bundle.pyを入手する。


https://github.com/espressif/esp-idf/blob/master/components/mbedtls/esp_crt_bundle/gen_crt_bundle.py

ブラウザでアクセスしてダウンロードするかwgetでダウンロードをするときのURLは次の通り。

https://raw.githubusercontent.com/espressif/esp-idf/master/components/mbedtls/esp_crt_bundle/gen_crt_bundle.py

cacert.pemを入手

以下のサイトにcacert.pemがあるので、そこから最新のcacert.pem取ってくる。これはMozillaが用意している認証局証明書リストをx.509フォーマットに変換したものとのことである。


https://curl.se/docs/caextract.html

直接ダウンロードするURLは次の通りである。サイトには歴代のcapem.pemが用意されているが、以下のURLは最新のcacert.pemとなっている

https://curl.haxx.se/ca/cacert.pem

ツールでx509形式のフォーマットにする

先程ダウンロードしてきたgen_crt_bundle.pyを使いフォーマット変換する。

$ python gen_crt_bundle.py -i cacert.pem

するとx509_crt_bundleというファイルができる。さらにそれをc langで使える形にする。

$ xxd -i x509_crt_bundle | sed "s/unsigned/const unsigned/g" >x509_crt_bundle.h

プログラムへの取り込み

x509_crt_bundle.hには


const unsigned char x509_crt_bundle[] = {
…}

const unsigned int x509_crt_bundle_len = (ここには数値がある);

が入っていて、それを使えば問題なく処理できる。なおx509_crt_bundleのサイズはsizeof(x509_crt_bundle)でもx509_crt_bundle_lenでも同じ。あとはx509_crt_bundle(と、そのサイズ)をsetCACertBundleにセットすれば良い。