お世話になっております。
しゃまとんです。

前回の記事につづいてnginx + golangな環境をhttps化してみました。

今回もLet’s Encryptを使ってhttps化していきます。
環境を作るにあたってこちらがとても参考になりました。

まずはサーバーでletsentrypt(certbot)を取得して証明書の発行を行います。
私の場合はroot直下で作業しました。

git clone https://github.com/certbot/certbot
cd certbot
./certbot-auto certonly --standalone -t

問題なければCongraturation!!と表示されます。
次にnginxのtls周りを設定します。nginx.confのtls部分を下記のようにしました。
初期状態だとコメントアウトされているので外して証明書やproxy_passを設定します。

# Settings for a TLS enabled server.
#
    server {
        listen       443 ssl;
        server_name  _;

        ssl_certificate "/etc/letsencrypt/live/example.com/fullchain.pem";
        ssl_certificate_key "/etc/letsencrypt/live/example.com/privkey.pem";
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
        ssl_ciphers HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        proxy_pass http://127.0.0.1:9999;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

}

設定後は忘れずリロードか再起動を行いましょう。
これでhttpsでのアクセスが可能になっているはずです。

service nginx restart
service nginx reload

次にnginxは80ポートをバインドするので、Let’s Encrypt側を–webrootを使った形式に変更しておきます。 (これは最初からこちらでもよかったかも)

更新時の確認用パスとなるディレクトリを作成し、renewalしてみます。
実行後にCongraturation!!とでればOKです。

mkdir /var/letsencrypt
./certbot-auto certonly --webroot -w /var/letsencrypt -d example.com --agree-tos --force-renewal -n

再度nginx側の設定を変更します。
以降はhttpでのアクセスは全てhttpsにリダイレクトするようにしておきます。
ただしletsentryptはhttpsを利用するため、先程のディレクトリを指定し対象のアドレスのみHTTPを許可しておきます。

server {
        listen       80;
        server_name  hostname;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location ^~ /.well-known {
                root /var/letsencrypt;
        }

        location / {
        # Redirect all HTTP requests to HTTPS with a 301 Moved Permanently response.
        return 301 https://$host$request_uri;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

設定したら再度nginxをリロードまたは再起動し、renewを実行してみます。

service nginx restart
./certbot-auto renew --force-renewal

ログがこんな感じならOKでしょう。

Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/exmaple.com.conf
-------------------------------------------------------------------------------
Plugins selected: Authenticator webroot, Installer None
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for exmaple.com
Waiting for verification...
Cleaning up challenges

-------------------------------------------------------------------------------
new certificate deployed without reload, fullchain is
/etc/letsencrypt/live/exmaple.com/fullchain.pem
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------

Congratulations, all renewals succeeded. The following certs have been renewed:
/etc/letsencrypt/live/exmaple.com/fullchain.pem (success)
-------------------------------------------------------------------------------

もしうまくいかない場合は上記の例だと/var/letsencrypt/.well-known配下にindex.htmlとか作ってみて、 curlでURLを叩いてみるといいかもしれません。
というのも、renewは何回か失敗すると一定時間実行できなくなるようなので。。

あとはファイルがあるはずなのに403 Forbiddenになってしまうような場合は、 SELinuxが影響している場合もありますのでgetenforceして確かめてみるといいかもしれません。

必要ならcronも設定しておくとよいですね。

crontab -e
00 05 15 * * /root/certbot/certbot-auto renew

これで一応ですが、nginx + golangな環境にhttpsを導入することができました。
以上です。

■ 参考