こんばんは。
今回こそは、Web記事4つ連続取得したミニ電光掲示板を紹介する予定でしたが、その前に Arduino core for ESP32 の WiFiClientSecure ライブラリの使い方を紹介しておこうと思います。
なかなかこれは Sample スケッチを見ただけでは良く分からないことが多いんですよね。
しかも、ネット上ではWiFiClientSecure を使った解説は殆どありませんし・・・。
でも、前回、前々回の記事で勉強したことを頭に入れておくと、いろいろと細かいことが分かって来ました。
そして、今回は Yahoo! Japan RSS ニュースサイトの https ( SSL ) 記事に関しては、かなり安定して GET できるようになりました。
以前はたまに記事を取得できない時がありましたが、今回はほぼ100%取得できるようになりました。
これには、プログラム(スケッチ)の組み方に少々工夫が必要で、今回はその方法を紹介したいと思います。
そして、よく分からなかった ルート証明書 ( root_ca ) についてもかなり分かって来ましたので、それも紹介してみたいと思います。
この記事および自作ソースコードの公開について、Yahoo! Japan さんにお問い合わせして、趣味や研究範囲と判断でき、問題無いとの回答を得ております。 (2017/8/11)
もし、誤っていたらコメント投稿欄等でご連絡いただけると助かります。
証明書関連については以下の記事も合わせてご覧ください。
●SSL サーバーを自作するための自分的予備知識
●SSL Server 自作するための OpenSSL 使用方法
●ESP32 ( ESP-WROOM-32 ) で信頼ある SSL サーバーを自作する ( ESP-IDF編 )
以下の記事を参照してください。
ESP32 および M5Stack で数時間後に Web 記事取得失敗する問題について
また、WiFiClientSecure ライブラリのセキュリティについて新たなことが分かりました。
以下の記事を参照してください。
WiFiClientSecure ライブラリの SSL 証明書有効期限の検証等、セキュリティ問題を探ってみた
2018/11時点の WiFiClientSecure ライブラリは、相手サーバー証明書の有効期限チェックや失効リストの検証(Verify)はしてくれないので、それを十分了承の上使用してください。
(2018/11/15)
使用するもの
以下の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 対応ページということになります。
正直、私はあまり SSL 通信に詳しくはないのですが、Webサイトを SSL化するということについてザッと簡単に説明してみます。
まず、SSL専用サーバーにWebページ全体を移行し、お金を払って SSL 認証局 ( VeriSignとか、GeoTrustとか) に信頼あるサイトとして証明してもらい、証明書を発行してもらいます。
そして、クライアントがブラウザでWebページを見ようとするときに、サーバーから暗号化された証明書をブラウザに送ります。
そして、ブラウザにはルート証明書が予め保存してあり、それと送られてきたサーバーの証明書とを照合することによって、そのサイトは信頼あるサイトかどうかを判断しています。
そして、公開鍵、秘密鍵、共通鍵を使ってブラウザとサーバーとの間で通信を暗号化、復号化しているという感じです。
私もこの通信について突っ込まれると、まだちゃんと答えられないことが多いのですが、この辺についてはネットで情報が沢山あるので調べてみて下さい。
普段、ブラウザでネットサーフィンしている分には、殆どストレス無しで観閲できますよね。
これって意外と不思議と思いませんか?
そして、ブラウザに予めルート証明書が登録してあるということはどういうことでしょうか?
これはつまり、ブラウザメーカー( Microsoft や Google , Apple 等)が SSL認証局や証明書を厳密に審査して、合格した認証機関証明書だけをブラウザに予め保存しておいてあるということだそうです。
登録してある証明書は Google Chrome では下図の様に設定画面で確認することができます。
次に下図の様に設定の三本線をクリックします。
そして、下図の様に「詳細設定」を選択して、「プライバシーとセキュリティー」をクリックします。
次に、下図の様に「証明書の管理」をクリックします。
すると、証明書のウィンドウが開くので、「信頼されたルート証明機関」タブをクリックすると、予めブラウザに登録してあるルート証明書の一覧を見ることができます。
ここにある証明書と同じ証明書があれば、信頼あるサイトとしてブラウザが判断できるわけです。
あとは中間証明機関とかいろいろありますが、長くなるのでここでは割愛します。
その他、ブラウザとサーバー間で公開鍵、秘密鍵、共通鍵のやり取りを高速で行ってデータを暗号化したり復号したりしています。
ですから、SSL 通信というのは、暗号化や復号化などの厖大な文字列やデータをやり取りしているので、これをマイコンで通信しようとすると、メモリの面でかなり厳しいということが分かると思います。
以上、ザッと簡単な SSL通信の概要でした。
コメント
いつも大変お世話になっております。
ここの記事を参考に、ESP32でyahooニュースを表示させていたのですが、今年一月下旬より表示されなくなりました。Yahoo RSSニュースを取得する関数「https_Web_Get」でエラーとなっています。色々調べてルート証明書を変更したりしたのですが、未だに解決できません。
なにかアドバイスいただけないでしょうか?
よろしくお願いいたします。
ヨッシーさん
記事をご覧いただき、そして試していただきありがとうございます。
そういえば、Twitterでもツイートしましたが、2023年1月下旬でYahoo! Japan RSSサイトのルート証明書が更新されました。
私自身のM5Stack版Yahooニュースもゲットできなくなったので、証明書公開鍵を新しくダウンロードして、コンパイルし直したら問題無く表示されました。
この記事にあるサンプルスケッチも新しいルート証明書でコンパイルしてみましたが、私のESP32開発ボードでは問題無く表示されました。
ちなみに環境は以下です。
Arduino IDE 1.8.19
Arduino core for the ESP32 ver 2.0.6
これでもゲットできない場合は、もしかしたら証明書がedge01.yahoo証明書をダウンロードしてしまった可能性が考えられます。
私の場合は一度間違えて、それをダウンロードしてゲットできなかったことがあります。
証明書をテキストエディタで開くと、21行よりも倍以上の長いテキストだったので、おかしいなと思いました。
つまり、ルート証明書ではなく、エッジ証明書だったのです。
今回を機に、この記事のルート証明書取得方法を一新しました。
これで試してみて下さい。
アドバイスありがとうございます。
私も、最初は、長いルート証明書で駄目だったようです。短いものに替えて動くようになりました。
9個のトピックスを読んでいるのですが、以前は、9個取れていたのですが、現在接続に成功するのは2~3個で不安定です。
あとネットで色々調べていたら、下記のコマンドでルート証明書をスキップ出来ることが分かりました。
WiFiClientSecure https_client;
// https_client.setCACert(yahoo_root_ca); //Yahooサイトのルート証明書をセットする
https_client.setInsecure();//skip verification
以上 参考までに。
ヨッシーさん
とりあえず動いて良かったです。
setInsecureに関しては存じております。
ただ、Yahoo RSSサイト程度でしたらルートCAをセットしなくても良いと思いますが、私個人としてはブラウザと同じように、信頼できるサイトをESP32に登録しているという認識で使っていった方が良いと思っています。SSL通信の理解も深まるような気がしています。
また、以前はトピックス9個取得できていて今は2~3個しか取得できていない場合は、おそらくESP32のメモリ容量オーバーしたプログラミングだと予想されます。
私も以前同じ経験がありました。ルートCAは文字列が多いので、メモリを消費するんですよね。
スタックメモリとヒープメモリを管理して、オーバーしないようにソースコードを改良したら、ルートCAセットしても問題無くトピックスを取得できるようになりました。
そういえば、Arduino core ESP32も、バージョンアップするごとにメモリが多く消費されるようになってきましたしね。
もしかしたら将来的にYahooさんもCA無しではRSSをゲットできなくなる可能性もあるかも知れませんね。