【リニューアル記念】未経験からブロガーへのSTEPを続々更新!

【NginxのSSL設定】HTTPS通信に自己署名(オレオレ)証明書を使う!

NginxのSSL設定(HTTPS)

今回は、NginxにSSL(HTTPS通信)の設定をして、Webアプリケーションとの通信を安全におこなえるようにします。

RubyでもPHPでも、WebサイトのSSL化はほぼ必須となっているので、必ず設定できるようになりましょう。

SSLの設定には「SSLサーバ証明書」というものが必要になり、本来であれば認証局に登録し、お金を払って取得するものです。

ですが、今回はあくまで勉強用ということで「自己署名証明書(オレオレ証明書)」を使ってお金をかけずに設定することにします。

SSL化(HTTPS)の目的

通信をSSL化する目的は、2つあります。

  1. 通信の暗号化
  2. 通信先の証明

「個人情報が漏れたりしないかな?」

「このサイトって怪しくないかな?」

SSL化することで、このようなユーザーの不安を取り除くことができます。

通信の暗号化(HTTPS通信)をおこなうことで、通信を盗聴している悪質な第三者から情報を守ることができ、接続先のWebサイトが認証局によって認められたサイトだと証明することができます。

とりあえず僕が伝えたいのは、WebサイトのSSL化は「必須だよ」ってことです。

キツネ

実はGoogleもサイトのSSL化を推奨してるんだ!

OpenSSLのインストール

WebサイトのSSL化には「OpenSSL」が必要です。

まずは、OpenSSLがインストールされているかを確認してみましょう。

ちなみに、CentOS7であればOpenSSLはデフォルトでインストールされているはずです。

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」だけ入力し、決まってないのであれば、とりあえずスキップしても構いません。

CSRを作成
$ sudo openssl req -new -key /etc/nginx/ssl/server.key -out /etc/nginx/ssl/server.csr

CRT(SSLサーバ証明書)の作成

本来であれば、さきほどのCSRを認証局に登録して、「CRT(SSLサーバ証明書)」を発行してもらうのですが、今回は「自己署名(オレオレ)証明書」を作ってこのマシン内で完結させます。

CRTを作成
# 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(Puma)とソケット通信で連携させる!」で作った「training_app.conf」という設定ファイルを例にしていますが、別の環境でも基本は同じです。

Nginxの設定ファイルを開き、SSLの設定を追記してください。

Nginxの設定を変更
$ 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を再起動して設定を反映させてください。

Nginxを再起動
$ sudo systemctl restart nginx

ブラウザからアクセス

自己証明書画面

ブラウザからアクセスすると、上のような画面になったと思います。(Chromeの場合)

この画面から「詳細設定」ボタンを押して、「192.168.33.10 にアクセスする(安全ではありません)」のリンクをクリックすれば、Nginxに接続することができます。

ちなみに、画面が怪しいオーラを放ってますが、これはWindowsなどのOSが自己署名証明書を認識できていないための警告なので、今回は気にしなくて大丈夫です。

SSL化して安全に通信できる機能は備わっているのですが、認証局を通していないので、Webサイトの安全性は証明されていないという状態なんです。

証明書をマシンに取込めばエラーは消えますが、開発環境でそこまでやる必要はないので触れません。

キツネ

一般のWebサイトで警告が出ていたら、絶対に入っちゃダメだよ!

まとめ

SSLの設定は、数コマンド実行するだけなので簡単ですね。

ただ、Web上に公開する本番環境などでは、CSRの生成もスキップせずにしっかり入力し、CRTも認証局から取得する必要があります。

自己署名証明書は、あくまで開発用や勉強用に使うものと覚えておきましょう。

また、ここでは触れませんでしたが、HTTPS通信で利用している暗号方式(公開鍵暗号方式や共通鍵暗号方式)についても、しっかりと理解できるようになりましょう。

テキストのコピーはできません。