こんばんは。
前回の記事に引き続き、ESP32-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 スマホで説明します。
以下の記事も合わせて参照してください。
ESP32 および M5Stack で DNS および mDNS の SSL server を作ってみた
(2018/11/15)
- ESP-WROOM-32 開発ボードを2台準備しておく
- Wi-Fi ルーター(アクセスポイント)の設定をしておく
- ESP-IDF を予めインストールしておく
- ESP-IDF の openssl_server サンプルプログラムをコピーする
- 自己証明書および秘密鍵をコピペする
- ルートCA用 ESP-IDF サンプルプログラムの修正
- ユーザーサーバー用 ESP-IDF サンプルプログラムの修正
- ルートCA用、ESP-IDF の menuconfig 設定
- ユーザーサーバー用、ESP-IDF の menuconfig 設定
- make flash コマンドで、ESP-WROOM-32 フラッシュへコンパイル書き込みする
- シリアルモニターで、ローカルIPアドレスを確認する
- 証明書の IP アドレスと、ESP-WROOM-32 開発ボードの IPアドレスを揃える
- ブラウザでアクセスし、SSL/TLS 暗号化通信確認
- ブラウザから信頼を得るために、ルート証明書をインストールする
- Android スマホにルート証明書をインストールする
- スマホで ESP32 SSLサーバーにアクセスし、信頼されたことを確認する
- ユーザーサーバーアクセス時のルート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アドレスは下図の様になりました。
もし、ローカル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 で説明しています。
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 というサンプルプログラムフォルダを右クリックコピーします。
次に、以下のフォルダを開きます。
D:\msys32\home\USER-NAME
そこに下図の様にopenssl_server を貼り付けます。
次に、例として、下図の様に、その openssl_server フォルダ名を、
openssl_CA
というフォルダ名に書き替えます。
これはルート認証局用プログラムとします。
上記と同様に、もう一度、openssl_server フォルダをコピーして、同じフォルダに貼り付けます。
今度は、このフォルダ名の変更はしません。
5.自己証明書および秘密鍵をコピペする
次に、前回の記事で作成した自己証明書と秘密鍵を ESP-IDF のサンプルプログラムフォルダへコピペします。
ESP-IDF のサンプルプログラムでは、PEM形式の証明書を使うことになっています。
まずは、ルート認証局 ( CA )用からです。
以下のフォルダを開きます。
D:\msys32\home\USER-NAME\openssl_CA\main
ここには、ESP-IDF でコンパイルするソースプログラムが入っています。
このフォルダ内には、下図の様に予め仮のサンプル証明書と秘密鍵が入っています。
これは不要なので削除します。
次に、前回の記事で作成した、証明書の入っているフォルダを開きます。
私の場合のパスは以下の通りです。
D:\OpenSSL-Win64\MyData
そのルート認証局 ( CA )証明書と秘密鍵
esp32_ca.crt
esp32_ca.key
を先ほどの開いたソースプログラムフォルダ
D:\msys32\home\USER-NAME\openssl_CA\main
にコピペします。
次に、コピペした、
esp32_ca.crt
というファイルを
cacert.pem
というファイル名に変更します。
このファイルは前回の記事にあるように 、既に PEM形式なので、そのままファイル名を変えるだけでOKです。
次に、以下のように、
esp32_ca.key
というファイル名を
prvtkey.pem
というファイル名に変更します。
これも既に PEM 形式になっているので、そのまま名前を変えるだけで良いです。
今度は、ユーザーサーバー用証明書と秘密鍵をコピペします。
先ほど作った以下のパスのフォルダを開きます。
D:\msys32\home\USER-NAME\openssl_server\main
そうしたら、下図の様に、予め入っていた仮のサンプル証明書と秘密鍵は不要なので消去します。
次に、前回の記事で作成した、証明書の入っているフォルダを開きます。
私の場合のパスは以下の通りです。
D:\OpenSSL-Win64\MyData
前回の記事で、認証局の署名付きユーザーサーバー証明書esp32_server.crt をPEM形式に変換した、
cacert.pem
と、ユーザーサーバー秘密鍵
esp32_server.key
を使います。
それを
D:\msys32\home\USER-NAME\openssl_server\main
フォルダにコピペします。
ここで注意していただきたいのは、前回の記事で作成したユーザーサーバー用証明書 cacert.pem は名前を変更せず、そのまま ESP-IDF で使います。
ですから、下図の様に、秘密鍵の
esp32_server.key
ファイルのみ、
prvtkey.pem
というファイル名に変更します。
これで、ESP-IDF の証明書と秘密鍵の準備完了です。
次はサンプルプログラムの修正方法を説明します。
コメント
mgo-tec 様
今回こそ何とか自力でクリアしようと望みましたがやはりダメでした。
試行錯誤しながら、「10. make flash コマンドで、ESP-WROOM-32 フラッシュへコンパイル書き込みする」まで到達しました。
openssl_CA のシリアルモニターでの確認において、ユーザーサーバー用ローカル IP アドレスが表示されません。
シリアルモニターには、
ESP_ERROR_CHECK failed: esp_err_t 0x1110 (ESP_ERR_NVS_NEW_VERSION_FOUND) at 0x400d2de5
file: “C:/msys32/home/USER-NAME/openssl_CA/main/openssl_server_example_main.c” line 261
func: app_main
expression: nvs_flash_init()
と表示されています。
「 SSL Server 自作するための OpenSSL 使用方法」を2回やり直して、本テキストに臨みましたが同じ結果となります。
気になる点:
① ESP-IDF の menuconfig 設定で、
make[1]: ディレクトリ ’/home/USER /esp/esp-idf/tools/kconfig’ に入ります
という表示がなく、menuconfig 画面に切り替わっています。
② 「 SSL Server 自作するための… 」の
3.ユーザーサーバー用の .cfg ファイルの編集のところで、
[ usr_cert ]
basic Constraints = CA: FALSE #170行目変更しない
とありますが、原文には、#basic Constrains … とあり、コメントアウトが必要?
抽象的な説明で申し訳ありません、何かヒントがありましたらご教示の程お願いいたします。
juchangさん
いつもお試しいただき、ありがとうございます。
今、新規記事アップのための編集大詰め状態ですので、回答は今しばらくお待ちくださいませ。
m(_ _)m
mgo-tec 様
お忙しいところご面倒をお掛けします。
その後の経過報告です。
ESP_ERROR_CHECK failed: esp_err_t 0x1110 (ESP_ERR_NVS_NEW_VERSION_FOUND) at 0x400d2de5
について、MSYS2 ツールチェーンのバージョンが、v3.1 と古いことが判明しました。(当初、20190611 を使用していましたが、うまくいかず 20181001 にしたら上記の結果となりました)
20190611 に戻し、本テキストに再チャレンジしているところですが、今度は、make menuconfig もエラーとなってしまいます。
テキストのどこの時点までさかのぼってやり直すべきか、OpenSSL の取得を含め、すべて delete してやり直すべきか悩んでいます。
juchangさん
新規記事アップに体力を大幅に消耗していて、なかなか検証できないでいます。
申し訳ございません。
まず、最新のツールチェーンは試していないので、20180110を使って下さい。
記事を書いた当初はそれで動作確認しています。
最新のツールチェーンはESP-IDFの使い方が変わっている可能性があります。
ESP-IDFの辛いところは、バージョンアップすると使えなくなる可能性が高いことです。
Arduino IDE は環境が殆ど変わらないので、うまく動作しない場合は先に進んで、以下の記事
Arduino – ESP32 で SSLサーバーを構築し、セキュアな Wi-Fi アクセスポイントセレクターを作ってみました
を試すという手がおススメです。
また、#basic Constrainsのところは、コメントを外してください。
そうしないとユーザーサーバーを認識しません。
以上、試してみて下さい。
juchangさん
OpenSSL の最新バージョンはまだ試していませんが、当方でtoolchain 20181001 を使って、ESP-IDF v3.3 にして、サンプルコードをmake flashしてみましたが、特に問題ありませんでした。
いつの間にかESP-IDFはstable版というものになっていたみたいですね。
この記事のToolChain リンクが古いままだったので、現在のURLに変更しました。
また、以下のリンク
https://docs.espressif.com/projects/esp-idf/en/stable/get-started/index.html#get-esp-idf
では、ESP-IDF clone する時に、ESP-IDFバージョン指定例が書いてありました。
それに習って、本記事も修正しました。
以下の様な感じです。
また、ESP-IDF の menuconfig 設定で、
という表示がない場合は、恐らく、PATHの指定が誤っているものと思われます。
今一度、この記事の
「3.MSYS2 の環境設定で ESP-IDF のパスを通すファイルを作成」
のところを参照して、ご自分のパソコン内のフォルダパスになっているか確認してください。
(’\’マークと’/’を間違えないようにしてください)
mgoさん
やっと鍵マークが出てきました。
MSYS2のインストールがうまく行きませんでした。バージョンを変えてもコンパイルできません。ESP-IDFのコマンドプロンプトでの環境設定やコンパイルはできるのでそちらで行いました。SSLが良くわかり、ありがとうございました。
okuさん
こんなマニアックな記事をご覧いただき、ありがとうございます。
この記事は3年近く前のものですが、動いて良かったです。
確かに、今のESP-IDFのバージョンなら、MSYS2よりもWindowsコマンドプロンプトで実行した方が確実ですね。
(^^)