「SAVACAN」担当のMKです。
最近、 SSL/TLS証明書の有効期間が47日に短縮される方針が決まり、2026年から段階的に導入される というニュースが発表されました。これにより、将来的に証明書の更新をより頻繁に管理しなければならなくなります。多くの方が、年1回の手動対応で運用されている事と思いますが、最終的に47日ごとの対応が発生するため、手動対応は現実的でなくなってきます。
そこで今回は技術的な検証として、Let’s Encryptのワイルドカード証明書を利用した証明書の自動更新を試みましたので、その手順と結果についてご紹介致します。
検証した構成としては以下になります。
- DNS:IIJのDNSプラットフォームサービス
- IIJで利用するサービス:DNSプラットフォームサービス、API、IDサービス
- OS:Almalinux8
- WEBサーバー:Nginx、Apache、legoをインストール
- SSL証明書:Let’s Encryptのワイルドカード証明書
以前のブログ記事では、CertbotというACMEクライアントを使用してSSL証明書を発行する方法についてご紹介しました。今回は、IIJのDNSを利用したDNS認証によるSSL証明書の発行方法に関して、legoというACMEクライアントを使用する手順をご紹介いたします。
さらに、ワイルドカード証明書の発行においては、DNS-01チャレンジというDNS認証が必要になることをご説明しましたが、従来のHTTP-01チャレンジとの違いについても、改めてご説明いたします。
legoとは何か
Legoは、Certbotと同様にACMEクライアントの一種です。ACMEとは、SSL/TLS証明書の管理を自動化するためのプロトコルで、証明書の取得や更新を効率的に行うことができます。
IIJのDNSプラットフォームサービスはLegoに対応しているという事で、今回はlegoにて検証していきます。
・参考URL(IIJでのlego利用方法)
https://eng-blog.iij.ad.jp/archives/13861
DNS-01チャレンジとHTTP-01チャレンジの違い
今回のブログの主題からは外れますが、SSL発行の際に必要となる認証の種類について簡単にご説明させて頂きます。
いずれも、認証申請者がドメイン管理者であることを証明する為のものになります。
DNS-01チャレンジとは
対象ドメインを管理しているDNSのTXTレコードに、指定した値を設定することを求める認証手法です。
Let’s Encryptのワイルドカード証明書を利用する場合、このDNS-01チャレンジが必須となります。
今回は、SSL証明書更新時のDNS-01チャレンジを自動化するため、IIJが提供するAPIサービスを活用します。
HTTP-01チャレンジとは
ウェブサーバーの公開領域(http(s)://yourdomain.com/.well-known/acme-challenge/~)に、認証ファイルを配置することで認証を行う方法です。一般的に認証ファイルはacmeクライアントが直接操作します。
認証ファイルはLet’s Encriptの認証サーバーから直接アクセスできる必要があります。認証ファイルへのアクセス途中、301 or 302リダイレクトを挟むと認証が通らない場合があります。
HTTP-01チャレンジでは、Let’s Encryptのワイルドカード証明書を発行することはできません。
それでは手順についてご紹介させて頂きます。
IIJ側の設定
はじめに、IIJの契約サービスおよび設定方法についてご説明いたします。このブログでは、IIJのDNSプラットフォームサービスがすでに契約済みであることを前提に進めていきます。
なお、IIJの管理画面やインターフェースは、予告なく変更されることがあります。そのため、最新の情報についてはIIJの公式マニュアルをご確認いただくことをお勧めします。マニュアルへのリンクは以下にてご案内いたします。
IIJ IDサービスの申請
DNS設定変更のために、LegoからAPI経由でIIJのDNS設定を行うには、まずIIJ IDサービスの契約が必要です。こちらの契約手続きは、オンラインで簡単に完了することができ、本ブログ作成時点では初期費用や月額費用は無料となっています。
契約手続きの詳細については、IIJの公式マニュアルにて詳しくご案内されていますので、そちらを参照の上、手続きを進めてください。
・参考URL(オンライン申込)
https://manual.iij.jp/iid/contract-help/29426374.html
IIJ IDサービス設定
次にIDサービスで利用するドメインの設定をします。
登録するドメインへのTXTレコードの登録が必要になります。こちらもIIJのマニュアルで詳しく説明されています。
・参考URL(サービスマニュアル)
https://manual.iij.jp/iid/admin-help/9054101.html
IIJ IDサービスでIIJ DNSプラットフォームサービスとの連携
最後にlegoで指定するアクセストークンの発行をします。
画面右上のユーザーIDをクリックし[アクセストークンの管理]→[アクセストークン]をクリックします。

表示された次の画面で[アクセストークンを発行]をクリックします。

以下の通り入力します。
アクセストークン名:任意
利用するリソースサーバ:IIJ DNSプラットフォームサービス APIをプルダウンで選択
許可するスコープ:dpf_read, dpf_writeの2種類を指定

発行するとアクセストークンが表示されます。後からもう一度確認することができませんので表示されているアクセストークンを控えて[閉じる]をクリックします。
以上でIIJ側の設定は完了です。
次にOS側の設定についてご説明させて頂きます。
legoインストール
前提として、Almalinux8のインストールとNginx、Apacheの導入は済んでいるものとします。
以下のコマンドを実行し、legoをインストールします。
この手順では/root/直下にインストールしています。
cd
wget https://github.com/go-acme/lego/releases/download/v4.23.1/lego_v4.23.1_linux_amd64.tar.gz
tar -xvzf lego_v4.23.1_linux_amd64.tar.gz
mv lego /usr/local/bin/
chmod +x /usr/local/bin/lego
インストールが完了したらバージョンを確認します。
[root@lego ~]# lego --version
lego version 4.23.1 linux/amd64
[root@lego ~]#
legoからLet’s Encryptのワイルドカード証明書発行
legoのインストールが完了したらLet’s Encryptのワイルドカード証明書を発行することができます。
アクセストークン・サービスコード・メールアドレス・ドメインをご利用中の環境に合わせて以下のコマンドを実行します。
IIJ_DPF_API_TOKEN="アクセストークン" IIJ_DPF_DPM_SERVICE_CODE="対象ドメインのサービスコード" lego -m メールアドレス --dns iijdpf -d '*.yourdomain.com' -d yourdomain.com run
IIJ DNSプラットフォームサービスを利用している場合 – -dns には iijdpf を指定します。
詳しくは、下記のlegoのIIJ DNSプラットフォームサービスの設定内容を参照して確認できます。
https://go-acme.github.io/lego/dns/iijdpf/index.html
証明書が発行できたら作成されたファイルを確認します。
[root@lego ~]# lego list
Found the following certs:
Certificate Name: *.yourdomain.com
Domains: *.yourdomain.com, yourdomain.com
Expiry Date: 2025-08-10 04:21:14 +0000 UTC
Certificate Path: /root/.lego/certificates/_.yourdomain.com.crt
[root@lego ~]#
[root@lego ~]# ls -al /root/.lego/certificates/
合計 16
drwx------ 2 root root 122 5月 12 14:19 .
drwx------ 4 root root 42 5月 12 12:59 ..
-rw------- 1 root root 2877 5月 12 14:19 _.yourdomain.com.crt # SSL証明書+中間証明書
-rw------- 1 root root 1567 5月 12 14:19 _.yourdomain.com.issuer.crt # 中間証明書
-rw------- 1 root root 236 5月 12 14:19 _.yourdomain.com.json # 証明書メタデータ
-rw------- 1 root root 227 5月 12 14:19 _.yourdomain.com.key # 秘密鍵
[root@lego ~]#
WEBサーバーにSSL証明書を設定
nginxの設定で必要な証明書は以下になります。
ssl_certificate /root/.lego/certificates/_.yourdomain.com.crt;
ssl_certificate_key /root/.lego/certificates/_.yourdomain.com.key;
httpdの設定で必要な証明書は以下になります。
SSLCertificateFile /root/.lego/certificates/_.yourdomain.com.crt
SSLCertificateKeyFile /root/.lego/certificates/_.yourdomain.com.key
SSLCertificateChainFile /root/.lego/certificates/_.yourdomain.com.issuer.crt
自動更新設定
自動化するためにSSL証明書の更新をrootユーザーのcronに設定します。
crontab -e
nginxの場合
cronに「systemctl reload nginx」まで記載して、新しいSSL証明書を読み込み直します。
0 0 1 * * IIJ_DPF_API_TOKEN="アクセストークン" IIJ_DPF_DPM_SERVICE_CODE="対象ドメインのサービスコード" lego --dns iijdpf --email "メールアドレス" --domains "*.yourdomain.com" --domains "yourdomain.com" renew && systemctl reload nginx
httpdの場合
デフォルトであればログのローテーション時にreloadされます。reload時に新しいSSL証明書を読み込み直しますので、再起動は不要です。
0 0 1 * * IIJ_DPF_API_TOKEN="アクセストークン" IIJ_DPF_DPM_SERVICE_CODE="対象ドメインのサービスコード" lego --dns iijdpf --email "メールアドレス" --domains "*.yourdomain.com" --domains "yourdomain.com" renew
手動でコマンドを実行したところ、SSL証明書を発行したばかりですので現時点では自動更新されません。
下記メッセージは、SSLの更新定義日数は30日となっているが、有効期限は残り88日なので更新しなかった、という内容。
12025/05/15 11:01:04 [INFO] [*.yourdomain.com] acme: renewalInfo endpoint indicates that renewal is not needed
2025/05/15 11:01:04 [*.yourdomain.com] The certificate expires in 88 days, the number of days defined to perform the renewal is 30: no renewal.
残り30日を切ったら自動更新が実施されるので、成功しましたら改めてブログを更新したいと思います!
最後に
今回は直近で検証した内容のご紹介をさせて頂きました。
SSL/TLS証明書の有効期間が47日に短縮される指針の決定は比較的最近であり、現時点で自動更新機能付きのSSL証明書は高額なものが多いため、無料で利用可能なLet’s Encryptのワイルドカード証明書にて自動化手順を検証しました。
期限の短縮は段階的に進みますので、今後各SSL/TLS証明書提供企業の対応が進み、新たな手順、サービスなど発表されるかと思います。今後、各種ご要望に対応できるよう情報収集と検証/調査を続けてまいります。