【月間10万PV達成】ブログの作り方を無料公開中!

NginxでSSL(HTTPS)設定!オレオレ(自己署名)証明書を作成しよう!

NginxのSSL設定(HTTPS)

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

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

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

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

サイトを「HTTPS」で接続できるようにしよう!

SSL化(HTTPS)の目的

通信をSSL化する目的は、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の連携」で作った「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
NginxのインストールNginxとは?インストールや設定ファイルの仕組みを解説【CentOS】

ブラウザからアクセスして確認

自己証明書画面

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

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

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

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

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

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

まとめ:オレオレ証明書は開発用!

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

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

オレオレ証明書は、あくまで開発用や勉強用に使うものと覚えておいてください。

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

独学でもいいですが、Web通信の仕組みなどを体系的に学びたい方は、スクールなどに通ってスキルアップも考えてみましょう。

またね、キツネ(@kitaaaa_kitsune)でした!

【エンジニア講師が比較】プログラミングスクールのおすすめと選び方【エンジニア講師が比較】プログラミングスクールのおすすめと選び方 【Nginx入門】Apacheとの違いやWebサーバ構築について紹介【まとめ】【Nginx入門】自作アプリをWebサーバに構築!Apacheとの違いも紹介!
テキストのコピーはできません。