以前「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