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


[概要]

Redmineを無料SSLであるLet's Encryptに対応させる

[事前準備]

下記が構築であること
Centos7にNginx + UnicornでRedmine3.3構築方法

[作業内容]

Let's Encrypt クライアントをクローン

$ cd /opt
$ sudo git clone https://github.com/certbot/certbot

Let's Encrypt クライアントで必要なパッケージをインストール

$ cd certbot/
$ sudo ./certbot-auto

Let's Encrypt の設定を追記

$ sudo vi /etc/nginx/conf.d/redmine.conf

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

/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の設定反映

$ sudo systemctl restart nginx

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

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

$ sudo vim /opt/letsencrypt.sh
#!/bin/bash

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

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

#メールアドレス(トラブル時にメールが届く)
EMAIL=[email protected]

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

スクリプトに実行権限付与

$ sudo chmod 755 /opt/letsencrypt.sh 

テスト実行

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

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

 - 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"

本番実行

$ sudo /opt/letsencrypt.sh

SSL設定ファイル

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

$ sudo vim /etc/nginx/conf.d/ssl.redmine.conf
/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;
    }
}

設定ファイル確認

$ sudo nginx -t

設定ファイル反映

$ sudo systemctl restart nginx

[事後確認・作業]

下記にアクセスして表示されるのを確認する
https://{ドメイン} 

[参考サイト]