Let's Encryptから無料・安全なSSL証明書を取得してNginxに設定するまで

安全な通信(HTTPS)が出来るWebサイトを運用するには、普通はベンダからSSL証明書を購入して、サーバに設定する必要があります。
SSL証明書の価格帯はピンからキリまでありますが、少し調べたところ安い方で年間3,000円程度のようです(2015年11月現在)。

Value SSL
http://valuessl.net/info/price.php

Rapid SSL (米 GeoTrust社)
http://www.ssl-store.jp/rapidssl/

商用としてはさほど抵抗のない値段だと思いますが、個人で気軽に(例えば開発用)に導入するには、少し考えてしまいますね。
更に調べると、中には無料でSSL証明書を発行してくれるベンダもあり(イスラエルの[StartSSL](https://www.startssl.com/)社)、こちらからSSL証明書を取得する手順を詳細に紹介する[「無料のSSL証明書StartSSLを活用する」という記事](http://qiita.com/k-shogo/items/870b6d3939dd08da2de4)もありました。
ただ、手順は結構面倒です。

ところで、2015年9月から、[Let's Encrypt](https://letsencrypt.org/)という組織によって無料のSSL証明書の発行が開始されているそうです。
現在は招待制のベータプログラムですが、2015年12月から公開ベータプログラムへの移行が発表されています。
無料のSSL証明書というだけで流行りそうな予感がしますが、これからますます普及が加速するのかもしれませんね。

# Let's Encryptって?

米国カリフォルニア州の公益法人である[ISRG](https://letsencrypt.org/isrg/)により運営されているサービス。
2015年9月よりSSL証明書の発行開始。2015/11/13時点で、11,700以上の組織にSSL証明書を発行済みとのこと([LetsEncryptがSSL証明書を発行した組織の長い一覧](https://crt.sh/?Identity=%25&iCAID=7395))。

同組織は、HTTPSの普及、特にSSL証明書の発行・インストールを簡単にする (Webサーバ管理のスキルがなくても実施できるようにする)ことを目標に活動しているとの事です。
[Let's Encrypt Launch Plan: Week of September 14, 2015](https://www.eff.org/deeplinks/2015/06/lets-encrypt-launch-plan-week-september-14-2015)

これはぜひ活用させてもらわねば!
…それでは早速、Let's EncryptからのSSL証明書の発行と、Nginx (OpenResty)への設定をやってみます。

## はじめに: ベータプログラムへの申し込み
[Let's Encrypt ベータプログラム申し込みサイト](https://community.letsencrypt.org/t/beta-program-announcements/1631)
SSL証明書の対象ドメイン名と、自分のメールアドレスを申し込みフォームに入力して、数日待ちます。私の場合は4日後にメールが届きました。

![form](https://raw.githubusercontent.com/dseg/dseg.github.io/master/img/qiita/01-ssl/01_01-betaprogram.png)

※ちなみに2015/12/3 以降、招待制は廃止になり公開ベータに移行するため登録は不要とのこと。
[Public Beta: December 3, 2015](https://letsencrypt.org/2015/11/12/public-beta-timing.html)

# 動作確認環境
- Ubuntu 14.04 Trusty 64-bit on AWS
- NGINX (OpenResty) 1.9.3

## SSL証明書取得用コマンドのインストール
非常に活発に開発されているため、gitから取得するのがお勧めです。
(git updateで最新版を都度取得出来た方が便利)

```bash
git clone https://github.com/letsencrypt/letsencrypt

# or
wget https://github.com/letsencrypt/letsencrypt/archive/master.zip
unzip master.zip

cd letsencrypt
```

# letsencryptコマンド
Apache用に証明書をインストールしてくれるオプションもあります (--apache)が、今回は使いません。
Nginx用のオプションは現在開発中。こちらも今回は使いません。
本当は設定までコマンドで完了してもらう方が楽でしょうね。

# letsencryptコマンドのヘルプ

```bash
./letsencrypt-auto --help
```

# 事前準備
コマンドを実行するサーバ上でWebサーバが稼働中であれば事前に止めておきます。
(Port 80 及び Port 443)

## 証明書の新規取得

```bash
./letsencrypt-auto certonly -a standalone --server https://acme-v01.api.letsencrypt.org/directory \
 --agree-dev-preview -d <<YOUR DOMAIN NAME>>
# <<YOUR DOMAIN NAME>> をあなたのドメイン名に置き換えて下さい
```

## 証明書の更新 
※60日毎の更新が推奨されています。2015/11/19現在 Let's Encryptの証明書の有効期限は90日であるため)

```bash
./letsencrypt-auto --renew certonly -a standalone --server https://acme-v01.api.letsencrypt.org/directory \
 --agree-dev-preview -d <<YOUR DOMAIN NAME>>
```

## 証明書の<del>更新</del>再発行

```bash
./letsencrypt-auto --duplicate certonly -a standalone --server https://acme-v01.api.letsencrypt.org/directory \
 --agree-dev-preview -d <<YOUR DOMAIN NAME>>
```

成功すると以下のように情報が表示されるはずです。

```session
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/shield.jp/fullchain.pem. Your cert will
   expire on 2016-02-10. To obtain a new version of the certificate in
   the future, simply run Let's Encrypt again.
```
 
コマンドが成功すると、証明書が以下のパスに保存されます。

```bash
sudo ls /etc/letsencrypt/live/<<YOUR DOMAIN NAME>>

cert.pem   fullchain.pem  chain.pem   privkey.pem
```

以上で証明書の取得が完了しました。すごく簡単ですね。

次に、Nginxで今取得した証明書を使用するよう設定します。
Nginxで使うのは「fullchain.pem」です。

# Nginx 設定例
```nginx
sudo vi /usr/local/openresty/nginx/conf/nginx.conf

Server {
     listen       443 ssl;
     server_name  shield.jp;

     ssl_certificate /etc/letsencrypt/live/shield.jp/fullchain.pem;
     ssl_certificate_key /etc/letsencrypt/live/shield.jp/privkey.pem;

     ssl_session_cache   shared:SSL:3m;
     ssl_buffer_size     8k;
     ssl_session_timeout 10m;

     # ... 後略 ...
}
```

あとはNginxを再起動して完了です。
まずはChromeでサイトを開き、緑色のアイコンが表示されるか確認してみましょう。
![Green Icon on Chrome](https://raw.githubusercontent.com/dseg/dseg.github.io/master/img/qiita/01-ssl/01_03-ssl-cert-greenicon.png)

SSL証明書が正しく設定されたかの詳細は、[Qualys SSLTest](https://www.ssllabs.com/ssltest/analyze.html)などで確認できます。

## 参考

[Let's Encrypt 公式ドキュメント](http://letsencrypt.readthedocs.org/en/latest/intro.html)


# 終わりに

以上のように、無料で簡単にSSL証明書を取得できます。すごいですね。
ベータ版なので証明書の期限が3か月と短いのが不便ですが、コマンドを実行してすぐ再発行できますし、近々始まる公開ベータ版では延長されるかもしれません。

また、今回は試しませんでしたが、WebサーバがApacheなら設定すら自動で更新してもらうことが可能なようです。
Nginxの設定ファイルも更新出来るようになるのでしょう。
HTTPSの設定は非常に難しく専門的な知識も必要とされますが、それが無くても十分に安全な設定を自動で行ってくれるとしたらとても良いですね。
ますます便利になりそうなLet's Encryptプロジェクトに期待です。