Arduino – ESP32 WiFiClientSecure ライブラリで、安定して https ( SSL )記事をGETする方法

記事公開日:2017年7月25日
最終修正日:2017年10月7日

スポンサーリンク

こんばんは。

今回こそは、Web記事4つ連続取得したミニ電光掲示板を紹介する予定でしたが、その前に Arduino core for ESP32 の WiFiClientSecure ライブラリの使い方を紹介しておこうと思います。

なかなかこれは Sample スケッチを見ただけでは良く分からないことが多いんですよね。
しかも、ネット上ではWiFiClientSecure を使った解説は殆どありませんし・・・。

でも、前回前々回の記事で勉強したことを頭に入れておくと、いろいろと細かいことが分かって来ました。

そして、今回は Yahoo! Japan RSS ニュースサイトの https ( SSL ) 記事に関しては、かなり安定して GET できるようになりました。

以前はたまに記事を取得できない時がありましたが、今回はほぼ100%取得できるようになりました。
これには、プログラム(スケッチ)の組み方に少々工夫が必要で、今回はその方法を紹介したいと思います。

そして、よく分からなかった ルート証明書 ( root_ca ) についてもかなり分かって来ましたので、それも紹介してみたいと思います。

この記事および自作ソースコードの公開について、Yahoo! Japan さんにお問い合わせして、趣味や研究範囲と判断でき、問題無いとの回答を得ております。
(2017/8/11)

もし、誤っていたらコメント投稿欄等でご連絡いただけると助かります。

使用するもの

以下のESP-WROOM-32 ( ESP32 ) 開発ボードを使います。
日本の電波法をクリアした、いわゆる技適取得済みの Wi-Fi 、Bluetooth搭載マイコンボードです。

ESPr Developer 32 ( スイッチサイエンス )

USB電源のソフトスタート機能や、FTDI社製 USB-シリアル変換チップを搭載した、日本製 ESP-WROOM-32 開発ボードです。

ESPr® Developer 32

当ブログとしてもお勧めの日本製ボードです。
これをレビューした以下の記事も参照してみてください。

ESPr Developer 32 ( スイッチサイエンス製 ) を使ってみました

ESP32-DevKitC ( Espressif )

ESP32 チップの本家中国メーカー、Espressif 社純正の開発ボードです。
秋月電子通商さんで販売しています。

ESP32-DevKitC ESP-WROOM-32開発ボード

Amazon.co.jp でも販売しています。

Arduino core for ESP32 をインストールしておく

Arduino IDE は 1.8.3 以上を使用してください。

Arduino core for ESP32 のインストール方法は以下の記事を参照してください。

Arduino core for the ESP32 のインストール方法

WiFiClientSecure 関連ライブラリを ESP-IDF で修正して上書きコピーする

Arduino core for ESP32 の WiFiClientSecure ライブラリは、デフォルトで使用するとハングアップ(フリーズ)します。
SSL ( https )Webページから 数十回~数百回 GET リクエストを繰り返すと、固まってマイコンが動かなくなります。
GitHub の issue で投げかけていますが、なかなか修正してくれませんので、以下の記事を参照して、mbedtls ライブラリを修正してください。
ちょっと面倒ですが・・・。

2017/8/2に修正されました。libmbedtls.a ファイルと main.cpp のスタックサイズも修正されました。

Arduino – ESP32 WiFiClientSecure ライブラリのハングアップ問題がついに解決!

SSL ( https ) Webページについて

世の中のセキュリティー向上の風潮と、Google が SSL ページを優先して検索画面の上位に表示させる方向性を示したことにより、最近多くの Web サイトが SSL 化されてきました。

当ブログでも随分前にお金を払って既に SSL 化しています。

下図の様に、Google Chrome の場合は URL アドレス入力欄に緑色の鍵アイコンが表示されて、「保護された通信」と出ていれば、SSL 対応ページということになります。

ESP32_WiFiClientSecure20

正直、私はあまり SSL 通信に詳しくはないのですが、Webサイトを SSL化するということについてザッと簡単に説明してみます。

まず、SSL専用サーバーにWebページ全体を移行し、お金を払って SSL 認証局 ( VeriSignとか、GeoTrustとか) に信頼あるサイトとして証明してもらい、証明書を発行してもらいます。
そして、クライアントがブラウザでWebページを見ようとするときに、サーバーから暗号化された証明書をブラウザに送ります。

そして、ブラウザにはルート証明書が予め保存してあり、それと送られてきたサーバーの証明書とを照合することによって、そのサイトは信頼あるサイトかどうかを判断しています。
そして、公開鍵、秘密鍵、共通鍵を使ってブラウザとサーバーとの間で通信を暗号化、復号化しているという感じです。
私もこの通信について突っ込まれると、まだちゃんと答えられないことが多いのですが、この辺についてはネットで情報が沢山あるので調べてみて下さい。

普段、ブラウザでネットサーフィンしている分には、殆どストレス無しで観閲できますよね。
これって意外と不思議と思いませんか?
そして、ブラウザに予めルート証明書が登録してあるということはどういうことでしょうか?

これはつまり、ブラウザメーカー( Microsoft や Google , Apple 等)が SSL認証局や証明書を厳密に審査して、合格した認証機関証明書だけをブラウザに予め保存しておいてあるということだそうです。

登録してある証明書は Google Chrome では下図の様に設定画面で確認することができます。

ESP32_WiFiClientSecure21

次に下図の様に設定の三本線をクリックします。

ESP32_WiFiClientSecure22

そして、下図の様に「詳細設定」を選択して、「プライバシーとセキュリティー」をクリックします。

ESP32_WiFiClientSecure23

次に、下図の様に「証明書の管理」をクリックします。

ESP32_WiFiClientSecure24

すると、証明書のウィンドウが開くので、「信頼されたルート証明機関」タブをクリックすると、予めブラウザに登録してあるルート証明書の一覧を見ることができます。

ESP32_WiFiClientSecure25

ここにある証明書と同じ証明書があれば、信頼あるサイトとしてブラウザが判断できるわけです。
あとは中間証明機関とかいろいろありますが、長くなるのでここでは割愛します。

その他、ブラウザとサーバー間で公開鍵、秘密鍵、共通鍵のやり取りを高速で行ってデータを暗号化したり復号したりしています。
ですから、SSL 通信というのは、暗号化や復号化などの厖大な文字列やデータをやり取りしているので、これをマイコンで通信しようとすると、メモリの面でかなり厳しいということが分かると思います。

以上、ザッと簡単な SSL通信の概要でした。

スポンサーリンク


mgo-tec電子工作 関連コンテンツ ( 広告含む )

投稿者:

mgo-tec

Arduino , ESP32 ( ESP-WROOM-32 ) , ESP8266 ( ESP-WROOM-02 )等を使って、主にスマホと連携した電子工作やプログラミング記事を書いてます。ライブラリも作ったりしてます。趣味、独学でやってますので、動作保証はしません。
電子回路やプログラミングの専門家ではありません。
畑違いの仕事をしてます。
でも、少しだけ電気の知識が必要な仕事なので、電気工事士や工事担任者等の資格は持ってます。

コメントを残す

メールアドレスが公開されることはありません。

*画像の文字を入力してください。(スパム防止の為)