無料なSSL Let’s Encryptを使ってみた。EC2(amazon linux) + Nginx + Rails
無料で使えるSSL証明書があるということでLet’s Encryptを早速 試してみました。
Let’s Encryptの公式サイトはこちら
環境
今回導入に試してみた、環境としてザックリと以下のようになります。
- AWS EC2 (amazon linux)
- Nginx
- Ruby on Rails
作業手順
基本的には下記リンクの公式ページのに書いてあるので、 基本的にはそちらを参考にして頂ければと思います
多少、つまづいたところもあるので、 詳しい作業手順を下記します。
letsencryptのダウンロード
まず、 letsencryptをダウンロードします。 ソースコードの配布はgitにあるので、gitからcloneします。
もし、サーバー等の環境にgitが入っていなければgit自体をインストールしてください。
実際のコマンドは以下になります。
$ cd /usr/local $ git clone https://github.com/letsencrypt/letsencrypt $ cd ./letsencrypt
インストール
letsencryptのダウンロードが完了したら、続いてインストールします。 手順通りに実行すれば、以下のコマンドを実行すればよいのですが、warningが出ました。
$ ./letsencrypt-auto --help WARNING: Amazon Linux support is very experimental at present... if you would like to work on improving it, please ensure you have backups and then run this script again with the --debug flag!
「Amazon Linuxはサポートしていないから、注意してね。もし実行するなら -debug オプション付けて実行してね。」 的な感じで言われるので、メッセージ通り以下を実行すると。
$ ./letsencrypt-auto --help --debug (略) Requesting root privileges to run letsencrypt... /root/.local/share/letsencrypt/bin/letsencrypt --help --debug Traceback (most recent call last): File "/root/.local/share/letsencrypt/bin/letsencrypt", line 7, in <module> from letsencrypt.main import main File "/root/.local/share/letsencrypt/local/lib/python2.7/dist-packages/letsencrypt/main.py", line 11, in <module> import zope.component File "/root/.local/share/letsencrypt/local/lib/python2.7/dist-packages/zope/component/__init__.py", line 16, in <module> from zope.interface import Interface ImportError: No module named interface
また、怒られました。
EC2でエラーが出るとか出ないとか。 このパターンだと、sudo付けてOK的な記事(ImportError: No module named cryptography.hazmat.bindings.openssl.binding · Issue #2544 · letsencrypt/letsencrypt · GitHub )があったので以下のコマンドを実行したら成功しました。
$ sudo ./letsencrypt-auto --help
--debug オプション いらないじゃん、、、
以下成功メッセージです。
Installation succeeded. Requesting root privileges to run letsencrypt... /root/.local/share/letsencrypt/bin/letsencrypt --help letsencrypt-auto [SUBCOMMAND] [options] [-d domain] [-d domain] ... The Let's Encrypt agent can obtain and install HTTPS/TLS/SSL certificates. By default, it will attempt to use a webserver both for obtaining and installing the cert. Major SUBCOMMANDS are: (default) run Obtain & install a cert in your current webserver certonly Obtain cert, but do not install it (aka "auth") install Install a previously obtained cert in a server renew Renew previously obtained certs that are near expiry revoke Revoke a previously obtained certificate rollback Rollback server configuration changes made during install config_changes Show changes made to server config during installation plugins Display information about installed plugins Choice of server plugins for obtaining and installing cert: --apache Use the Apache plugin for authentication & installation --standalone Run a standalone webserver for authentication (nginx support is experimental, buggy, and not installed by default) --webroot Place files in a server's webroot folder for authentication OR use different plugins to obtain (authenticate) the cert and then install it: --authenticator standalone --installer apache More detailed help: -h, --help [topic] print this message, or detailed help on a topic; the available topics are: all, automation, paths, security, testing, or any of the subcommands or plugins (certonly, install, nginx, apache, standalone, webroot, etc)
これで、インストール完了です。
証明書の発行
続いて、証明書を発行していきます。
証明書発行用のコマンドとして、以下になります。
sudo ./letsencrypt-auto certonly --webroot -w /var/www/example -d example.com
しかし、その前に、Nginxの設定を確認しておく必要があります。
上記コマンドを実行すると、/var/www/exampleに .well-knownというファイルを作って、 以下のurlでアクセスしに来よとします。
http://example.com/.well-known
私の場合、もともと、Nginxの設定が入っていて、http://example.com/.well-knownを許可していなかったので、 別途、Nginxの設定で上記にアクセスできるようにしておく必要があります。
server { listen 80; server_name example.com; (略) location /.well-known/ { root /var/www/example; } (略)
例えば、上記のように、well-knownにアクセスできるような設定が済んでいる状態以下のコマンドを実行します。
sudo ./letsencrypt-auto certonly --webroot -w /var/www/example -d example.com
そうすると。以下のメッセージが表示されて
IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/example.com/fullchain.pem. Your cert will expire on 2016-07-13. To obtain a new version of the certificate in the future, simply run Let's Encrypt again. - If you like Let's Encrypt, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le
以下ディレクトリ配下に証明書も作ってくれています。
/etc/letsencrypt/live/example.com/
Nginxの設定
証明書まで出来上がったら、 Nginxのconfファイルを以下の様に編集します。
server { listen 443 ssl; server_name example.com; ssl on; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers 'kEECDH+ECDSA+AES128 kEECDH+ECDSA+AES256 kEECDH+AES128 kEECDH+AES256 kEDH+AES128 kEDH+AES256 DES-CBC3-SHA +SHA !aNULL !eNULL !LOW !kECDH !DSS !MD5 !EXP !PSK !SRP !CAMELLIA !SEED'; ssl_stapling on; ssl_session_cache builtin:1000 shared:SSL:10m; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; location / { (略) } }
ssl_certificate と ssl_certificate_keyにさっき作った証明書を指定します。
Nginxの再起動
設定が完了したら、Nginxを再起動します。
/etc/init.d/nginx reload
で実際にhttpsでアクセスしてみると。
無事に成功しました。
証明書の更新
こちらの証明書、期間が3ヶ月なんです。短いですね。 けれども、ちゃんと更新用のコマンドが用意されているので、 定期的に更新してあげる必要があります。
なので 更新ようコマンドをcronに設定します。
0 5 * * * /usr/local/letsencrypt/letsencrypt-auto renew --force-renew && /etc/init.d/nginx reload
毎日1回、証明書を更新して、nginxをreloadする感じにしています。
まとめ
無料はやっぱりいいですね。 これまで、数千円~数万円かかっていたのが、無料でいけるのはありがたいです。
EV認証は対応していないようなので、企業向きでは無いのかもしれませんが、 セキュリティーに厳しくないところであれば、十分につかえるのではないでしょうか?
エンジニアにしてみたら、これからはSSLを設定していなと逆に手抜き感が出てしまうかもしれないですね。
でも、無料はありがたいです。 ありがとう、Let’s Encrypt!!
関連記事
- 作者: 久保達彦,道井俊介
- 出版社/メーカー: 技術評論社
- 発売日: 2016/01/16
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る