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

ESP32 ( ESP-WROOM-32 )

16.スマホで ESP32 SSLサーバーにアクセスし、信頼されたことを確認する

では、最終段階です。

Android スマホのブラウザGoogle Chrome で、ESP-WROOM-32 開発ボードのユーザーサーバーにアクセスします。
すると、下図の様になると思います。

やったーーー!!!

これで、ようやく信頼ある自己SSL サーバーができました!!!

Google Chrome 特有の緑色鍵マークが表示されました!!!

このローカルIPアドレスで緑色の鍵マークが出るって、かなり感動しますね。
いやぁ~・・・、長かった・・・。

では、パソコンのGoogle Chrome でアクセスして、デベロッパーツールの「Security」タブを開いてみます。

すると、こうなっています。

いぁ~、気持ちイイですね。
全部緑色です。

「valid and trusted」

が最高です!!!

では、証明書を見てみます。

このように、上図の左のように、ルートCA証明書に紐づいた階層のユーザーサーバー証明書があることが分かります。

そして、上図の右のように、「サブジェクト代替名(Subject Alternative Name)」が重要で、このIPアドレスが、実際にアクセスするIPアドレスと同じになっている必要があります。

これで、文句なくブラウザとESP32 とで暗号化通信が可能になります。

因みに、先の動画でも紹介していますが、iPad , iOS 11.2.6 の Safari でも下図の様に信頼を得ることが出来ました!!!

Safari の場合は、グレーの鍵マークでした。

iOS の信頼を得る方法はいずれ記事にしようと思っています。

17.ユーザーサーバーアクセス時のルートCAサーバーのアクセスはどうなっている?

ところで、ルートCA 用サーバーにアクセスしてみると、ブラウザの信頼はどうなるんでしょうか?

実は、こうなりました。

これは当然といえば当然だと思います。

ルート認証局 ( CA )証明書というのは、前回記事でも述べましたが、いわゆる「オレオレ証明書」なのです。

ルート認証局は最上位の証明機関ですので、それ自身を証明する機関がありません。
ですから、それは自分たちで証明するしかなく、自己証明書を発行していることになります。
おそらく、大手認証局業者もそうだと思われます。

ここで、気付かれた方がいるかも知れませんが、実は、ユーザーSSLサーバーは、いちいちルート認証局にアクセスして信頼性を検証しているわけではありません。
ルート CA サーバー用ESP-WROOM-32のログをシリアルモニターで確かめてみると分かると思います。
ユーザーサーバーにアクセスしても、ルートCAサーバーには一切アクセスが無いことが分かると思います。

ということは、ルート認証局 ( CA )証明書はパソコンやスマホにインストールすれば、その時点で信頼されてしまうということです。

今回のこの記事では、ルートCA用サーバーと、ユーザーサーバーの2つ用意して証明書を作ってインストールしましたが、実際はルートCAサーバーを作らなくても、証明書だけ存在すればブラウザの信頼を得ることができます。

つまり、SSL のセキュリティというものは、パソコンに事前にインストールされている証明書があるものと、パソコンユーザーが意図的にインストールしたものが信頼されるということです。

逆に言うと、悪意ある人に意図的に自己証明書をインストールされてしまうと、かなり危険と言えると思います。

もし、インストールを求められたら、証明書の内容を確認して、信頼ある機関に証明されているかどうか、自分でよく確かめる必要がありますね。
今回のSSLサーバー作成で、このことが自分自身よ~く理解できました!!

今後、パソコンやスマホ、ブラウザのセキュリティ更新によって、こういう自己証明書が信頼されなくなるかも知れませんので、更新情報を常にチェックしておくことが重要ですね。

まとめ

どうでしょうか?

電子工作用途マイコンで、Wi-Fi SSLサーバーを作ってみると、公開鍵暗号化方式 ( PKI )や、ルート認証局 ( CA )証明書とサーバー証明書の関係、およびブラウザの信頼の得方などが手に取るように分かって来たと思いませんか?
これは、電気通信分野の資格試験等で、イマイチ理解できない人たちにとって、とっても有効な勉強方法だと個人的に思いました。

そして、ブラウザのURL 欄にローカルIPアドレスで緑色の鍵マークが出るのは感動しますね。
自分みたいな素人でこんなことが出来てしまうと、SSL通信もセキュリティが甘いのではないかと心配してしまうくらいです。

でも、今後のセキュリティ関連の更新によって、自己証明書で信頼されなくなることが予想されますので、その動向を注視していかねばなりませんね。

また、今回は ESP-IDF でコンパイルしましたが、いずれ Arduino IDE でもできるようにしようと模索中です。
セキュアなWebsocket 通信もできるようにしようと思っています。

何度も申し上げておりますが、私は基本的に素人なので、間違い等ありましたらコメント投稿欄等でご連絡いただけると助かります。

ということで、今回もまた膨大な量の記事になってしまい、疲れ果ててしまいました。

ではまた・・・。

コメント

  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をコピーしました