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

通常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にセットすれば良い。

Let’s encryptの証明書でTLS化されているサイトの認証局証明書を入手する方法

一番簡単なのはGoogle Chromeに入っている認証局の証明書を取り出して使う方法だと思う。ではやってみよう。

手順は以下の通り

  1. Google Chromeでchrome://certificate-manager/crscertsをアクセスする。
  2. 証明書マネージャのページになるので、そこでChrome Root Storeを選択する。
  3. ISRG Root X1の証明書を探して、右端の表示アイコンをクリックすると証明書ビューアーに表示される。
  4. 詳細タブを選択し、右下にあるエクスポートをクリックするとファイル保存になるのでファイルを保存する。

このファイルの中身にISRC Root X1の証明書が入っている。ArduinoIDEのサンプルコードBasicHTTPSClientのコードの中にあるrootCACertificateを取り出した証明書に置き換えればLet’s encryptのTLS証明書を使っているサイトに問題なくTLS (https)でアクセスすることができるようになる。

ノートパソコンのリチウム・イオン・バッテリー その後

ノートパソコンのリチウム・イオン・バッテリーの寿命は伸びるか?」というエントリーを書いてから、もう4年も経ってしまった。それで気になる結果だがupowerコマンドを使って確認した結果は以下の通り。

$ upower -i /org/freedesktop/UPower/devices/battery_BAT0
  native-path:          BAT0
  vendor:               LGC
  model:                5B10W139
  serial:               1999
  power supply:         yes
  updated:              2024年09月10日 12時30分49秒 (2 seconds ago)
  has history:          yes
  has statistics:       yes
  battery
    present:             yes
    rechargeable:        yes
    state:               pending-charge
    warning-level:       none
    energy:              42.41 Wh
    energy-empty:        0 Wh
    energy-full:         50.49 Wh
    energy-full-design:  50.5 Wh
    energy-rate:         0.251 W
    voltage:             12.444 V
    charge-cycles:       173
    percentage:          83%
    capacity:            99.9802%
    technology:          lithium-polymer
    icon-name:          'battery-full-charging-symbolic'

バッテリー劣化状態をみるのはcapacity値ということなのだが計測結果では99.9802%とあり、少なくともupowerの値を信じるならばバッテリーの劣化は計測誤差みたいなレベルで、実質的には劣化していないという結果となった。日頃使っていてバッテリーチャージ状態になるのは週に一度あるかないかぐらいで、1-2時間のミーティングで使っている範囲だとチャージするスレッシュホールドまで届かないのが現状である。約4年間使っていて現状の方式でなんら困ることはなかった。結論としては、うまくいっているようだ。

eneloop(ニッケル水素電池)でESP32-WROOM-32Eを動かす

eneloopを4本用意してXC9306使用同期整流昇降圧DC/DCコンバータ[1]を噛まして3.3VにしてESP32-WROOM-32E開発ボード[2]にツッコんでみた。電池の電圧を測りつつ、その値をWiFi経由で5秒に1回udpパケットとしてサーバーに送るプログラムを書いて、どれだけ時間的にもつのか試してみた。

分かったことは2つ

  • 48時間は持たないけど、36時間ぐらいなら持つ
  • eneloopの電池の持ち方の特性は説明通りだった

5秒に一度128バイト程度のデータを送り続けるわけで、それで40時間ぐらいは持っているので、悪くはないというか、データシート[3]から想定される値と大きく違いはなかった。

eneloop[4]も一定の期間安定していて、最後にストンと落ちるニッケル水素電池の特性をきちんと示していた[fig1]。

つけっぱなしでも一日ぐらいは余裕で持つというということがわかった。

[1] XC9306使用同期整流昇降圧DC/DCコンバータ
https://akizukidenshi.com/catalog/g/g116055/

[2] ESP32-DevKitC-32E ESP32-WROOM-32E開発ボード 4MB
https://akizukidenshi.com/catalog/g/g115673/

[3] ESP32-WROOM-32E & ESP32-WROOM-32UE Datasheet
https://akizukidenshi.com/goodsaffix/esp32-wroom-32e_esp32-wroom-32ue_datasheet_en.pdf

[4] エネループ(ニッケル水素電池)
https://panasonic.jp/battery/products/charge/eneloop.html

電池4本の電力変化グラフ (Fig1)