ESP32 ( ESP-WROOM-32 ) で信頼ある SSL サーバーを自作する ( ESP-IDF編 )

記事公開日:2018年3月13日
最終修正日:2018年3月15日

こんばんは。

前回の記事に引き続き、ESP32 ( ESP-WROOM-32 )で SSL サーバーを構築するための第3弾として、今回はいよいよ実際のハードウェア、ESP-WROOM-32開発ボードで SSL サーバーを作る方法を説明してみようと思います。
しかも、その SSL サーバーは「信頼ある」ものです。
ブラウザの URL 欄に鍵マークが表示されるものです。

正直言って、今回はかなり感動しますよ!
自分で証明書を作って、自分でサーバーを作って、ブラウザに信頼されるっていうのは、長年の夢でもありました。

これができれば、自作 IoT 機器で「信頼ある」暗号化通信が可能になると思われます。
アマチュア電子工作家にとって夢のようなお話だと思います。

これも、オープンソースで公開して下さっている、OpenSSL や、ESP-IDF 開発チームのおかげです。

ということで、まずは以下の動画をご覧ください。

いかがでしょうか?

Android Google Chrome だけでなく、ついに、iOS の iPad Safari でも信頼ある SSL 通信ができるようになりました!!!

文字を表示させるだけの SSL サーバーですが、たったこれだけでもかなり感動します。

今回は、ブラウザ Google Chrome に絞った解説をしますが、後日、iOS の信頼の得方もアップしようとは考えています。

前回前々回に引き続き、3段階で SSL サーバーを自作する方法を解説していますが、今回が最終段階です。
個人的に、これができれば、電気通信技術者等の国家試験で、イマイチ理解できなかった SSL通信や公開鍵暗号化方式( PKI )などについて、格段に理解が深まると思いました。

ということで、実際のハードウェア、ESP-WROOM-32 ( ESP32 )開発ボードを使った SSL サーバーの作り方を説明していきます。
因みに、何度も申し上げておりますが、私は基本的に素人ですので、間違いがありましたらコメント投稿欄等でご連絡いただけると助かります。

以下、Windows 10 パソコン、Google Chrome、Android 7.0 スマホで説明します。

スポンサーリンク

    【目次】

  1. ESP-WROOM-32 開発ボードを2台準備しておく
  2. Wi-Fi ルーター(アクセスポイント)の設定をしておく
  3. ESP-IDF を予めインストールしておく
  4. ESP-IDF の openssl_server サンプルプログラムをコピーする
  5. 自己証明書および秘密鍵をコピペする
  6. ルートCA用 ESP-IDF サンプルプログラムの修正
  7. ユーザーサーバー用 ESP-IDF サンプルプログラムの修正
  8. ルートCA用、ESP-IDF の menuconfig 設定
  9. ユーザーサーバー用、ESP-IDF の menuconfig 設定
  10. make flash コマンドで、ESP-WROOM-32 フラッシュへコンパイル書き込みする
  11. シリアルモニターで、ローカルIPアドレスを確認する
  12. 証明書の IP アドレスと、ESP-WROOM-32 開発ボードの IPアドレスを揃える
  13. ブラウザでアクセスし、SSL/TLS 暗号化通信確認
  14. ブラウザから信頼を得るために、ルート証明書をインストールする
  15. Android スマホにルート証明書をインストールする
  16. スマホで ESP32 SSLサーバーにアクセスし、信頼されたことを確認する
  17. ユーザーサーバーアクセス時のルートCAサーバーのアクセスはどうなっている?

1.ESP-WROOM-32 開発ボードを2台準備しておく

ESP-WROOM-32 ( ESP32 )開発ボードは2台準備しておきます。
なぜ、2台かというと、ルート認証局サーバー用と、ユーザーサーバー用に使用するからです。

実は、最後の方で述べますが、ユーザーサーバー用だけでも信頼済みSSLサーバーを構築できます。
しかし、ここではSSL通信の公開鍵暗号化方式の勉強ために、ルート認証局サーバーを構築しておくと、理解が深まると思います。

ESP-WROOM-32 開発ボードは、USB電源や、ホスト機器の保護機能が充実したスイッチサイエンスさんの以下のものをお勧めします。

ESPr Developer 32

組み立て方や使い方は以下の記事を参照してください。

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

その他、Espressif Systems 社純正の ESP32-DevKitC でも良いです。

私の場合、ESP32-DevKitC をルート認証局 ( CA )サーバーとし、ESPr Developer 32 をユーザーサーバーとしました。
Arduino IDE のサンプルスケッチなどで予め調べておいたローカルIPアドレスは下図の様になりました。

ESP_IDF_openssl_server01

もし、ローカルIPアドレスが分からない場合は先に進んでください。
ESP-IDF をコンパイルして、Wi-Fiルーターに接続されると、シリアルモニターで確認することができます。

2.Wi-Fi ルーター(アクセスポイント)の設定をしておく

事前に、ご自分の Wi-Fi ルーター(アクセスポイント)に ESP-WROOM-32 ( ESP32 )がコネクションできるようにしておいてください。
MAC アドレスフィルタリング設定や、ファイアウォール設定を確認しておいてください。

