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

ESP32 ( ESP-WROOM-32 )

11.シリアルモニターで、ローカルIPアドレスを確認する

Arduino IDE や、Tera Term などで、動作確認します。
私の場合は、Arduino IDE のシリアルモニターで確認します。

ESP-WROOM-32 開発ボードをUSBでパソコンに接続した状態で、USB COMポートを設定したシリアルモニターを起動し、リセットボタンを押します。

ルートCA用はこんな感じで表示されます。

ここでは、ローカルIPアドレスが
192.168.0.13
となっています。

このアドレスと、前回の記事で作成した、ルートCA証明書のCN名アドレスを同じにすることに注意してください。
固定IPアドレス設定にしていないと、ルーターの電源を切ると変わってしまうので注意してください。

また、ユーザーサーバー用のアドレスを確認すると、こうなります。

ユーザーサーバー用のアドレスは、
192.168.0.12
となっていました。
私の場合は、前回の記事の後、ルーターの電源を落としてしまったので、変わってしまいました。
やっぱり固定IPアドレス設定にしないと辛いですね。
次回の記事では固定IPアドレスに挑戦してみたいと思いますが、ここでは自動IPで我慢してください。

12.証明書の IP アドレスと、ESP-WROOM-32 開発ボードの IPアドレスを揃える

ルーターのDHCPサーバー自動割り当てで、ローカルIPアドレスが変わってしまったら、再度前回の記事を参照して、証明書のIPアドレスをそれぞれ揃えてください。

以下の手順でやっていきます。

1.openssl_ca.cfg と openssl_server.cfg ファイルの alt_names を揃える

前回の記事で作成した、以下の2つのファイル

openssl_ca.cfg
openssl_server.cfg

の[ alt_names ]項目のところの IP アドレスを、ユーザーサーバー用 ESP-WROOM-32開発ボードのローカル IP アドレスに書き換えてください。

2.demoCA フォルダ内のindex.txt のデータをテキストエディタで削除する

以下のフォルダ

D:/OpenSSL-Win64/MyData/demoCA

にある、index.txt ファイルをテキストエディタで開き、ログテキストを全て削除して保存しておいてください。
そうしないと、証明書発行エラーになります。

3.ルート認証局証明書発行 openssl コマンドの -subj オプション内 CN のアドレスを変える

ルートCA証明書発行時に設定するコマンドで、-subj オプション内に、

"/C=JP/ST=Tokyo/L=Shinjyuku/O=Test_CA/OU=test_ca/CN=192.168.0.13”

とありますが、この CN のアドレスを、ルートCA用ESP-WROOM-32開発ボードのローカルIPアドレスに変更して、発行します。

4.ユーザーサーバー署名要求CSR 発行の際のopenssl コマンドの -subj オプション内 CN アドレスを変える

ユーザーサーバー証明書署名要求 CSR 発行時の openssl コマンドの、-subj オプション内の、

"/C=JP/ST=Tokyo/L=Shinjyuku/O=ESP32server/OU=esp32server1/CN=192.168.0.12”

CNのアドレスを、ユーザーサーバー用ESP-WROOM-32開発ボードのローカルIPアドレスに変更して発行します。

これで、ローカルIPアドレスをデバイスと証明書で揃えることができると思います。
これができたら、再度 MSYS2 ウィンドウで、ルートCA用とユーザーサーバー用の make flash すればOKです。

面倒でスイマセン。

いずれ、固定IP にして、Arduino IDE で動作するようにしたいと思っていますので、しばし辛抱!

13.ブラウザでアクセスし、SSL/TLS 暗号化通信確認

ようやくここまで来ました。

では、Android スマホのブラウザ Google Chrome でルート CA サーバーにアクセスしてみます。
先で調べたように、私の場合のルート認証局 ( CA )サーバーのローカルIPアドレスは、
192.168.0.13
なので、下図の様に URL入力欄に

https://192.168.0.13

と入力します。
https://と入力しないと正しくアクセスできませんので注意して下さい。

アクセスにちょっと時間がかかります。
シリアルモニターで確認しながらアクセスすると良いと思います。
どうやって証明書の受け渡しをしているかが分かります。

アクセス完了すると、下図の様になりますが、下の方にある「詳細設定」をタップします。

すると、下図の様に表示されるので、下図の様なところをタップします。
安全ではないと警告が出ていますが、これは私が作ったサーバーですので、問題無しです。

すると、下図の様に表示され、文字が出ました!!!
これ、結構感動しませんか?
少なくとも私は感動しました。
「やったー!」っていう感じです。

でも、URL 欄が赤色になっていて、鍵マークが出ていません。

