読者です 読者をやめる 読者になる 読者になる

ECのウェブ担当者のメモ

ECサイトを運営管理している、WEB担当プログラマのメモ

スポンサーリンク

無料なSSL Let’s Encryptを使ってみた。EC2(amazon linux) + Nginx + Rails

AWS EC2 Nginx Rails

無料で使えるSSL証明書があるということでLet’s Encryptを早速 試してみました。

Let’s Encryptの公式サイトはこちら

letsencrypt.org

環境

今回導入に試してみた、環境としてザックリと以下のようになります。

  • AWS EC2 (amazon linux)
  • Nginx
  • Ruby on Rails

作業手順

基本的には下記リンクの公式ページのに書いてあるので、 基本的にはそちらを参考にして頂ければと思います

letsencrypt.org

多少、つまづいたところもあるので、 詳しい作業手順を下記します。

letsencryptのダウンロード

まず、 letsencryptをダウンロードします。 ソースコードの配布はgitにあるので、gitからcloneします。

もし、サーバー等の環境にgitが入っていなければgit自体をインストールしてください。

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でアクセスしてみると。

無事に成功しました。

f:id:jun9632:20160414203704p:plain

証明書の更新

こちらの証明書、期間が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!!

関連記事

marketing-web.hatenablog.com

marketing-web.hatenablog.com

nginx実践入門 (WEB+DB PRESS plus)

nginx実践入門 (WEB+DB PRESS plus)