今回は、NginxにSSL(HTTPS通信)の設定をして、Webアプリケーションとの通信を安全におこなえるようにします。
RubyでもPHPでも、WebサイトのSSL化(HTTPS)はほぼ必須となっているので、必ず設定できるようになりましょう。
SSLの設定には「SSLサーバ証明書」というものが必要になり、本来であれば認証局に登録し、お金を払って取得するものです。
ですが、今回はあくまで勉強用ということで「自己署名証明書(オレオレ証明書)」を使って、お金をかけずに設定することにします。
もくじ
SSL化(HTTPS)の目的
通信をSSL化する目的は、2つあります。
- 通信の暗号化
- 通信先の証明
「個人情報が漏れたりしないかな?」
「このサイトって怪しくないかな?」
SSL化することで、このようなユーザーの不安を取り除くことができます。
通信の暗号化(HTTPS通信)をおこなうことで、通信を盗聴している悪質な第三者から情報を守ることができ、接続先のWebサイトが認証局によって認められたサイトだと証明することができます。
とりあえず僕が伝えたいのは、WebサイトのSSL化は「必須だよ」ってことです。
OpenSSLのインストール
WebサイトのSSL化には「OpenSSL」が必要です。
まずは、OpenSSLがインストールされているかを確認してみましょう。
ちなみに、CentOS7であればOpenSSLはデフォルトでインストールされているはずです。
# opensslのバージョンを確認
$ openssl version
OpenSSL 1.0.2k-fips 26 Jan 2017
# バージョンが表示されなければインストール
$ sudo yum install -y openssl
鍵生成用のディレクトリ作成
これから作成する「秘密鍵」や「証明書」などを配置するためのディレクトリを作ります。
ディレクトリ名や場所に決まりはありませんが、ここではわかりやすく「nginx」ディレクトリの下に「ssl」ディレクトリを作ることにします。
$ sudo mkdir /etc/nginx/ssl
秘密鍵の作成
まずは秘密鍵を作成し、さきほどのディレクトリに配置します。
$ sudo openssl genrsa -out /etc/nginx/ssl/server.key 2048
CSR(証明書署名要求)の作成
次に、さきほどの秘密鍵から「CSR(証明書署名要求)」を作成します。
国コードや住所、会社名などを入力するよう求められますが、自己署名証明書であれば不要なので、何も入力せずに「Enter」でスキップします。
もし、ドメインが決まっているなら「Common Name」だけ入力し、決まってないのであれば、とりあえずスキップしても構いません。
$ sudo openssl req -new -key /etc/nginx/ssl/server.key -out /etc/nginx/ssl/server.csr
CRT(SSLサーバ証明書)の作成
本来であれば、さきほどのCSRを認証局に登録して、「CRT(SSLサーバ証明書)」を発行してもらうのですが、今回は「オレオレ(自己署名)証明書」を作ってこのマシン内で完結させます。
# CRT(有効期限10年)を作成
$ sudo openssl x509 -days 3650 -req -signkey /etc/nginx/ssl/server.key -in /etc/nginx/ssl/server.csr -out /etc/nginx/ssl/server.crt
# CRTが生成されたことを確認
$ ls -l /etc/nginx/ssl/
total 12
-rw-r--r-- 1 root root 1168 Apr 26 06:30 server.crt
-rw-r--r-- 1 root root 985 Apr 26 06:29 server.csr
-rw-r--r-- 1 root root 1675 Apr 26 05:57 server.key
Nginxにオレオレ(自己署名)証明書を設定
さきほど作ったオレオレ(自己署名)証明書である「server.crt」と、秘密鍵である「server.key」をNginxに設定します。
ここでは、「NginxとRailsの連携」で作った「training_app.conf」という設定ファイルを例にしていますが、別の環境でも基本は同じです。
Nginxの設定ファイルを開き、SSLの設定を追記してください。
$ sudo vi /etc/nginx/conf.d/training_app.conf
server {
# 443番ポートを許可し、SSL機能をON
# listen 80;
listen 443 ssl;
# 証明書を設定
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
:
:
}
Nginxの設定ファイルを修正したら、Nginxを再起動して設定を反映させましょう。
$ sudo systemctl restart nginx

ブラウザからアクセスして確認
ブラウザからアクセスすると、上のような画面になったと思います。(Chromeの場合)
この画面から「詳細設定」ボタンを押して、「192.168.33.10 にアクセスする(安全ではありません)」のリンクをクリックすれば、Nginxに接続することができます。
ちなみに、画面が怪しいオーラを放ってますが、これはWindowsなどのOSが自己署名証明書を認識できていないための警告なので、今回は気にしなくて大丈夫です。
SSL化して安全に通信できる機能は備わっているのですが、認証局を通していないので、Webサイトの安全性は証明されていないという状態なんです。
証明書をマシンに取込めばエラーは消えますが、開発環境でそこまでやる必要はないので触れません。
まとめ:オレオレ証明書は開発用!
SSL(HTTPS)の設定は、数コマンド実行するだけなので簡単ですね。
ただ、Web上に公開する本番環境などでは、CSRの生成もスキップせずにしっかり入力し、CRTも認証局から取得する必要があります。
オレオレ証明書は、あくまで開発用や勉強用に使うものと覚えておいてください。
また、ここでは触れませんでしたが、HTTPS通信で利用している暗号方式(公開鍵暗号方式や共通鍵暗号方式)についても、しっかりと理解する必要があります。
独学でもいいですが、Web通信の仕組みなどを体系的に学びたい方は、スクールなどに通ってスキルアップも考えてみましょう。
またね、キツネ(@kitaaaa_kitsune)でした!

