🐙

SSL証明書を取得してみる(Let’s Encrypt)

2024/08/04に公開

目的

webサーバを、HTTPS接続できるように「Let's Encrypt」という認証局の無料の証明書を使用して実現する。

環境

OS: AmazonLinux2023
webサーバ: nginx

手順

1,必要なパッケージをインストールする。

sudo dnf install -y python3 augeas-libs pip

2,pythonの仮想環境を作成し、Certbotをインストールする。

python3 -m venv /opt/certbot/ #仮想環境作成
/opt/certbot/bin/pip install --upgrade pip #仮想環境内のpipを最新版にアップグレード
/opt/certbot/bin/pip install certbot #仮想環境内にCertbotをインストール
sudo ln -s /opt/certbot/bin/certbot /usr/bin/certbot #リンク作成

説明
・pythonの仮想環境を作成して、プロジェクトごとに独立した環境にすることによって、依存関係の管理や互換性やセキュリティの面でメリットがあります。
・pipとは、pythonのパッケージ管理ツールです。
・Certbotとは、Let's Encryptから証明書を自動的に発行、更新できるツールです。
・4行目の、certbotの実行ファイルを/usr/binにソフトリンクを作成することによって、実行する際に絶対パスを記述しなくてよくなります。

3,certbotがポート80を利用するのでnginxを停止します

sudo systemctl stop nginx

4,certbotを実行して証明書取得!(ドメイン設定終わってる前提。また、今回行うcertbotのスタンドアロン設定では、certbot自体がwebサーバとして動くため、ポート80が空いている前提)

sudo certbot certonly --standalone -d (ドメイン名)

このコマンドから設定します。初めてであればメアドや利用規約への同意を求められます。
成功したら/etc/letsencrypt/live/(ドメイン名)/にpamファイルが格納されているはず

5,nginxの設定ファイルを書き換える

serverの箇所に書き換える箇所があるので以下に記載します。

server {
    listen 443 ssl;
    server_name (サーバー名 例:example.jp);
    ssl_certificate /etc/letsencrypt/live/(ドメイン名)/fullchain.pem; #証明書パス
    ssl_certificate_key /etc/letsencrypt/live/(ドメイン名)/privkey.pem; #秘密鍵パス
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

6,nginxを再起動(開始)

設定を反映させます

sudo systemctl start(restart) nginx

7,証明書の自動更新をcronで設定

なんとAmazonLinux2023にはデフォルトでcrondがない!!!ので、

sudo dnf install cronie
sudo systemctl enable crond
sudo systemctl start crond

cronieではなく、cronie-noanacronをインストールする選択肢もあります。cronieはanacronを含んでいて、インスタンスが起動されている間に実行されなかったジョブを、次回システムが起動したタイミングで実行します。cronie-noanacronはanacronを含んでいないので、一般的?なcronに近いです。

そしてcron設定をcrontab -eで行います。(自分はいつもEDITOR=vi crontab -eってしてます)

30 1 * * * /usr/bin/certbot renew --post-hook "systemctl reload nginx"

--post-hookオプションは、証明書更新が成功したらこのコマンドを行いますよというオプション

できた!

ブラウザでhttps://(アドレス)で表示できます。

Discussion