NginxをSSL/TTS対応するのが意外に簡単だった

こんにちは、かず猫です。

今回は、サイトを丸ごとhttpsにできたときのお話です。思ってたよりも2倍くらい楽ちんでした。事前に調べてたのもありますが、実作業時間30分かかってないです。

(環境: CentOS7+Nginx)

 

SSL/TTSって?

URLの最初にhttps://example.comとか表示されるアレです。サーバーとブラウザ間の通信を暗号化して、安全にやり取りしようね!って言う仕組みです。暗号化されてないと、http://example.comって表示されます。

少し前までは個人情報とかが含まれる一部のページのみ暗号化すればいいよね!っていう風潮だったらしいんですが、最近は全部暗号化したほうがいいっぽい。Googleもそう言ってた。というか、暗号化しないとChromeに「このサイトは安全じゃないよ」って言われちゃったりもするらしい。怖い。

※httpに警告するよっていうGoogle Security Blog(英語)
https://security.googleblog.com/2017/04/next-steps-toward-more-connection.html

 

導入したほうがいいのは知ってたけど、どうせお金結構掛かるし面倒だしなんでしょ〜とか思ってました。でもダメ元で調べてみたら、無料でできちゃうっぽい。まじ?しかも、インストールしてコマンド実行するだけ…?あれ?簡単では?まじ卍でゎ???


Let’s Encryptを使おう


概要

(httpでのWebサーバーは構築済みとして)

  1. certbotクライアントのDL・インストール
  2. certbotクライアントで証明書の取得
  3. Webサーバーの設定をhttps向けに書き直す
  4. crontabで証明書の自動更新の設定

細かい手順書いてくとややこしく見えるけど、結局これだけでした。プラグイン使えば、Webサーバーの設定はcertbotクライアントが勝手にやってくれたりもするらしい(やってないからよくわからん)。

実際にやったこと

Let’s Encrypt 総合ポータル (非公式の日本語解説)
https://letsencrypt.jp/

非公式ですが、情報も充実めで何より日本語なので、ここを見ながら作業しました。不安な人は英語の公式サイトも見たらいいんじゃないかな。

前提環境

Nginxのドキュメントルートには静的コンテンツ、blogディレクトリにWordpressが入っててそこだけ動的という構成。バージョン記載とかいらないよね。

作業の手順

上記のLet’s Encrypt 総合ポータルの記述のみでほとんどできました。Nginxプラグインについてはアルファ版とのことなので、使わずに行きたいと思います。

1.certbotクライアントのインストール

yumでインストールできるので、

sudo yum install epel-release
sudo yum install certbot

これでおっけー。Apacheプラグインは使わないので入れません。

2.証明書の取得(Nginxを停止)

まず、証明書取得のために80(http)と443(https)のポートを開けます。今回はhttpsのみ新たに開けました。

sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

Nginxプラグインを使わずに、サーバーを止めて作業します。まずはNginxを止めます。

今回はすべての設定が終わるまでサーバーは停止させます。証明書の取得以降はcertbotクライアントがポートをListenしていないので、一応サーバーは動かせます。

sudo systemctl stop nginx

これで証明書の取得ができます。今回はwww付きのもののみ取得したかったので、以下のようにしました。standaloneオプションを使うと、Certbot内蔵の簡易Webサーバで認証して証明書を発行してくれます。メールサーバー等構築する場合でも、Webサーバー建ててなくても、簡単に取得できそう。

sudo certbot certonly --standalone -d www.example.com

メールアドレス入れて、利用規約に同意すれば、証明書が発行されて何やら長い文章が出てきます。

そこに必要なファイルのシンボリックリンクのパスが表示されます。実際のファイルの場所じゃなくて、シンボリックリンクでNginxの設定をしておくと、実際のファイルが更新されたりしても変更がいらないです。

Nginxで使うのは

  • privkey.pem
  • fullchain.pem

の2つ。

3.Nginxの設定をする。

やることは3つ。

  1. httphttpsにリダイレクト
  2. SSLの設定(証明書の場所等)
  3. HSTSを設定

HSTSは、Hypertext Strict Transport Securityの略。要は、TTSでの接続を強制させる設定。

すべてNginxの設定ファイルに書き足して行きます。

sudo vi /etc/nginx/nginx.conf

