[Amazon Linux 2+Nginx] Let’s Encrypt(certbot)でHTTPS(SSL/TLS)化する

以前「Amazon Linux+Nginx」環境でのLet’s Encrypt(certbot)によるHTTPS(SSL/TLS)化について記事にしました。

NginxをLet’s Encryptを使って無料でSSL/TLS化する

しかしAmazon Linux 2では同じ手は通用しなかったので、改めてAmazon Linux 2用の手順をまとめておきました。

巷では実行ファイルであるcertbot-autoを編集する手順をよく見かけますが、ライブラリを直接いじってしまうようで気持ちが悪いです。さらに、もし将来このファイルにアップデートが入った時、編集した部分が上書きされてしまう点も危惧されます。

そこで違う方法で試して案外簡単にSSL/TLS証明書を取得しHTTPS化できたので以下にそのやり方をまとめておきます。

事前準備

certbotをクローンします。場所はどこでもOKです。
本記事ではホームディレクトリにクローンすることとします。

$ git clone https://github.com/certbot/certbot

certbotの実行時に利用するpython-virtualenvパッケージをインストールします(Amazon Linux 2にはデフォルトで入っていませんでした)。

$ sudo yum -y install python-virtualenv

/etc/nginx/nginx.confの編集

赤字部分を追加。
「.well-known/acme-challenge」ディレクトリの下に作成されるワンタイムトークンを外部からアクセス出来るようにしておきます。このディレクトリはNginxのデフォルトドキュメントルート(/usr/share/nginx/html)の下に作成することとしました。

server {
    listen       80;
    server_name  xxx;
    root         /usr/share/nginx/html;

    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;
	
    # 追加
    location /.well-known/acme-challenge {
    	root /usr/share/nginx/html;
    }

    (省略)
}

Nginxをリロードします。

$ sudo systemctl reload nginx.service

SSL/TLS証明書の発行

以下のコマンドを実行するとSSL/TLS証明書を発行する事が出来ます。
ポイントは赤字部分で、このオプションを指定しないとAmazon Linux 2は対応してないと怒られます(いずれは対応されるかもです)。

$ sudo ~/certbot/certbot-auto --no-bootstrap certonly --webroot -w /usr/share/nginx/html -d example.com -m test@example.com --agree-tos

再び/etc/nginx/nginx.confの編集

発行された証明書を赤字部分で指定してあげます。

server {
    listen       80;
    server_name  xxx;
    return 301 https://$host$request_uri;	
}

# Settings for a TLS enabled server.

server {
    listen       443 ssl;
    server_name  xxx;
    root         /usr/share/nginx/html;

    ssl_certificate "/etc/letsencrypt/live/example.com/fullchain.pem";
    ssl_certificate_key "/etc/letsencrypt/live/example.com/privkey.pem";

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

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

    location / {
            proxy_set_header Host $http_host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        	
	    proxy_pass http://xxxxxx:xxxx;
    }

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

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

Nginxをリロードします。

$ sudo systemctl reload nginx.service
sponsor