NginxでSSL通信
前回はVirtualHostを使って1つのサーバーに2つのWebサイトを構築しました。
今日はこのうちの1つ"www.izumii.work"サイトをSSL通信できるようにしてみます。さらにSSL通信している時としていない時の違いを比較してみたいと思います。
環境
さくらのVPSに作ったDebian9(stretch)
SSL
SSLについては以前書いたこちらの記事にまとまっている。
SSL通信を行うにはSSLサーバー証明書が必要なのですが、今回はopensslで作成したオレオレ証明書で代用します。
SSLサーバー証明書を作成
SSLサーバー証明書については以下のサイトが非常にわかりやすく、SSLサーバー証明書とオレオレ証明書の違いについてもよくわかる。
オレオレ証明書を作成する手順もここに書いてある通りで作成できる。
ただ1箇所だけ注意点。
(2) 証明書署名要求(CSR; Certificate Signing Request)の作成」の項目で以下のように書かれている。
コマンドを実行すると対話形式で色々聞かれるが、ここではオレオレ証明書を作る予定なのでデフォルト値を用いてEnter連打で構わない。(ただしCommon Nameのところは、もしFQDNがあるならばそれを入れておいた方が妥当)。
これについてはCommon NameがSSL通信したいWebサイト名と一致していないとうまくいかないといった例もあるようなので入れた方が妥当というよりも必ず入れるようにする。
つまり、"www.izumii.work"に対してSSL通信を行うのであればCommon Nameにも"www.izumii.work"を入れるということになる。
このサイトの(2)の手順までを行えばオレオレ証明書の作成は完了。
SSL証明書についてと作成の注意点を理解した上で「単純にオレオレ証明書だけを作成したいんだ」という場合は以下のコマンドを実行すれば10年間有効の証明書がいつでも作成できる。
$ openssl genrsa 2048 > server.key $ openssl req -new -key server.key > server.csr $ openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt
ここまで行うと以下の3つのファイルが作成されるので、これをetc/ssl
の下へ移動する。ただし「server.csr」は使わないので移動しなくてもOK。
Virtual Hostの設定
VIrtual Hostの設定ファイルにSSLの設定を追記する。
VIrtual Hostの設定ファイル/etc/nginx/sites-available/izumii.work
をsudoコマンドで開いて、
server { listen 80; 〜中略〜 }
の下にもう1つ以下のようなserverディレクティブを追加する。
server { listen 443; server_name www.izumii.work; access_log /home/demo/public_html/izumii.work/log/access.log; error_log /home/demo/public_html/izumii.work/log/error.log; location / { root /home/demo/public_html/izumii.work/public/; index index2.html; } ssl on; ssl_certificate /etc/ssl/server.crt; ssl_certificate_key /etc/ssl/server.key; }
このディレクティブをwww.izumii.work
とizumii.work
の2つ分作成する。この時点でserverディレクティブは4つになっているはず。*1
設定の解説
ざっくりと解説。赤字以外は80番ポート用のサーバー設定と同じである。
本来80番ポートの設定を書いてあるserverディレクティブにまとめて書くことが可能なのだが、今回はSSL通信する時としない時で表示するindex.htmlを明示的に分けたかったので別々に分けて設定を書いている。
最終的に設定ファイルは以下のようになった。
確認
設定ファイルの読み込みを行うため、一旦停止してから起動する。
$ sudo /etc/init.d/nginx stop $ sudo /etc/init.d/nginx start
SSL通信している(https://〜)
Chromeで"https//www.izumii.work"と入力。
オレオレ証明書なのでhttps://になってしまって”保護されていない通信”と出てしまっているが、設定ファイルに記載したssh用のindexページ(index2.html)が表示されていて、SSL通信できていることがわかる。
SSL通信していない(http://〜)
Chromeで"www.izumii.work"と入力。”保護されていない通信”と表示され、SSLではないことがわかる。
これで1つのサーバーに複数のWebサーバーを構築して、SSL通信させる方法までを習得できましたー。
あー疲れた。
参考
プログラミングビギナーNekoteniがあなたに贈る!NginxでSSLの巻 - ねこテニ
nginx連載6回目: nginxの設定、その4 - TLS/SSLの設定 - インフラエンジニアway - Powered by HEARTBEATS
*1:もっと良い書き方があるのかもしれないがとりあえずは良いことにする。