CloudflareのSSL証明書をNginxに入れる方法

Bicepper

こんにちは!Bicepperです。

CloudflareのSSL証明書を、UbuntuにインストールしたNginxに入れる方法を紹介します!

なお、今回使っているVPSのFlaunt7の登録方法などはこちらの記事で書いていますので、Flaunt7に興味がある方はぜひ読んでみてください。
【海外VPS】Flaunt7の登録からSSH接続する方法までを解説【海外VPS】Flaunt7の登録からSSH接続する方法までを解説

CloudflareのSSL証明書を発行する

まずはCloudflareのSSL証明書を発行します。

すでにCloudflareにドメインが登録されている前提の話ですので、まだ登録が完了していな方は、こちらを参考に登録してみてください。

NginxとCloudflareを入れてWebサイトをドメインで表示

Cloudflareの管理画面のメニューから、「SSL/TLS」をクリックします。

画面をスクロールしていくと、中盤に「Origin Certificates」という項目があるので、右にある「Create Certificate」をクリックします。

ここで何か触ることは基本ありません。
一番上の「Let CloudFlare generate a private key and CSR」にチェックが入っていること、発行する対象のドメインが正しいことを確認できたら、一番下にある「Next」をクリックします。

次の画面で証明書と鍵の2つが発行されますので、確認ができたら1回このままにしておきます。

証明書と鍵をUbuntuに格納する

先ほど発行した証明書と鍵を、Ubuntuに格納します。

Ubuntuにはデフォルトで、証明書を格納する/etc/ssl/certsディレクトリと、鍵を格納する/etc/ssl/privateディレクトリが用意されています。

まずは証明書を格納するために、新しくファイルを作成し、中に先ほど発行した証明書(Origin Certificate)の中身を丸々コピペします。

$ sudo vi /etc/ssl/certs/cert.pem

同様に、鍵を格納するファイルを作成し、中に先ほど発行した鍵(Private Key)の中身を丸々コピペします。

$ sudo vi /etc/ssl/private/key.pem

格納が完了したら、Nginxの設定ファイルを変更します。

「hogehoge.com」というドメインで作ると仮定し、以下のように書き込みます。

/etc/nginx/sites-available/hogehoge

upstream app_server1 {
        server 127.0.0.1:8000 fail_timeout=0;
}

server {
        listen 80;
        listen [::]:80;
        server_name hogehoge.com www.hogehoge.com;
        return 302 https://$server_name$request_uri;
}

server {
        # SSL configuration
        server_name hogehoge.com www.hogehoge.com;
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        ssl        on;
        ssl_certificate         /etc/ssl/certs/cert.pem;
        ssl_certificate_key     /etc/ssl/private/key.pem;
        ssl_protocols                TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers                  'ECDH !aNULL !eNULL !SSLv2 !SSLv3';
        ssl_prefer_server_ciphers    on;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_connect_timeout 160s;
        proxy_read_timeout 300s;
        proxy_send_timeout 160s;

        location / {
                proxy_pass http://app_server1;
        }
        location /static {
                alias /var/www/static;
        }

}

Djangoのフレームワークを使っているため、他のフレームワークなどでは不要な箇所もあるかもしれませんが、概ねこのような形になると思います。

保存が完了したら、一度Nginxのテストをしておきます。

$ sudo nginx -t

==================
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

「successful」と出れば、Nginxの記述は問題ないので、設定ファイルの内容を反映するためにNginxを再起動します。

$ sudo systemctl restart nginx

また、もしUbuntuにファイアーウォールを導入しているのであれは、SSL用のポートも開放しておく必要がありますので、以下のように設定しておきます。

$ ufw allow 443

CloudflareでSSLの影響範囲を変更する

再びCloudflareに戻り、「OK」ボタンをクリックして、証明書と鍵のウィンドウを閉じます。

上にスクロールしていき、「SSL」という項目の右側にあるプルダウンを、「Flexible」から「Full」に変更します。
これで、CloudflareとNginxサーバー間の通信を全て暗号化することになります。

あとは実際にWebサイトに戻り、https://hogehoge.comで見られるようになっていれば完成です!