Centos7にNginx + Unicornで構築したRedmine3.3をLet's EncryptでSSL化対応

# [概要]
Redmineを無料SSLであるLet's Encryptに対応させる

# [事前準備]
下記が構築であること
[Centos7にNginx + UnicornでRedmine3.3構築方法](http://qiita.com/sabakan7/items/d20e81b9395a654f6e55)

# [作業内容]
## Let's Encrypt クライアントをクローン
```bash
$ cd /opt
$ sudo git clone https://github.com/certbot/certbot
```

### Let's Encrypt クライアントで必要なパッケージをインストール
```bash
$ cd certbot/
$ sudo ./certbot-auto
```

### Let's Encrypt の設定を追記
```bash
$ sudo vi /etc/nginx/conf.d/redmine.conf
```

下記のように`location`を追加する。

```nginx:/etc/nginx/conf.d/redmine.conf
upstream unicorn-redmine {
    server unix:/opt/redmine/tmp/unicorn_redmine.sock;
}

server {
    listen 80;
    server_name Servername;

    root /opt/redmine/public;
    client_max_body_size 1G;

    location / {
        try_files $uri/index.html $uri.html $uri @app;
    }

    location @app {
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_connect_timeout 60;
        proxy_read_timeout 60;
        proxy_send_timeout 600;
        proxy_pass http://unicorn-redmine;
    }

    error_page 500 502 503 504 /500.html;

  location ^~ /.well-known/acme-challenge/ {
    root /usr/share/nginx/html;
  }
}
```

### nginxの設定反映
```bash
$ sudo systemctl restart nginx
```

### 証明書取得のためのスクリプトを作成 [^1]

下記を参考に適宜変更してください。

```bash
$ sudo vim /opt/letsencrypt.sh
```

```bash
#!/bin/bash

#証明書のドメイン（,区切りで複数のドメインも指定可能）
DOMAIN=example.com

#ドキュメントルート（上のドメインで接続可能である必要がある）
WEBROOT=/var/www/example.com/public_html

#メールアドレス（トラブル時にメールが届く）
EMAIL=info@example.com

/opt/certbot/certbot-auto certonly --webroot -w $WEBROOT -d $DOMAIN -m $EMAIL --agree-tos --non-interactive $*
```

### スクリプトに実行権限付与
```bash
$ sudo chmod 755 /opt/letsencrypt.sh 
```

### テスト実行
```bash
$ sudo /opt/letsencrypt.sh --dry-run
### --dry-run テストで実行する
```

下記のように表示されれば OK です。

```bash
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/gitlab/fullchain.pem. Your cert
   will expire on 2016-12-25. To obtain a new or tweaked version of
   this certificate in the future, simply run certbot-auto again. To
   non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
```

### 本番実行
```bash
$ sudo /opt/letsencrypt.sh
```

#### SSL設定ファイル
元からあった`redmine.conf`を削除し、ssl設定ファイルを作成する。

```bash
$ sudo vim /etc/nginx/conf.d/ssl.redmine.conf
```

```nginx:/etc/nginx/conf.d/ssl.redmine.conf
upstream unicorn-redmine {
    server unix:/opt/redmine/tmp/unicorn_redmine.sock;
}


server {
    listen 443 ssl;
    server_name {ドメイン};

    ssl_certificate     /etc/letsencrypt/live/{ドメイン}/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/{ドメイン}/privkey.pem;

    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;

    ssl_ciphers AESGCM:HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;

    root /opt/redmine/public;
    client_max_body_size 1G;

    access_log /var/log/nginx/ssl_access.log;
    error_log /var/log/nginx/ssl_error.log;

    location / {
        try_files $uri/index.html $uri.html $uri @app;
    }

    location @app {
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header http:// https://;
        proxy_connect_timeout 60;
        proxy_read_timeout 60;
        proxy_send_timeout 600;
        proxy_pass http://unicorn-redmine;
    }

    error_page 500 502 503 504 /500.html;

    location ^~ /.well-known/acme-challenge/ {
      root /usr/share/nginx/html;
    }
}
```

### 設定ファイル確認
```bash
$ sudo nginx -t
```

### 設定ファイル反映
```bash
$ sudo systemctl restart nginx
```

# [事後確認・作業]
下記にアクセスして表示されるのを確認する
`https://{ドメイン}　`
# [参考サイト]
[^1]: [Let's encrypt運用のベストプラクティス](http://qiita.com/tkyk@github/items/9b6ba55bb2a6a5d90963?utm_campaign=popular_items&utm_medium=referral&utm_source=popular_items)