SSL認証局(ルート証明書)を取得する
では、ESP32 ( ESP-WROOM-32 )マイコンで SSL ( https )ページを取得するには、ブラウザと同じように公開鍵を含んだルート証明書をマイコンに保存しておかねばなりません。
そこで、Yahoo! Japan RSS ニュースサイトのルート証明書を取得してみたいと思います。
Yahoo! Japan と言えば、誰もが信頼できるサイトと言えますね。
つまり、私個人として、このサイトは信頼できるサイトとして既に審査合格です。
そこで使っているルート証明書を ESP32 ( ESP-WROOM-32 ) に登録しておけば、Yahoo! Japan を信頼あるサイトとして照合できるわけです。
当ブログの過去の記事でも沢山紹介しましたが、Yahoo! Japan RSS サイトというのは、テキストベースの記事で様々なニュースの見出しを提供している、電子工作的にはとても便利なサイトです。
ニュースの詳しい内容を見ることはできませんが、電子工作で電光掲示板に表示させるくらいならば十分です。
私的には、ニュース記事の見出し(記事の題名)だけでもある程度把握できるので、とても重宝しています。
もし、もっと詳しい内容を見たければ、スマホやパソコンでそのサイトを訪問すれば良いわけですから・・・。
因みに、このサイトの利用は個人使用の範囲では無料ですが、それ以上や商用利用については Yahoo! Japan さんへ直接お問い合わせください。
では、まず以下のように、Arduino IDE のWiFiClientSecureサンプルスケッチを開いてみて下さい。
すると、こんな感じにtest_root_ca なるものがあります。
これが、先ほど説明した認証局が証明している暗号化されたルート証明書です。
因みに、この証明書は Yahoo! Japan RSS サイトのルート証明書ではないので使えません。
Yahoo! Japan RSS サイトの場合は、現時点ではこの証明書が無くても記事を取得できますが、将来的にこれが無いと取得できなくなる可能性もあるので、設定しておいた方が良いでしょう。
では、Yahoo! Japan RSS サイトのルート証明書を取得する方法を説明します。
パソコンのブラウザによって取得方法が異なります。
(Windows10 の場合で説明します)
Google Chrome の場合
2023/02/11時点のGoogle Chrome バージョン110.0.5481.78 の場合で説明します。
他のバージョンでは異なる場合がありますので、予めご了承ください。
まず、Google Chrome を起動し、以下のYahoo! Japan RSSサイトを開いて、右上端の点々をクリックします。
次に「その他のツール」→「デベロッパーツール」をクリックします。
次に、下図の様に>>というマークをクリックすると、隠れているメニューを見ることができます。
そして、次に下図の様に「セキュリティ」をクリックします。
すると、下図の様に表示されるので、「証明書を表示」をクリックします。
すると、下図の様に証明書ビューワが表示されるので、「詳細」タブをクリックします。
すると、下図の様に証明書の階層が表示されます。
ここで要注意ですが、一番上の階層、つまりルートの部分をクリックして選択してください。下のedge01というのを選択してしまうと、ルート証明書ではなくなってしまいます。
ということで、下図の様にルートの証明書をクリックして、「エクスポート」をクリックします。
すると、下図の様に名前を付けて保存ウィンドウが開くので、「Base64 エンコード ASCII 形式の単一の証明書」が選択されていることを確認して、「保存」をクリックします。
すると、下図の様にダウンロードフォルダにcrt形式で証明書公開鍵が保存されます。
これをテキストエディタで開きます。
すると、下図の様に Arduino IDE サンプルスケッチにあったような暗号化されたルート証明書になっていることがわかると思います。
この中には認証機関や公開キー等の情報が暗号化されて詰まっています。
このように21行あればOKです。それ以上長い証明書はルート証明書ではないエッジ証明書の可能性があるので、間違えないようにしてください。
これを、Arduino IDE にコピペして、サンプルスケッチにあるような書式に変更すれば良いわけです。
Windows Edge の場合
Windows Edgeの場合、デベロッパーツールではなくて、「開発者ツール」という名前です。
その他はGoogle Chromeと殆ど同じです。
以上、Yahoo! Japan RSS ニュースサイトのルート証明書の取得方法でした。
コメント
いつも大変お世話になっております。
ここの記事を参考に、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をゲットできなくなる可能性もあるかも知れませんね。