ESP32-WROVER(TTGO Camera)でHTTPS Serverを立ち上げPCとSSL通信をする(開発環境ESP-IDF & Eclipse)
証明書と秘密鍵を作り警告なくブラウザーで表示させる
これにはOpensslを使い、CA証明書とCA秘密鍵を作りこれをPCに登録します。さらにこのCA証明書とCA秘密鍵を使ってサーバー証明書に署名します。このサーバー証明書とサーバー秘密鍵を現状のプロジェクトのデフォルトで入っているファイルと置き換えます。ESP-IDFプロジェクトではサーバー証明書は”cacert.pem”、サーバー秘密鍵は”prvtkey.pem”という名前になっています。
ネタ元はこちらのサイトです。内容については概ね理解したのですが私の方で追記・解説することもあまりないので手順だけ記述しておきます。
CA証明書・CA秘密鍵・サーバー証明書・サーバー秘密鍵の作り方
私はWindows10で開発しているのですが、opensslの記事は概ねLinuxで書かれているのでWSL(Windows Subsystem for Linux)で作業をしていきたいと思います。
PowerShellにWindows用opensslをインストールして作業してもいいかと思います。
WSLには(インストールした記憶がないので)opensslは標準で入っているようです。
左下の検索窓に”WSL”と打ち込んで起動します。
作業用フォルダーを作り(c/users/xxx/caなど)そこにカレントディレクトリを移動。
以下のコマンドを実行。
1 2 3 4 5 |
#CA秘密鍵の作成 openssl genrsa -out ca.key 2048 #CSR(認証局署名リクエスト)作成 openssl req -new -key ca.key -out ca.csr -subj "/C=JP/CN=neocode CA" |
CA証明書属性定義ファイルを作成します。WSL上でやってもいいですし(私はよくわかりません)、Window側から適当なエディターで作成してもいいです。ファイル名をca.extにして以下の記述をします。
1 2 3 4 5 6 |
[ v3_ca ] basicConstraints = critical, CA:true keyUsage = keyCertSign, cRLSign extendedKeyUsage = serverAuth, clientAuth subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer |
最後に自己署名でCA証明書を作成します。
1 |
openssl x509 -req -signkey ca.key -extfile ca.ext -extensions "v3_ca" -in ca.csr -out ca.crt -days 3650 -sha256 |
続いて同じような手順でサーバー証明書を作ります。
以下のコマンドを実行。
1 2 3 4 5 |
# サーバー秘密鍵作成 openssl genrsa -out prvtkey.pem 2048 # サーバーCSR(認証局署名リクエスト)作成 openssl req -new -key prvtkey.pem -out server.csr -subj "/CN=www.hogehoge.com" |
ESP-IDFプロジェクトではサーバー秘密鍵のファイル名はprvtkey.pemなのでその名前で作成しています。
続いてCA証明書と同様にサーバー証明書属性定義ファイル”server.ext”を作成します。
1 2 3 4 5 6 7 |
[ v3_server ] basicConstraints = critical, CA:false keyUsage = digitalSignature, keyEncipherment extendedKeyUsage = serverAuth, clientAuth subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer subjectAltName = IP:192.168.1.15,192.168.4.1 |
subjectAltNameにサーバーのIPアドレス/DNS名などを入れます。私の環境の場合は192.168.1.15なのでそのように記述しています。もし複数登録するときは”,”(カンマ)で区切り記述します。
1 |
openssl x509 -req -CAkey ca.key -CA ca.crt -CAcreateserial -extfile server.ext -extensions "v3_server" -in server.csr -out cacert.pem -days 365 -sha256 |
最後にCA証明書で署名したサーバー証明書を作成します。
ESP-IDFプロジェクトではサーバー証明書のファイル名はcacert.pemなのでその名前で作成しています。
これでCA証明書、サーバー秘密鍵、サーバー証明書が出来ました。
サーバー秘密鍵(prvtkey.pem)とサーバー証明書(cacert.pem)を先に作ったプロジェクトのmain/certs下のファイルと置き換えます。そして再度build/flashします。
CA証明書はルート証明機関に登録します。
“ユーザー証明書の管理”と入力して”certmgr[証明書]”を起動します。
「信頼されたルート証明書期間」を右クリックして「すべてのタスク」→「インポート」をクリックします。
“証明書のインポート ウィザード”ウィンドウが表示されます。以下、次へを押していき、途中先ほど作成した”ca.crt”を指定して完了させます。
セキュリティ警告が出ますが、「はい」を押して完了させます。
これで作ったCA証明書が登録されました。
これでさきほど警告が出たhttps://192.168.1.15にアクセスしても警告も出なくなり鍵マークが施錠された絵になりました。
ESP-IDFプロジェクトはGitHubにあります。
このプロジェクトを元にしてmDNS追加、PCアプリからの通信、APモード対応、をやっていきます。