ネットワーク機器が沢山ある場合は、DHCPサーバーの最大接続数を超えてしまって、ローカルIPアドレスを発行できなくなっている場合がありますのでご注意ください。

3.ESP-IDF を予めインストールしておく

いつもは、Arduino – ESP32 を使っていますが、今回は Espressif Systems社純正の開発環境、ESP-IDF を使います。
今のところ、openssl_server サンプルプログラムは ESP-IDF にしかありません。

以下の記事を参照して、パソコンにインストールしておいてください。
Windows 10 で説明しています。

ESP-IDF ( ESP32 開発環境 ) の使い方

toolchain-20180110 以降をお使いください。
また、git clone コマンドで最新版にしておいてください。
Arduino に比べてかなり難解です。
マイコン中級クラスと思ってください。

いつかArduino – ESP32 で使えるようにしてみようとは考えています。

4.ESP-IDF の openssl_server サンプルプログラムをコピーする

では、まず、ESP-IDF に同梱されている、openssl_server というサンプルプログラムをコピーします。

ご自分の、ESP-IDF をインストールしたフォルダ中の、以下のサンプルプログラムフォルダをエクスプローラーで開いて下さい。
※USER-NAME のところは、ご自分の Windows ユーザーネームです

D:\msys32\home\USER-NAME\esp\esp-idf\examples\protocols

そうしたら、下図の様に、openssl_server というサンプルプログラムフォルダを右クリックコピーします。

ESP_IDF_openssl_server10

次に、以下のフォルダを開きます。

D:\msys32\home\USER-NAME

そこに下図の様にopenssl_server を貼り付けます。

ESP_IDF_openssl_server11

次に、例として、下図の様に、その openssl_server フォルダ名を、
openssl_CA
というフォルダ名に書き替えます。
これはルート認証局用プログラムとします。

ESP_IDF_openssl_server12

上記と同様に、もう一度、openssl_server フォルダをコピーして、同じフォルダに貼り付けます。
今度は、このフォルダ名の変更はしません

ESP_IDF_openssl_server13

5.自己証明書および秘密鍵をコピペする

次に、前回の記事で作成した自己証明書と秘密鍵を ESP-IDF のサンプルプログラムフォルダへコピペします。
ESP-IDF のサンプルプログラムでは、PEM形式の証明書を使うことになっています。

まずは、ルート認証局 ( CA )用からです。

以下のフォルダを開きます。

D:\msys32\home\USER-NAME\openssl_CA\main

ここには、ESP-IDF でコンパイルするソースプログラムが入っています。
このフォルダ内には、下図の様に予め仮のサンプル証明書と秘密鍵が入っています。
これは不要なので削除します。

ESP_IDF_openssl_server14

次に、前回の記事で作成した、証明書の入っているフォルダを開きます。
私の場合のパスは以下の通りです。

D:\OpenSSL-Win64\MyData

そのルート認証局 ( CA )証明書と秘密鍵
esp32_ca.crt
esp32_ca.key
を先ほどの開いたソースプログラムフォルダ

D:\msys32\home\USER-NAME\openssl_CA\main

にコピペします。

ESP_IDF_openssl_server15

次に、コピペした、
esp32_ca.crt
というファイルを

cacert.pem

というファイル名に変更します。
このファイルは前回の記事にあるように 、既に PEM形式なので、そのままファイル名を変えるだけでOKです。

ESP_IDF_openssl_server16

次に、以下のように、
esp32_ca.key
というファイル名を

prvtkey.pem

というファイル名に変更します。
これも既に PEM 形式になっているので、そのまま名前を変えるだけで良いです。

ESP_IDF_openssl_server17

今度は、ユーザーサーバー用証明書と秘密鍵をコピペします。
先ほど作った以下のパスのフォルダを開きます。

D:\msys32\home\USER-NAME\openssl_server\main

そうしたら、下図の様に、予め入っていた仮のサンプル証明書と秘密鍵は不要なので消去します。

ESP_IDF_openssl_server18

次に、前回の記事で作成した、証明書の入っているフォルダを開きます。
私の場合のパスは以下の通りです。

D:\OpenSSL-Win64\MyData

前回の記事で、認証局の署名付きユーザーサーバー証明書esp32_server.crt をPEM形式に変換した、
cacert.pem
と、ユーザーサーバー秘密鍵
esp32_server.key
を使います。

それを

D:\msys32\home\USER-NAME\openssl_server\main

フォルダにコピペします。

ESP_IDF_openssl_server19

ここで注意していただきたいのは、前回の記事で作成したユーザーサーバー用証明書  cacert.pem は名前を変更せず、そのまま ESP-IDF で使います

ですから、下図の様に、秘密鍵の
esp32_server.key
ファイルのみ、
prvtkey.pem
というファイル名に変更します。

ESP_IDF_openssl_server20

これで、ESP-IDF の証明書と秘密鍵の準備完了です。
次はサンプルプログラムの修正方法を説明します。

スポンサーリンク


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

投稿者:

mgo-tec

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

コメントを残す

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

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください