Let's encrypt How To 1 （初期設定編）

+ [Let's encrypt How To 2 （運用編）](http://qiita.com/vintersnow/items/40ace2196502d2422c80)

# Let's encrypt とは
Let's Encryptは全てのネットリソースを暗号化することを目標としてEFFが運営している団体。
2016年4月から正式リリースがされ、誰でも無料で使える認証発行サビースとなっている。

以下の利点がある

無料
簡単で自動化された認証書の発行
オープン
Let's EncryptはACMEプロトコルを使ってDV証明書を発行する。（2016/8/24現在ではDV証明書のみ）
DV証明書はドメインが正しいことを証明するものである。
ACMEプロトコルはよく分からいけど、サーバー内いないと出来ない処理をし、（endpointにファイル配置とか）をしてそのドメイン保持者かどうかを判断しているみたい。これによって面倒な登録処理は必要なく、コマンド一発で発行する事ができる。

詳しくは[公式](https://letsencrypt.jp)を

# 設定

今回awsのec2にテストとしてサーバーを一から建ててみます。
環境は以下のとおりです

+ ubuntu server 16.04
+ nginx (1.11.0)

ドメインは適当に収得しておく。
今回は実験を兼ねて[freenomで無料ドメインを取ってみた](http://qiita.com/teekay/items/135dc67e39f24997019e)。無料で取れるなんてすごい。

## ec2の設定

### インスタンスの立ち上げ

aws consoleから適当なOSを選んで立ち上げる。

### セキュリティグループの設定

セキュリティグループは初期設定だとsshしかインバウンドを許可していないので、80番と443番を開けておく。

![sg.png](https://qiita-image-store.s3.amazonaws.com/0/34727/79ffea22-72ef-e5e2-cd1c-0495b3d78198.png)



## nginxインストール

とりあえず今回はテストなのでaptから入れる

```shell-session
$ sudo apt install nginx
```

```shell-session
$ nginx -V
nginx version: nginx/1.10.0 (Ubuntu)
built with OpenSSL 1.0.2g  1 Mar 2016
```

## サーバーの立ち上げ

適当に接続できるサーバーをたち上げておく。


```nginx:/etc/nginx/sites-available/default
server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/html;

        index index.html index.htm index.nginx-debian.html;
        server_name _;
        location / {
                try_files $uri $uri/ =404;
        }
}
```


```shell-session
$ sudo systemctl restart nginx　#nginxを再起動
```

接続できるかテストする

```shell-session
$ curl (ip or url):80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...
```

## let's encryptoにインストール

OSとversionによって変わるので[公式](https://letsencrypt.jp/usage/install-certbot.html)を参照すること。

ubuntu 16.04の場合

```shell-session
$ sudo apt install letsencrypt
$ type letsencrypt
letsencrypt is hashed (/usr/bin/letsencrypt)
```

今回はapacheを使わないので、`python-letsencrypt-apache`はインストールしない。

(他のOSだと`certbot-auto`というコマンドになるがubuntu16.04だけ`letsencrypt`?そのうち変わりそう。)

## 証明書の発行

letsencryptはインタラクティブに設定が出来るが、何を設定したか分からなくなって嫌なので、ワンラインで行う。
`-n`オプションをつけるとインタラクティブモードを起動しなくなり、足りない項目を教えてくれる。

```shell-session
$ sudo systemctl stop nginx
$ sudo letsencrypt certonly --standalone -n  -d www.example.com -m yourmail@gmail.com --agree-tos

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/www.example.com/fullchain.pem. Your cert will
   expire on 2017-08-23. 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
```

各オプションの説明は以下の通り

オプション|説明
:--|:--
--standalone|letsencryptのサーバーを立ち上げて認証を行う。80番ポートを使うのでnginxなどを止める必要がある。
-n | インタラクティブモードを使わないようにする
-d | ドメイン.　`-d`は一度に複数指定可能
-m | 登録用のメール
--agree-tos | 利用規約に同意する

`-m`と`--agree-tos`は一度すれば次回以降しなくても良いはずだが、いつでも実行できるようにこの形の方がいい。

## 証明書の設定

nginxに証明書を設定する。
証明書本体は`/etc/letsencrypt/archive/www.example.com`に保管され、`/etc/letsencrypt/live/www.example.com`にエイリアスされる。
そのため更新してもlive以下ののファイル名は変わらないので、いちいちnginxの設定を変える必要がない。

```nginx:/etc/nginx/sites-available/default
server {
        listen 80 default_server;
        listen [::]:80 default_server;

        # SSL configuration
        #
        listen 443 ssl default_server;
        listen [::]:443 ssl default_server;

        ssl_certificate /etc/letsencrypt/live/vintersnow.tk/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/vintersnow.tk/privkey.pem;

        root /var/www/html;

        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;

        server_name _;

        location / {
                try_files $uri $uri/ =404;
        }
}
```

nginxを起動

```shell-session
$ sudo systemctl start nginx
```

接続テスト

```
$ curl https://www.example.com
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
...
```

ということでssl化が出来た！

[運用編に続く](http://qiita.com/vintersnow/items/40ace2196502d2422c80)