httpセクション(っていうのかわかんないけど)の中に書いていきます。

http{
   #今回設定を書きたす場所
}

 

まず、httpでの接続をhttpsにリダイレクトします。ついでに、今回はwww付きの証明書のみ取得しているので、wwwなしでの接続をwww付きに301リダイレクトしています。

server {
  listen       80;
  server_name  example.com;

  return       301 https://www. example.com$request_uri;
}

server {
  listen       80;
  server_name  example.com;

  return       301 https://www.example.com$request_uri;
}

https部分。先程のようにwwwつきにリダイレクト。SSL/TLSの設定として、証明書の場所を指定したりします。

server {
  listen       443;
  server_name  example.com;

  return       301 https://www.example.com$request_uri;
}


server {
  listen       443 ssl http2 default_server;
  server_name  www.example.com;

  ssl_certificate "/etc/letsencrypt/live/www.example.com/fullchain.pem";
  ssl_certificate_key "/etc/letsencrypt/live/www.example.com/privkey.pem";
  ssl_session_cache shared:SSL:1m;
  ssl_session_timeout  10m;
  ssl_ciphers HIGH:!aNULL:!MD5;
  ssl_prefer_server_ciphers on;
  ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;

  .
  .
  .
}

最後に、HSTSの設定

add_header Strict-Transport-Security 'max-age=31536000';

これでNginxの設定は終了なので、;wqで保存して終わり。

 

設定の文法チェックだけしておきましょう。

[user@ip-ad-dr-es ~]$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

 

こんな感じに表示されたらOK。だめだとここら辺おかしいよ!って教えてくれます。自分がよくやるのは、セミコロン(;)のつけ忘れ。

3.Nginx起動&テスト

すべての設定が終わったので、Nginxを起動。

sudo systemctl start nginx

まずは、ブラウザからhttps://www.example.comにアクセスしてSSL/TTS接続に成功するか確認。

つぎに、http://www.example.comとかからリダイレクトされているかも確認して、基本的な設定は終了。

 

4.証明書の自動更新をする。

Let’s Encryptで発行される証明書の有効期限は90日と短くなっています。その理由は公式ブログで言及されています。

和訳はこちら。
証明書の有効期間が90日間な理由 – Let’s Encrypt 総合ポータル
https://letsencrypt.jp/blog/2015-11-09.html

要は自動更新しろって話なので、これも設定します。

まず、証明書の更新自体は非常に簡単で、以下のコマンドを実行するだけ。

certbot renew

ただ、今回はnginxを停止してから実行する必要があるので、コマンドは以下のようになります。

certbot renew --pre-hook "service nginx stop" --post-hook "service nginx start"

これをcrontabで自動化します。ちなみに、例えばこのコマンドを毎週実行する設定にした場合でも、

シェル・コマンド(hook)は、証明書を更新する必要がある場合(証明書の有効期間の残りが30日未満の場合)にのみ実行されるため、上記のコマンドを頻繁に自動実行した場合にも、ウェブサーバの再起動が頻繁に行われることはありません。

ユーザーガイド – Let’s Encrypt 総合ポータル
https://letsencrypt.jp/docs/using.html#renewal

とのことなので、遠慮なくcrontabで設定していきましょう。

rootユーザーのcrontabとして設定していきます。ホームディレクトリに設定内容を書いた”crontab.conf”ファイルを作成して、読み込みます。

(crontab -eとcrontab -r の打ち間違い防止のため。すでに設定しているcrontabがある場合、crontab -lで取得してcrontab.conf に追記します。)

[root@ip-ad-dr-es ~]# vi crontab.conf

今回は、毎週月曜朝10時に実行するように設定します。

00  10  *  *  1 certbot renew --pre-hook "service nginx stop" --post-hook "service nginx start"

保存したら、読み込みます。

[root@ip-ad-dr-es ~]# crontab crontab.conf

 

これですべての設定が終了した(はず)。


おわりに


意外と簡単に設定できたから、備忘録として書きました。

ブログ書き慣れてないと言っても、この記事を書いている時間のほうがこの作業時間より絶対に長い。

それくらい簡単でした。個人でウェブサーバとかメールサーバーとか建ててる人は、Let’s Encryptで簡単に暗号化。

かず猫

インターネット初心者です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください