はじめに
Let's Encryptで証明書を取得する方法,webサーバーを基本的にdockerコンテナで運用するのでホストでは証明書の取得だけやらせたく,webサーバーを立ち上げずに証明書を取得したい.
使用するOSはAlma linux9.6
Certbotのインストール
EPELリポジトリ(Extra Packages for Enterprise Linux)を追加・有効化
sudo yum install epel-release -y
certbotをインストールする
sudo yum install certbot -y
証明書の取得
80番ポートと443番ポートを開けておく必要がある
sudo certbot certonly --standalone -d example.com
やっていること
- Certbotが秘密鍵・公開鍵のペアを作成
-
CSR(Certificate Signing Request)
を作成 - certbotがLet's Encryptに接続
- 指定されたドメインの所有者であることを HTTP (または DNS) チャレンジで確認
- 所有確認に成功すると、Let's Encrypt が証明書(公開鍵)に 署名
- 署名済みの証明書(fullchain.pemなど)が
/etc/letsencrypt/
以下に保存される
HTTPチャレンジとは
- CertbotがLet's Encryptに
example.com
の証明書を要求 - Let's Encryptは
http://example.com/.well-known/acme-challenge/XXXXX
に指定した内容を書くように指示(ランダムな内容) - Certbotがサーバー上に指示されたファイルを配置
- Let's Encryptは指定のドメインにアクセスし,その内容が正しいか確認
- ドメインが正しいことが確認できたので証明書発行
CSRとは
- 公開鍵をCAに渡すためのフォーマット・パッケージ
- CA(認証局)に「この公開鍵を使って私の証明書を発行してください」と依頼する申請書のようなもの
- CSRは秘密鍵で署名されているため,改ざんが検知できる
証明書更新の実行時にコマンド実行
自動実行
以下の場所に実行したいスクリプトを配置しておけば,証明書の更新前や更新後などの好きなタイミングで実行することが出来る.
ディレクトリ | タイミング | 目的 |
---|---|---|
/etc/letsencrypt/renewal-hooks/pre/ |
更新前 | バックアップなど |
/etc/letsencrypt/renewal-hooks/deploy/ |
成功後 | Nginxリロードなど |
/etc/letsencrypt/renewal-hooks/post/ |
更新処理後 | ログ通知など |
例えば,dockerのwebサーバーを証明書の更新前に停止し,更新成功後に起動させたい場合
-
更新前に停止するスクリプト
/etc/letsencrypt/renewal-hooks/pre/
に配置
#!/bin/sh
docker stop nginx
-
証明書更新成功後に起動するスクリプト
/etc/letsencrypt/renewal-hooks/deploy/
に配置
#!/bin/sh
docker start nginx
それぞれ実行権限を付与する
sudo chmod +x /etc/letsencrypt/renewal-hooks/pre/stop-nginx.sh
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/start-nginx.sh
手動実行
手動で更新したい場合は以下のようにオプションを指定すれば同様のことが出来る
certbot renew \
--pre-hook "docker stop nginx" \
--deploy-hook "docker start nginx"
--pre-hook
が更新前,--post-hook
が更新問わず実行後,--deploy-hook
が更新成功後
証明書更新のテスト
sudo certbot renew --dry-run
--dry-run
はテスト実行モードなので,実際には証明書は更新せず,更新がうまくいくかのチェックをしてくれる.上記のフックスクリプトも正しく動作するか確認できる.
更新の定期実行
lets encryptの証明書の期限は90日なので1か月に一回更新を確認するためにcronで定期実行する
sudo crontab -e
毎月 1日 午前4時 に更新を実行
* 4 1 * * certbot renew