Amazon Linux + NginxでLet’s Encryptを使ってみる

2017年12月21日

AWSのEC2を利用して、Amazon LinuxでNginxの環境を構築した際に、Webサーバの通信の暗号化が必要だったので、「Let’s Encrypt」を使って通信の暗号化を行いました。
その際の証明書の取得、更新時の手順をまとめました。
Let’s Encryptを利用する際、以前は「letsencrypt-auto」というツールを使っていましたが、現在は「certbot-auto」というツールを使うようになっています。基本的な使い方はあまり変わっていません。

Let’s Encryptとは

Let’s Encrypt は、認証局(CA)として「SSL/TLSサーバ証明書」を無料で発行するとともに、証明書の発行・インストール・更新のプロセスを自動化することにより、TLS や HTTPS(TLSプロトコルによって提供されるセキュアな接続の上でのHTTP通信)を普及させることを目的としているプロジェクトです。
非営利団体の ISRG (Internet Security Research Group) が運営しており、シスコ(Cisco Systems)、Akamai、電子フロンティア財団(Electronic Frontier Foundation)、モジラ財団(Mozilla Foundation)などの大手企業・団体が、ISRG のスポンサーとして Let’s Encrypt を支援しています。

今回利用した環境

OS:Amazon Linux AMI release 2016.09
Webサーバ:Nginx 1.10.1

事前準備

Let’s Encryptを使う前に下記の準備が必要です。
1. Python2.7がインストール済みであること
2. ドメインを購入済みであること
3. Nginxがインストール済みであること

Let’s EncryptはPythonで動作するので、Python2.7以上のバージョンがインストールされている必要があります。
今回利用するOSではあらかじめPython2.7がインストールされていました。
また、ドメインをあらかじめ購入しておかないと、Let’s Encryptの設定時にドメイン名を設定することができないので要注意です。

Certbotインストール

$ cd ~
$ git clone https://github.com/certbot/certbot
$ cd certbot
./certbot-auto

この際、Certbotの実行に必要なパッケージもインストールされます。インストールされたパッケージはコンソールから確認できると思います。

Certbotで証明書を発行する

下記のコマンドを実行し、証明書を発行します。

$ sudo ./certbot-auto certonly \
  --agree-tos \
  --webroot \
  -w /usr/share/nginx/html
  -d example.com
  -m sample@test.com

オプションには以下の意味があります。

  • certonly:証明書の発行のみを実行する。
  • –agree-tos:ライセンス条項に同意する。
  • –webroot:発行された証明書の一時保存にWebサーバの指定ディレクトリを使うWebrootモードを指定する。
  • -w Webrootモード時に利用する証明書の一時保存ディレクトリを指定する。
  • -d 発行する証明書のFQDNを指定する。-dオプションを複数指定すれば、一枚の証明書で複数のFQDNを証明できる。
  • -m 証明書の期限切れなどを通知するメールアドレスを設定する。

Nginxの設定ファイルを修正する

発行された証明書は「/etc/letsencrypt/archive/」に保存されます。また、このディレクトリにある証明書や秘密鍵へのシンボリックリンクが「/etc/letsencrypt/live/」に作成されます。
Webサーバの設定ファイルから証明書を参照する際はシンボリックリンクである「/etc/letsencrypt/live/」を参照するようにします。

# vim /etc/nginx/nginx.conf

    server {
...

        ssl_certificate "/etc/letsencrypt/live/example.com/cert.pem";
        ssl_certificate_key "/etc/letsencrypt/live/example.com/privkey.pem";
...
    }

上記の内容をNginxの設定ファイルに追記します。

修正が完了したら、変更を反映するためにNginxを再起動します。

# /etc/init.d/nginx restart

通信確認

実際にブラウザからアクセスし、「鍵マーク」が表示されるか確認します。

証明書をcronで自動更新させる

証明書を自動更新するコマンドをcronに登録し、証明書の更新を自動化します。

# crontab -e

50 3 * * 0 /usr/bin/certbot-auto renew --post-hook "service nginx restart"

上記のコマンドでは毎週日曜日の3時50分に証明書を更新するように設定しています。ただ、Let’s Encryptの仕様として、証明書を更新できるのは有効期限の30日以内の場合となっており、有効期限まで30日以上ある場合は更新コマンドを実行しても、証明書ファイルは更新されません。
週に一度コマンドを実行する理由としては、あまりギリギリに更新するようにしていると、更新に失敗した場合にリカバリできない可能性があるためです。

最後に

以上、Let’ Encryptの設定手順でした。Let’s Encrypt自体は無料で利用できるので、証明書にお金がかかるからhttps化してなかった方にもオススメです。
手順自体はそんなに複雑でもなく、自動更新の仕組みさえ作ればそれ以降は特に何もする必要もないので。