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 を使う前に下記の準備が必要です。
- Python2.7 がインストール済みであること
- ドメインを購入済みであること
- 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 化してなかった方にもオススメです。
手順自体はそんなに複雑でもなく、自動更新の仕組みさえ作ればそれ以降は特に何もする必要もないので。
コメント