以前の記事で Amazon Linux2 に Let’s Encrypt をインストールする記事を書きましたが、先日(2023年3月15日)Amazon Linux 2023 が発表されましたのでこちらにインストールする手順を紹介したいと思います。
参考: AWS EC2 に Let’s Encrypt をインストールする
インストール前準備
まずは必要となるパッケージをインストールします。
>dnf install -y python3 augeas-libs pip
Python の仮想環境を/opt
にセットアップし、pip の最新と certbot をインストールします。
>python3 -m venv /opt/certbot/
>/opt/certbot/bin/pip install --upgrade pip
>/opt/certbot/bin/pip install certbot
>ln -s /opt/certbot/bin/certbot /usr/bin/certbot # /usr/binにリンクしてPATHを通す
Web サーバが起動中であれば、これを止めます。
>systemctl stop httpd # Apache
>systemctl stop nginx # Nginx
Certbot の実行
スタンドアローンモードで Certbot を実行します。
>certbot certonly --standalone
上記コマンド実行後、Certbot は以下の内容を聞いてきますのでそれに答えます。
以下はその内容と回答例です。
1) 証明書の期限切れを通知するメールアドレス
→ メールアドレスを入力します。
2) 利用規約に同意しますか?
→ Y(同意します)
3) メールアドレス情報を共有しますか?
→ N(共有しません)
4) 証明書に記載するドメイン名を入力してください。
→ example.com(ドメイン名を入力)
Successfully received certificate. と出力されれば完了です。
これで SSL 証明書が取得できました。
証明書は/etc/letsencrypt/live/{ドメイン名}
配下に作成されます。
次に証明書を Apache や Nginx の設定ファイルに設定します。
Apache の例
<VirtualHost *:443>
ServerName example.com
DocumentRoot /var/www/html
SSLEngine on # ★
SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem # ★
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem # ★
SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem # ★
</VirtualHost>
Nginx の例
server {
...
server_name example.com;
root /var/www/html;
listen 443 ssl; # ★
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # ★
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # ★
...
}
あとは、web サーバを起動して完了です。
>systemctl start httpd # Apache
>systemctl start nginx # Nginx
証明書の更新
Let’s Encrypt で取得した証明書は有効期限が3ヶ月であるため、証明書の有効期限を延長します。
更新は certbot コマンドでできますが、3ヶ月ごとに更新作業をするのも面倒なので、cron
にまかせましょう。
Amazon Linux 2023 にはなぜかcron
が入っていないので、まずはこれをインストールし起動します。
>dnf install cronie-noanacron
>systemctl enable crond
>systemctl start crond
更新処理後は、web サーバの reload が必要になりますので、certbot の hook オプションを利用しましょう。
>crontab -e
# 毎日1:30に更新
30 1 * * * root certbot renew --post-hook "systemctl reload httpd" --no-self-upgrade # Apache
30 1 * * * root certbot renew --post-hook "systemctl reload nginx" --no-self-upgrade # Nginx
更新時に以下のようなエラーが発生する場合、Apache プラグインや Nginx プラグインが必要です。
>certbot renew
Failed to renew certificate example.com with error: Could not bind TCP port 80 because it is already in use by another process on this system (such as a web server). Please stop the program in question and then try again.
>certbot renew -apache
Failed to renew certificate exapmle.com with error: The requested apache plugin does not appear to be installed
Amazon Linux 2023 だとデフォルトでこれらのプラグインがインストールできないようでした。
一旦 Web サーバを止めれば更新できるので、以下のようなシェルスクリプトを作成してこれを実行するようにしましょう。
#!/bin/bash
systemctl stop httpd
certbot renew --no-self-upgrade
systemctl start httpd
>crontab -e
# 毎日1:30に更新
30 1 * * * root /root/updateSSL.sh
ちなみに、AWS のサイトに Let’s Encrypt についての記事が載っています。
Certbot は Amazon Linux 2023 で公式にサポートされていませんが、ダウンロードすることができ、インストールすると正常に機能します。
Certificate Automation: Amazon Linux 2023 での Let’s Encrypt と Certbot の使用
コメント