0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Certbot備忘録

Posted at

はじめに

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

やっていること

  1. Certbotが秘密鍵・公開鍵のペアを作成
  2. CSR(Certificate Signing Request)を作成
  3. certbotがLet's Encryptに接続
  4. 指定されたドメインの所有者であることを HTTP (または DNS) チャレンジで確認
  5. 所有確認に成功すると、Let's Encrypt が証明書(公開鍵)に 署名
  6. 署名済みの証明書(fullchain.pemなど)が /etc/letsencrypt/ 以下に保存される

HTTPチャレンジとは

  1. CertbotがLet's Encryptにexample.comの証明書を要求
  2. Let's Encryptはhttp://example.com/.well-known/acme-challenge/XXXXX に指定した内容を書くように指示(ランダムな内容)
  3. Certbotがサーバー上に指示されたファイルを配置
  4. Let's Encryptは指定のドメインにアクセスし,その内容が正しいか確認
  5. ドメインが正しいことが確認できたので証明書発行

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/に配置
stop-nginx.sh
#!/bin/sh
docker stop nginx
  • 証明書更新成功後に起動するスクリプト
    /etc/letsencrypt/renewal-hooks/deploy/に配置
start-nginx.sh
#!/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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?