ドメイン認証は、認証局に対してドメインの所有者であることを証明するプロセスであり、証明書が正しいドメイン所有者にのみ発行されることを保証するための重要な仕組みです。ACMEによる証明書自動更新では、ドメイン所有者証明のために、主にHTTP認証(HTTP-01)またはDNS認証(DNS-01)が利用されます。以前の記事では、ACMEクライアント「Certbot」を使用し、HTTP認証によって証明書を自動更新する方法をご紹介しました。しかし、システムの環境によってはDNS認証でドメイン認証に対応しなければならないケースがあります。

そこで今回は、DNS認証による証明書の自動更新を、ACMEクライアント「LEGO」 とAWS Route53を利用してご紹介します。本記事では、弊社の証明書管理プラットフォームAtlasのACMEインターフェースを利用します。

使用した環境

  • OS:Ubuntu 24.04.3 LTS
  • Webサーバ:Apache/2.4.58 (Ubuntu)
  • ACME クライアント:lego 4.9.1-2ubuntu0.24.04.3
  • DNS:AWS Route53

 

HTTP認証、DNS認証の違い

HTTP認証は、HTTP(TCP 80番ポート)を用いて、申請者が当該ドメインを管理していることを認証する方式です。申請者は、認証局が払い出した認証用文字列を、当該ドメイン配下の所定の URLにHTTP 経由で公開し、認証局はその URL にアクセスして正しい応答が返ることを確認します。

一方、DNS認証はDNS設定で申請者が当該ドメインを管理していることを認証する方式です。申請者はDNSに、認証局が払い出した認証用文字列を、当該ドメインのTXT レコードに追加して認証局がそのレコードを参照することでドメインの所有を確認します。

以下は、HTTP認証とDNS認証の比較です。

認証方式 認証フロー 特徴
HTTP認証
  1. ①ドメイン認証リクエスト
  2. ②認証局が認証用文字列を発行
  3. ③Webサーバの特定のディレクトリに認証用文字列が書き込まれたテキストファイルを配置
  4. ④認証局がHTTP通信で配置したファイルを確認
  5. ⑤認証完了
  • ✓ DNSへの設定が不要でWebサーバへのファイル配置で完結
DNS認証
  1. ①ドメイン認証リクエスト
  2. ②認証局が認証用文字列を発行
  3. ③認証用文字列を、対象ドメインのDNS TXTレコードに追加
  4. ④認証局がTXTレコードを参照し認証を実施
  5. ⑤認証完了
  • ✓ ワイルドカードの証明書が発行可能
  • ✓ Webサーバへのインバウンドの通信の許可が不要

比較表からわかる通り、ワイルドカードの証明書の発行や認証局からのインバウンドのHTTP通信が許可できない場合などはDNS認証でしか対応できないケースがあります。

以降では、ACMEクライアント(LEGO)とDNS認証で証明書自動更新するための具体的な手順を紹介します。

※本例はあくまで検証用として作成した弊社の独自の環境を前提としております。
お客様の環境によって実行するコマンドや設定等が異なる場合がございますので、参考情報としてご覧ください。

自動更新の設定手順

LEGOのインストール

LEGOのインストールについては公式ドキュメントを参照してください。

バイナリファイルを直接インストールする方法やパッケージマネージャーやgitでインストールする方法などがありますので、自身の環境に合わせたインストール方法を選択します。今回利用したUbuntu検証環境では、パッケージマネージャー経由でのインストールが可能でしたのでその例をご紹介します。

以下はパッケージマネージャーでlegoをインストールできるか確認した際のコマンド例です。

apt search lego
lego/noble-updates,noble-security,now 4.9.1-2ubuntu0.24.04.3 amd64
  Let's Encrypt client

それではLEGOをインストールします。以下はインストールのコマンド例です。

sudo apt update
sudo apt install lego

最後にlegoのバージョン確認コマンドでインストールされたこと確認します。

lego -v
lego version dev linux/amd64

バージョンが出力されればLEGOのインストールは完了です。

