自分でCA証明書とサーバ鍵のセットを作成する(webuiでhttpsを有効化するには(その2))
以下、個人的にはこちらの記述が非常に分かりやすく、結果としてこの記述に助けられたので、参照しながら記載します。
作成についてはsmpdのインストールされたRaspberryPi上で実施します。
root ユーザでも良いので ssh ログイン後、ホームディクトリ内に ”cert” でも何でも良いのでディレクトリを作成してその中でコマンドをを入れてください。
・CA証明書を作成する
(1)CA証明書で使用する秘密鍵を生成
openssl genrsa -aes256 -out localCA.key 2048
パラメータ + オプションを解説すると、
genrsa: RSAによる秘密鍵生成
-aes256: 秘密鍵をaes256ビットでの暗号化(パスワード付き)
-out ファイル名: 指定ファイル名で出力
数字: キーのビット数(2048ビット)
このときの秘密鍵は暗号化されているため、この後で使用するたびにopensslのアプリから問い合わせを受けます。
(2)生成した秘密鍵と識別情報を指定してCSR (certificate signing request 証明書署名要求) を生成
openssl req -out localCA.csr -key localCA.key -new
識別情報は以下の通りでOKでしょう。
Country Name:jp
State or Province Name:Tokyo
Locality Name: 空欄でOK
Organization Name: Papalius
(ここはsmpd作者のパパリウス様に敬意を込めてこのようにしましたが、実際にはサイト例の通り John Doe のような匿名でも良いです)
Organizational Unit Name:空欄でOK
Common Name:Papalius
(ここはサイト例の通り Organization Name と合わせています)
Email Address:[email protected]
(smpd のサポートサイトにしましたが、ここも実際には適当に入れてもOKです)
A challenge password:空欄でOK
An optional company name:空欄でOK
パラメータ・オプションの解説は以下の通り
req: CSRの作成要求
-key: 使用する秘密鍵の指定
-new: 新規作成
作成したCSRの中身を確認する際、以下の通りコマンドを入れてください(サイトの例のように表示されればOK)。
openssl req -text -noout in localCA.csr
(3)CA証明書を作成(CSRを秘密鍵で自己署名)
ここでのポイントは -days オプションの数字です。
LAN上でsmpdでしか使わない CA証明書ですから、なるべく長めというわけで、5110日に指定しました(2036年まで有効化)。
セキュリティ的に怖い場合は、短くしても良いでしょう(ただし 証明書の有効年度がすぎると再度インストールが必要)。
openssl x509 -req -days 5110 -signkey localCA.key -in localCA.csr -out localCA.crt -extfile rootca_v3.ext
パラメータ・オプションの解説は以下の通り
x509: x509形式でCA証明書作成
-signkey: サインキーを指定する
-in: CSRファイルを指定
-out: 出力ファイルを指定
-extfile: openssl に渡すパラメータファイルを指定
smpdの標準イメージの場合、openssl のパラメータファイルは /etc/ssl/openssl.cnf を使用しますが、実際には以下の記述でCA証明書専用パラメータファイルを作っておいたほうが私は良いと思います。
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
basicConstraints=critical,CA:true
keyUsage = cRLSign, keyCertSign
nsCertType = sslCA, emailCA
簡単に言うと、ルート証明書での設定のポイントは basicConstraints と keyUsare で、
正確にはこのように記載がないとNGとなります。
作成後の証明書の中身を確認する場合は、以下のコマンドになります。(2項のコマンドに似ているが、頭のパラメータにx509と付いている。これは、証明書の初期がx509であるためになります。)
openssl x509 -text -noout -in localCA.crt
これで localCA.crt という名称でCA証明書が生成されました。
(4)Android向けのバイナリ証明書を生成する。
Androidの場合、バイナリ証明書を生成しないとインストールできません。
これは作成済みのlocalCA.crtをder形式に変換しlocalCA.der.crtファイルに出力するというコマンドになります。
openssl x509 -in localCA.crt -out localCA.der.crt -outform der
・サーバ証明書を作成する
次は実際にサーバで使用する証明書を作成していきます。
(1)サーバ用の秘密鍵を生成
CA証明書の秘密鍵とほぼ同じなので、説明は省略
openssl genrsa -out smpd.local.key 2048
ここで仮に -aes256 を指定した場合、以下のコマンドで復号したものを使用しないと
サーバ証明書として ympd に読み込ませた場合に ympd 側でエラーが発生します。
(パスフレーズが指定されていないため使えない)
一応消し込みのコマンドは以下の通り
mv smpd.local.key smpd.local.encrypted.key
openssl rsa -n smpd.local.encrypted.key -out smpd.local.key
(2)サーバ用の秘密鍵と識別情報からCSRを生成
openssl req -out smpd.local.csr -key smpd.local.key -new
識別情報はCA証明書と少し異なります(具体的にはCommon Name に ”smpd.local” が入る)。
Country Name: jp
State or Province Name: Tokyo
Locality Name:空欄でOK
Organization Name:Papalius
Organizational Unit Name:空欄でOK
Common Name: smpd.local
Email Address:Address:[email protected]
A challenge password:空欄でOK
An optional company name:空欄でOK
(3)サーバ証明書作成のためのパラメータファイルを作成
以下の記述でsmpd.local.csxファイルを作成します。
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = DNS:smpd.local, IP:192.168.11.162, DNS:app, DNS:app.local
extendedKeyUsage = serverAuth
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid, issuer
subjectAltName は俗にSANと言われるもので、サーバ証明書でDNSやIP指定した場合にどのURLで参照されたかを指定するものです。つまり、固定IP運用の場合はIP:以降に自分のsmpdのIPアドレスを入力する必要があります。
(4)CSR+SAN+CA秘密鍵+CA証明書でサーバ証明書を作成
openssl x509 -req -days 395 -CA localCA.crt -CAkey localCA.key -CAcreateserial -in smpd.local.csr -extfile smpd.local.csx -out smpd.local.crt
生成するのはCA証明書と同じくx509形式のため、内容確認コマンドも同一のため省略します。
ここでの注意は現在の最新環境だとサーバ証明書の有効期限が13ヶ月以内でないと正常に動かない環境があるということです(具体的にはipadがそうでした)。
(5)ympd 向けにサーバ秘密鍵とサーバ証明書を1ファイル化
cat smpd.local.key smpd.local.crt > smpd.local.pem
2つのファイルを標準出力に流し、それをファイルにリダイレクト化してテキスト保存するということです。