いづいづブログ

アジャイルコーチになりたい札幌在住SEです。アジャイル札幌スタッフ&ScrumFestSapporo実行委員。Like:パクチー/激辛/牡蠣/猫/初期仏教

NginxでSSL通信

f:id:izumii-19:20190428123747p:plain:w300

前回はVirtualHostを使って1つのサーバーに2つのWebサイトを構築しました。

今日はこのうちの1つ"www.izumii.work"サイトをSSL通信できるようにしてみます。さらにSSL通信している時としていない時の違いを比較してみたいと思います。

環境

さくらのVPSに作ったDebian9(stretch)

SSL

SSLについては以前書いたこちらの記事にまとまっている。

izumii19.hatenablog.com

SSL通信を行うにはSSLサーバー証明書が必要なのですが、今回はopensslで作成したオレオレ証明書で代用します。

SSLサーバー証明書を作成

SSLサーバー証明書については以下のサイトが非常にわかりやすく、SSLサーバー証明書オレオレ証明書の違いについてもよくわかる。

オレオレ証明書を作成する手順もここに書いてある通りで作成できる。

ozuma.hatenablog.jp

ただ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。

  1. 秘密鍵 (Private Key):server.key
  2. 証明書署名要求 (CSR):server.csr ←使用しない
  3. サーバ証明書(CRT):server.crt

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.workizumii.workの2つ分作成する。この時点でserverディレクティブは4つになっているはず。*1

設定の解説

ざっくりと解説。赤字以外は80番ポート用のサーバー設定と同じである。

  • サーバー設定
    • izumii.workへの接続は443番ポートを使用
    • サーバー名はwww.izumii.work
    • アクセスログの保存先
    • エラーログの保存先
    • rootファイルのありか
    • 表示するindexファイルはindex2.html
    • ssl通信をおこなう
    • サーバー証明書
    • 秘密鍵

本来80番ポートの設定を書いてあるserverディレクティブにまとめて書くことが可能なのだが、今回はSSL通信する時としない時で表示するindex.htmlを明示的に分けたかったので別々に分けて設定を書いている。

最終的に設定ファイルは以下のようになった。

f:id:izumii-19:20190501005604p:plain
/etc/nginx/sites-available/izumii.work

確認

設定ファイルの読み込みを行うため、一旦停止してから起動する。

$ 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通信できていることがわかる。

f:id:izumii-19:20190429160645p:plain
ssl通信している

SSL通信していない(http://〜)

Chromeで"www.izumii.work"と入力。”保護されていない通信”と表示され、SSLではないことがわかる。

f:id:izumii-19:20190429160425p:plain
ssl通信していない

これで1つのサーバーに複数のWebサーバーを構築して、SSL通信させる方法までを習得できましたー。

あー疲れた。

参考

プログラミングビギナーNekoteniがあなたに贈る!NginxでSSLの巻 - ねこテニ

nginx連載6回目: nginxの設定、その4 - TLS/SSLの設定 - インフラエンジニアway - Powered by HEARTBEATS

*1:もっと良い書き方があるのかもしれないがとりあえずは良いことにする。