11.ルート認証局の署名付きサーバー証明書の生成
では、いよいよルート認証局 ( CA )の署名が付いたユーザーサーバー証明書を生成します。
以下のコマンドを入力してください。
openssl ca -days 36500 -config openssl_server.cfg -policy policy_anything -keyfile esp32_ca.key -cert esp32_ca.crt -in esp32_server.csr -out esp32_server.crt
【コマンド解説】
● ca
ここが重要です。req ではなく、ca というところが注意です。
認証局の署名付き証明書を生成するというコマンドです。
● -config
ここで、ユーザーサーバー用環境設定cfgファイルを指定しています。
● -policy
policy_anything と指定すると、ルートCA とサーバー Subject の地域や組織名が一致しなくても良い設定になります。
環境設定cfgファイル中にデフォルトで、policy_match となっているので、ここで変更しています。
これをやらないと、ルートCAとサーバーで地域や組織名がマッチしていないというエラーが出ます。
コマンドで指定しなくても、cfgファイルを書き替えても良いと思います。
● -keyfile
サーバー用秘密鍵ファイルを指定。
● -cert
ルート認証局 ( CA )証明書ファイルを指定。
先ほど生成した、esp32_ca.crt
● -in
証明書署名要求 ( CSR )ファイル名を指定。
先ほど生成した、esp32_server.csr
● -out
署名付きユーザーサーバー証明書ファイル名を指定。
ここでは、esp32_server.crt という名前にしています。
では、入力した結果を下図に示します。
Sign the certificate?
となるので、y を入力してエンターしてください。
そして、
out of 1 certificate reuests certified, commit?
となるので、y を入力してエンターしてください。
上図のように、
Subject Alternative Name (サブジェクト代替名)と、commonName ( CN )と、実際のサーバーアドレス(または DNSサーバーネーム)が一致していないとダメです。
ブラウザ Google Chrome の場合、バージョン58以降では、サーバーのアドレス(またはDNSネーム)と、この Subject Alternative Name (略: SAN )を照合しているとのことです。
これがマッチしないと、ブラウザから信頼されませんのでご注意ください。
これで秘密鍵と証明書関係は全て出力できました。
以後必要なファイルは以下です。
● esp32_ca.crt : 自己ルート認証局 ( CA )証明書
● esp32_ca.key : 自己ルート認証局 ( CA )秘密鍵
● esp32_server.crt : ユーザーサーバー証明書(CA署名付き)
● esp32_server.key : ユーザーサーバー秘密鍵
なお、証明書署名要求 ( CSR )ファイルは証明書が発行済みの場合は、以後不要です。
エクスプローラーでファイル一覧を見ると、以下の様になります。
では、ユーザーサーバー証明書を見てみましょう。
esp32_server.crt ファイルをテキストエディタで見てみると、下図の様になります。
これは X509様式のテキスト形式証明書ですね。
●Version:
X509様式のバージョンです。現在は V3
●Serial Number:
先に作成した serial ファイルに記録されている通し番号。
証明書を一回発行したので、serialファイルには 01 とカウントアップされて記録されている。
●Issuer:
ルート認証局 ( CA )用のデータで、-policy オプションでマッチ不要にしているので、サーバーデータと異なっていても問題無しです。
●Validity:
証明書の有効期限
●Subject:
証明される側、つまりユーザーサーバー所有者データ。
ここで、CN と、Subject Alternative Name のアドレスが一致していることを確認してください。
●Public-key:
公開鍵データ
●Subject Alternative Name:
ユーザーサーバー所有者の代替名(IPアドレスまたはDNSネーム)
●X509v3 Basic Constraints:
サーバーがCAかどうかの判別。FALSE としているので、CAではない。
●Subject Key Identifier:
ユーザーサーバーの公開鍵識別子。具体的な用途はネットで検索してみてください。
●Authority Key Identifier:
ルート認証局 ( CA )の公開鍵識別子。
●Signature Algorithm:
ルート認証局 ( CA )によるデジタル署名。
では次に、ルート認証局 ( CA )の証明書
esp32_ca.crt
をテキストエディタで見てみると、下図の様になります。
これは、X509形式の証明書全体をバイナリ化して、Base64 エンコードしたものです。
それが前回記事でも取り上げた、 PEM形式 というものです。
—BEGIN で始まっていればBase64 エンコードされた PEM形式と思って良いと思います。
同様に秘密鍵もテキストエディタで見ることができます。
同じように—BEGIN で始まっていて、これは秘密鍵をBase64 エンコードしたものです。
これを見ると分かるように、PEM形式にした方が、明らかに情報量がコンパクトですね。
実は、ESP32 ( ESP-WROOM-32 )の開発環境、ESP-IDF のサンプルコードでは、証明書をPEM形式にしなければなりませんので、
次では、esp32_server.crt ファイルをPEM形式に変換する方法を説明します。
12.CRT証明書をPEM形式に変換する
では、ユーザーサーバー証明書 esp32_server.crt ファイルをPEM形式に変換したいと思います。
まず、以下のコマンドを入力してください。
openssl x509 -in esp32_server.crt -out tmp.der -outform DER
これは、X509形式ファイルを tmp.der というバイナリ形式ファイルに変換出力するという命令です。
すると、下図の様になります。
コマンドラインには特に何も表示されませんが、フォルダには tmp.der というファイルが作成されているはずです。
では、今度はこのバイナリファイルをPEM形式に変換するコマンドを入力します。
openssl x509 -in tmp.der -inform DER -out cacert.pem -outform pem
ここでは、出力されるPEM形式ファイルのファイル名を
cacert.pem
としています。
これは、ESP32 開発環境 ESP-IDF サンプルコードで記述されているファイル名なので、そうしています。
すると、MyDataフォルダには下図の様に、cacert.pem ファイルが生成されているのが分かると思います。
では、これをテキストエディタで開いてみると、こんな感じになります。
しっかりPEM形式に変換されていますね。
CRTファイルだと130行くらいあったものが、36行でコンパクトに収まっています。
ということで、ESP32 の ESP-IDF サンプルコードでは、このファイルを使いますので、覚えておいてください。
13.トラブルシューティング
証明書発行を失敗して、再度同じデータで発行しようとすると、以下のようなエラーメッセージが出る場合があります。
failed to update database TXT_DB error number 2
その場合は、index.txt データ中身を削除して、改行もすべて無い、空のファイルにして上書きしてください。
そうすると、正常に発行できるようになります。
また、その他でもうまく発行できない場合は、フォルダやファイルなどを全て最初の真っ新に戻してやり直すと、大抵は発行できるようになります。
14.参考にさせていただいたサイト
●オレだよオレオレ認証局で証明書つくる
●Chrome58で、HTTPSの自己証明書が NET::ERR_CERT_COMMON_NAME_INVALID になる場合の対応
●Chrome58以降でハネられないSHA-2でオレオレ認証局署名のあるオレオレ証明書
編集後記
以上、今回は OpenSSL の証明書発行および秘密鍵生成方法を自分なりの備忘録として書いてみました。
今回から OpenSSL を初めて使ってみましたが、なかなか理解するのに苦労しました。
でも、一回理解してしまうと、後はスラスラと作業できるようになりました。
この件に関して分からないことがあって、私自身に問合せされても、素人ですので正直言って分かりません。
ネットで調べて解決していただければと思います。
ということで、今回はここまでで、次回ではこの証明書を使って、ESP32 SSL サーバーを構築してみたいと思います。
ではまた・・・。
コメント
お久しぶりです。HALです。
自宅のWEBサーバーでWPAを動かすためにSSL対応する必要があり、
こちらの記事を参考にさせて頂きました。
とても詳しく説明して頂いたお蔭で、無事に対応が出来ました。
ありがとうございます。
最初は簡単そうなApachなどの別サイト記事をいくつか試してみたのですが全敗しました。
いやー、これは凄いですね。実際に試して感動しました。
Chromeの最新版に対応できるのが、とてもありがたいです。
自力では絶対に無理でした。
対価として支援させていただきます。
¥—–
ギフト券番号:
—————
有効期限
————-
(ブログを全面修復して、過去のコメントが消えてしまいました。
以下、1/24時点のコメントを再投稿します。)
HAL さん
ご無沙汰しております。
そして、かなり高額なご支援、ありがとうございます。
とーってもウレシイです!!!
そういえば、メール一切無しのご支援方法って、やっぱり斬新ですね。
以前、コメント投稿でご支援いただきましたが、一瞬、メールを探してしまいました。
本当に感謝しかありません。
m(_ _)m
ところで、あまり人気の無かったこの記事でお役に立てて、感無量でございます。
この記事は結構苦労したんですよね。
これは、実際に SSL 化した時の達成感はかなりありますよね。
やった人でないと分からないと思います。
HALさんにわかって頂けて、何よりです。
報われた感があって、とっても嬉しいですね。
最近は、忙しくてなかなか新たな工作ができませんが、おかげでがんばれそうな気がしました。
ホントにありがとうございました。
m(_ _)m
mgo-tec 様
今回も教えを乞うこととなりました(スミマセン)。
OpenSSL のバージョン確認のところまではスムーズにいったのですが、OpenSSL ディレクトリへ移行しようとすると、
「ファイル名、ディレクトリ名またはボリュームラベルの構文が間違っています」
となり先へ進めません。
テキストと違う点:
1.Dドライブが無いため、ディレクトリの保管場所をCドライブとしています。
外置きのハードディスク(Eドライブ)でも試してみましたが同様。
2.OpenSSL のバージョンは、1_0_2s となっています。
3.OpenSSL のインストールで、「 Select Start Menu Foruder 」の項目が出ません。
手書きでフォルダー名を、OpenSSL-Win64 → OpenSSL としても同様。
毎回お手数をお掛けします、アドバイスの程お願いいたします。
juchangさん
いつも記事を試していただき、ありがとうございます。
私はOpenSSLを最近全く使っておらず、ver 1.0.2sになっているとは知りませんでした。
バージョンが異なっていると、当然この記事とは異なると思います。
まず、気になるのが、コマンドが正確に入力されているかどうかです。
juchangさんがコマンドプロンプトで打ち込んだテキストが全て半角入力で、記号は合っていますでしょうか?
今一度ご確認ください。
「ファイル名、ディレクトリ名またはボリュームラベルの構文が間違っています」
というようにコマンドラインに表示されたということは、コマンド入力方法が間違えています。
cdコマンドはChange Directryの略です。
cdコマンドの使い方が分らない場合、ネットに情報が沢山ありますので調べてみて下さい。
因みに、
と入力するとヘルプが見られます。
あと、OpenSSLのインストールに関しての不具合は、私には解り兼ねますので、OpenSSLの方に直に問い合わせて頂くようにお願いいたします。
(英語対応でいつ返事が来るか分かりませんが・・・)
また、3番の質問は気にしなくて良いと思います。
スタートメニューには普通にインストールされていると思われますし、機能には影響無いと思います。
mgo-tec 様
今回も単純なミスでした。
cd /? で検索してみると、私の場合は C ドライブに保管しているので、
cd \OpenSSL-Win64
でいいことが解り、先ほど本テキストの処理を完成することができました。
これで ESP32 SSL サーバーの構築へ進めます。
今後ともご指導の程よろしくお願い致します。
やはり、そういうことでしたか・・・。
コマンドプロンプトのエラーは入力ミスのことが多いので、それをまず疑ってかかると良いと思います。