AtlasポータルからAPI Key(EAB Key ID)とMAC Key(HMAC Key)を取得

こちらの方法については、以前紹介している記事がありますので、そちらを参照してください。
※取得したAPI Key(EAB Key ID)とMAC Key(HMAC Key)は後程利用します。

AWS Route53とLEGOの連携

LEGOは多くのDNSに対応しております。LEGOが対応しているDNSの一覧はこちらに記載されています。

今回はその中のAWS Route53を利用します。
LEGOがRoute53でDNS認証を完了させるためにはアクセスキー、シークレットアクセスキーが必要です。そこで、AWSでのアクセスキーとシークレットアクセスキーの作成方法について簡単に紹介します。

まずは、AWSのIAMにてポリシーを作成します。
ポリシーに設定する値はLEGOの公式ドキュメントにサンプルがありますので、そちらを参照ください。公式ドキュメントを参考に以下のようにポリシーを設定し、任意の名前をつけて保存します。
※今回は検証のため細かい条件などは設定していません。

ACME DNS1.png
ACME DNS2.png


次に、IAMにてユーザーを作成します。ユーザー作成画面にて先ほど作成したポリシーをアタッチし保存します。

ACME DNS3.png


作成したユーザー画面から「アクセスキーを作成」を押下します。

ACME DNS4.png


ユースケースはローカルコード選択します。

ACME DNS5.png

任意の説明タグを入力後、アクセスキー、シークレットアクセスキーが生成されます。これらの値は後ほど使用します。

作成したアクセスキー、シークレットアクセスキーはサーバの環境変数として設定します。
設定ファイルを開きます。以下はコマンド例です。
※お使いのシェルで使い分けてください。

vi ~/.profile

末尾に環境変数を追加し保存します。先ほど生成したアクセスキーをAWS_ACCESS_KEY_IDへ、シークレットアクセスキーをAWS_SECRET_ACCESS_KEYに設定します。

export AWS_ACCESS_KEY_ID="xxxxxxx"
export AWS_SECRET_ACCESS_KEY="xxxxxxx"

以下のコマンドで、変更内容を反映します。

source ~/.profile

最後に変更内容が反映されているかをechoコマンドで確認します。

echo "$AWS_ACCESS_KEY_ID"
xxxxxx
echo "$AWS_SECRET_ACCESS_KEY"
xxxxxx

設定ファイルに追加した値が表示されていれば成功です。

LEGOとAtlasのアカウント連携/証明書の発行とバインド

それでは、実際に証明書を発行していきます。
ACMEクライアントのCertbotの場合はAtlasのアカウント連携と証明書の発行を別々のコマンドで実行するのですが、 LEGOの場合はこれらを1つのコマンドで実行します。

以下は、証明書の発行とアカウント連携のコマンド例です。

lego \
  --accept-tos \
  --email="hoge@globalsign.com" \
  --dns="route53" \
  --domains="example.com" \
  --eab -kid "xxxxxx" \
 --hmac "xxxxxx" \
  --server "https://emea.acme.atlas.globalsign.com/directory" \
  --path "/path/hoge/" \
  --key-type "rsa2048" \
  run

以下は、コマンドとオプションの詳細です。

コマンド/オプション 説明
--accept-tos Globalsignの利用規約に同意します。
--email ACMEアカウントに設定するメールアドレスを指定します。
--dns DNS認証に使用するDNSプロバイダを指定します。
--domains 証明書を発行するドメイン名(FQDN)を指定します。
--eab 商用の認証局のACMEと連携することを指定します。
--kid ACMEアカウントの認証情報を指定します。(Key ID)
※Atlasポータルから取得
--hmac ACMEアカウントの認証情報を指定します。(ACME MAC)
※Atlasポータルから取得
--server AtlasのACMEサーバのURLを指定します。
--path 証明書・鍵・アカウント情報を保存するディレクトリを指定します。
--key-type 生成する秘密鍵のタイプ/鍵長を指定します。
run アカウントの登録、証明書の発行インストールをします。

アカウント連携と証明書の発行が成功すると以下のようなメッセージが表示されます。