では、パソコンのブラウザ Google Chrome で同じようにアクセスしてみます。
アクセスできたら、
「Ctrl」+「Shift」+「i」キーを押して、デベロッパーツールを開きます。
すると、下図の様になるので、「Security」タブを開きます。

これを見て分かる通り、証明書が無いという警告ですが、Connection項目では TLS 1.2 となっているので、前々回の記事にあるように、暗号化通信はできているようです。

では、上図の所の「View certificate」をクリックして証明書を見てみます。
「証明のパス」を見ると、下図の様になります。

ということで、ルート証明書がストアに無いとのこと。
これでは、ブラウザに信頼されません。
(信頼される方法は後で説明します)

では、ユーザーサーバーの場合はどのように表示されるんでしょうか?

今度は、予め調べておいたユーザーサーバーのIPアドレスをブラウザの入力欄に入力します。
必ず https:// を入れてください。

https://192.168.0.12

すると、下図のようになりました。

同じように「詳細設定」をタップし、下図の様なところをタップします。

すると下図の様に表示されました!!!

これも感動もんです。

同じ様にパソコンのGoogle Chrome デベロッパーツールを開いて、「Security」タブを見てみると、こうなります。

ルートCAサーバーと同じ状態ですね。
でも、TLS 1.2 で通信できているので、暗号化通信は問題ないようです。

では、「View certificate」をクリックして、証明書を見てみます。

すると、「全般」タブでは、下図の様になっていて、発行先と発行者が異なっています。
これは、発行先がユーザーサーバーを示していて、発行者がルートCAというわけです。

そして、「証明のパス」タブを開くと、下図の様になります。
「証明書の状態」欄がルートCA とは異なりますね。

いずれにしても、これで SSL/TLS 暗号化通信は可能になりましたが、ブラウザに信頼されないと気持悪いです。

次はブラウザの信頼の得方を説明します。

コメント

  1. juchang より:

    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 … とあり、コメントアウトが必要?
    抽象的な説明で申し訳ありません、何かヒントがありましたらご教示の程お願いいたします。

    • mgo-tec mgo-tec より:

      juchangさん

      いつもお試しいただき、ありがとうございます。

      今、新規記事アップのための編集大詰め状態ですので、回答は今しばらくお待ちくださいませ。
      m(_ _)m

      • juchang より:

        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 してやり直すべきか悩んでいます。

        • mgo-tec mgo-tec より:

          juchangさん

          新規記事アップに体力を大幅に消耗していて、なかなか検証できないでいます。
          申し訳ございません。

          まず、最新のツールチェーンは試していないので、20180110を使って下さい。
          記事を書いた当初はそれで動作確認しています。
          最新のツールチェーンはESP-IDFの使い方が変わっている可能性があります。
          ESP-IDFの辛いところは、バージョンアップすると使えなくなる可能性が高いことです。
          Arduino IDE は環境が殆ど変わらないので、うまく動作しない場合は先に進んで、以下の記事
          Arduino – ESP32 で SSLサーバーを構築し、セキュアな Wi-Fi アクセスポイントセレクターを作ってみました
          を試すという手がおススメです。

          また、#basic Constrainsのところは、コメントを外してください。
          そうしないとユーザーサーバーを認識しません。

          以上、試してみて下さい。

          • mgo-tec mgo-tec より:

            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バージョン指定例が書いてありました。
            それに習って、本記事も修正しました。
            以下の様な感じです。

            git clone -b v3.3 --recursive https://github.com/espressif/esp-idf.git

            また、ESP-IDF の menuconfig 設定で、

            make[1]: ディレクトリ ’/home/USER /esp/esp-idf/tools/kconfig’ に入ります

            という表示がない場合は、恐らく、PATHの指定が誤っているものと思われます。
            今一度、この記事の
            「3.MSYS2 の環境設定で ESP-IDF のパスを通すファイルを作成」
            のところを参照して、ご自分のパソコン内のフォルダパスになっているか確認してください。
            (’\’マークと’/’を間違えないようにしてください)

  2. oku より:

    mgoさん
    やっと鍵マークが出てきました。
    MSYS2のインストールがうまく行きませんでした。バージョンを変えてもコンパイルできません。ESP-IDFのコマンドプロンプトでの環境設定やコンパイルはできるのでそちらで行いました。SSLが良くわかり、ありがとうございました。

    • mgo-tec mgo-tec より:

      okuさん

      こんなマニアックな記事をご覧いただき、ありがとうございます。

      この記事は3年近く前のものですが、動いて良かったです。
      確かに、今のESP-IDFのバージョンなら、MSYS2よりもWindowsコマンドプロンプトで実行した方が確実ですね。
      (^^)

タイトルとURLをコピーしました