前書き
作成したWebAppをオンプレ環境でSSL化対応する必要があったので備忘記録
必要なもの
- mkcert
- openssl
- nginx
- https 化したいアプリ
openssl と nginx の入手方法は割愛
やることの概要
- mkcert により ca 証明書を作成する
- mkcert によりサーバー証明書を作成する(ca 証明書の秘密鍵で作成)
- リバースプロキシとして nginx を用意し、サーバー証明書を設定する
- クライアントに ca 証明書をインストールして、サーバー証明書が信頼されるようにする
目次
1. mkcert の入手
2. mkcert によるサーバー用証明書の作成
3. nginx の設定
4. CA 証明書の作成と配布
1. mkcert の入手
以下で入手可能
https://github.com/FiloSottile/mkcert
開いたら Release の最新版を導入でよいと思います
ダウンロードした exe をmkcert.exe
にリネームしとくと使いやすいです
(しないと警告出る?かも?)
2. mkcert によるサーバー用証明書の作成
以下のコマンドで自分自身の証明書をつくれます
./mkcert.exe localhost {自分のIP}
これにより、localhost+2.pem
とlocalhost+2-key.pem
ができます
(ファイル名は指定するホスト数などで変動します)
3. nginx の設定
.pem と-key.pem のコピー
mkcert によるサーバー用証明書の作成
で作成した*.pem
と*-key.pem
を nginx のインストールしたフォルダを pwd として以下にコピーします
./conf/ssl
nginx.conf の設定
インストールしたフォルダを pwd として、以下に設定ファイルがあります
./conf/nginx.conf
開いたら以下のように設定
http {
server {
# httpsで待機
listen 0.0.0.0:443 ssl;
server_name localhost;
# CA証明書へのパス
ssl_certificate "{絶対パス}/conf/ssl/localhost+2.pem";
ssl_certificate_key "{絶対パス}/conf/ssl/localhost+2-key.pem";
# クライアントへの転送設定
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# サーバーへの転送設定
location /api {
proxy_pass http://localhost:5071;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
上記までやって./nginx.exe
を実行するとサーバーが起動します
(アプリサーバーの起動を忘れずに)
ついでに./nginx.exe -s reload
で conf ファイルを読み込みなおせます
4. CA 証明書の作成と配布
CA 局証明書について
以下のコマンドを実行すると CA 局としての証明書があるパスを得られます
./mkcert.exe -CAROOT
手順2によって生成した証明書は CA 局としてサーバーに発行する証明書で、
上記コマンドでアクセスできるフォルダ内の証明書は CA 局自体の証明書
クライアントには CA 局自体の証明書を配ってルート証明書として信頼すると、
CA 局としてサーバーに発行した証明書が信頼されるようになります
CA 局証明書を クライアント 向けに変換
./mkcert.exe -CAROOT
を pwd として以下を実行すると der ファイルを作成可能
openssl x509 -outform der -in rootCA.pem -out rootCA.der
上記で生成したrootCA.der
を nginx のインストールフォルダを pwd として以下フォルダに配置します
./html
これでindex.html
などでリンクを指定すると配布が可能になります
クライアントごとにインストールしてもらうとこれでhttps通信が可能になりますね💯