Your account credentials have been saved in your Let's Encrypt
configuration directory at "/path/hoge/accounts".
2025/12/08 02:55:44 [INFO] [exmample.com] Server responded with a certificate.

証明書と秘密鍵が生成されているか確認します。--pathで指定したディレクトリの/certificatesの配下に以下のように格納されます。

$ ls -la /path/hoge/certificates
total 24
drwx------ 2 ubuntu ubuntu 4096 Dec  8 01:53 .
drwxrwxrwx 4 root   root   4096 Dec  8 02:55 ..
-rw------- 1 ubuntu ubuntu 3806 Dec  8 03:16 example.com.crt
-rw------- 1 ubuntu ubuntu 1643 Dec  8 03:16 example.com.issuer.crt
-rw------- 1 ubuntu ubuntu  243 Dec  8 03:16 example.com.json
-rw------- 1 ubuntu ubuntu 1679 Dec  8 03:16 example.com.key

example.com.crtが証明書、example.com.keyが秘密鍵になります。

LEGOで発行された証明書と秘密鍵のファイルパスをApacheの証明書設定ファイルに記載します。
以下は設定例になります。

サーバ証明書
 SSLCertificateFile /path/hoge/certificates/example.com.crt
 秘密鍵
 SSLCertificateKeyFile /path/hoge/certificates/example.com.key

Apacheを再読み込みします。

systemctl reload apache2

ブラウザを確認し、証明書が反映されていれば成功です。

自動更新設定

最後に証明書更新コマンドをcron等で定期実行できるように設定します。
以下はcronに設定するコマンド例です。--pathオプションには前の手順で実行したlegoコマンドの--pathの値と同じものを設定します。

lego \
  --accept-tos \
  --email "hoge@globalsign.com" \
  --dns "route53" \
  --domains "example.com" \
  --eab \
  --kid "xxxxxx" \
  --hmac "xxxxxx" \
  --server "https://emea.acme.atlas.globalsign.com/directory" \
  --path "/path/hoge/" \
  --key-type "rsa2048" \
  renew \
    --renew-hook "sudo /usr/sbin/apachectl graceful" \
    --days 30

以下がオプションとコマンドの詳細になります。
※すでに説明済みのものは省略しています。

コマンド/オプション 説明
renew 証明書の更新をします。
--renew-hook 証明書更新成功後、実行するコマンドを指定します。今回はApacheの再読み込みを設定しています。
--days 証明書の残日数が指定した数値を下回っていた場合は更新するように設定します。

証明書更新コマンドをcronで設定します。下記コマンドを実施し、cronの設定画面を開きます。

crontab -e
0 0 1 * * LEGO証明書更新コマンド

※上記は毎月1日0時に処理が実行される設定例です。任意の値を設定してください。

まとめ

本記事では、ACMEクライアント「LEGO」とAWS Route53を使用したDNS認証によるサーバ証明書の自動更新方法を紹介しました。手動更新の場合、運用負荷が高くなり、更新漏れによるサイト障害のリスクもあるため、自動更新への移行が求められています。特に、HTTP認証では対応できないケース(ワイルドカード証明書の発行や、認証局からのインバウンド通信を許可できない環境など)において、DNS認証は有効な選択肢となります。
ACMEを活用した自動更新の仕組みを導入することで、これらの課題を解消し、サーバ証明書の有効期限切れを防ぐことができ、ウェブサイト管理者は、より安全で効率的な証明書管理を実現できます。今回の記事の内容は勿論、Atlasでの証明書発行やACMEによる証明書自動更新に関して、ご興味がありましたらお気軽にお問い合わせください。

トピック関連記事

#

2015年06月02日

ECサイトユーザの85%が危険なサイトを回避

#

2013年10月11日

Certificate and Public Key Pinning

#

2023年04月11日

GoogleのSSLサーバ証明書、有効期間90日化について

この記事を書きました

グローバルサインブログ編集部

グローバルサインカレッジ編集部
所属:GMOグローバルサイン マーケティング部
当サイトの運営・管理を担当。