DNS認証(Webサーバーなし)でLet’s EncryptのSSL証明書を発行

2024-02-11Azure,DNS,Key Vault

Let’s EncryptのDNS-01チャレンジを利用してSSL証明書を発行する手順です。

Let’s Encryptのドメイン検証方法の一つに、DNS-01チャレンジ(DNS認証)があります。
DNS-01チャレンジでは、DNSのTXTレコードを使ったドメイン所有権の検証により、SSL証明書を発行できます。
1つの特徴として、Webサーバーを用意しなくても、SSL証明書を取得できることがあります。

今回は、SSL証明書発行に必要なパッケージのインストールから証明書発行までの手順を紹介しています。
pem形式からpfx形式への変換方法や、キーコンテナー(Azure Key Vault)へのアップロード手順についても紹介しています。

    • SSL証明書発行に必要なパッケージ(Certbot、snapd)のインストール手順
    • DNS-01チャレンジを利用したSSL証明書発行手順
    • pem形式からpfx形式への変換手順
    • キーコンテナー(Azure Key Vault)へのアップロード手順

※DNSには、Azure DNSを利用しています。
※本記事内では、一部を除きAzure Key Vaultをキーコンテナーとして表記しています。

スポンサーリンク

DNS-01チャレンジでLet’s EncryptのSSL証明書を発行

証明書発行方法は大きく分けて3種類

Let’s Encryptの証明書発行時のドメイン検証方法には、大きく分けて3種類があります。

チャレンジの種類(Let’s Encrypt)

    • HTTP-01 チャレンジ
      • Webサーバーを利用して証明書を発行する方法
      • standaloneモードを使用すれば、Certbot内で起動するWebサーバーを利用して証明書発行が可能
      • 外部から80番ポートへのアクセスが許可されている必要があります
    • DNS-01チャレンジ
      • DNSのTXTレコードを利用して証明書を発行する方法
      • Webサーバーがなくても証明書の発行が可能
    • TLS-ALPN-01
      • TLSハンドシェイク時のALPN拡張を利用して証明書の認証を行う方法
      • 外部から443番ポートへのアクセスが許可されている必要があります

今回はDNS-01チャレンジを利用したSSL証明書発行手順を紹介します。

HTTP-01 チャレンジでの証明書発行手順については、こちらで紹介しています。

今回の手順で使用したバージョン

今回の手順で使用したバージョンです。

    • OS
      • Rocky Linux release 9.7 (Blue Onyx)
    • パッケージ
      • snapd : 2.72-1.el9
      • snap : 2.72-1.el9
      • certbot : 5.3.1

証明書発行に必要なパッケージのインストール

証明書発行に必要なパッケージをインストールします。
公式サイトで推奨されているCertbot(ACMEクライアント)を使用します。

Getting Started

Let’s Encryptの証明書発行に必要なCertbotをインストールします。
Certbotのインストールに必要なsnapd、およびsnapdのインストールに必要なepel-releaseも併せてインストールします。

パッケージのインストール手順

[root@vm-01 ~]# dnf -y install epel-release
Last metadata expiration check: 0:33:54 ago on Fri 06 Mar 2026 11:36:50 AM UTC.
Dependencies resolved.
Package Architecture Version Repository Size
=========================
Installing:
epel-release noarch 9-10.el9 extras 19 k

Transaction Summary
=========================
Install 1 Package

~(中略)~

Verifying : epel-release-9-10.el9.noarch 1/1

Installed:
epel-release-9-10.el9.noarch

Complete!

snapdをインストールします。
snapdのインストール手順はServer World様のサイトを参考にしています。

Snappy : インストール(Server World)

[root@vm-01 ~]# dnf –enablerepo=epel -y install snapd

Extra Packages for Enterprise Linux 9 – x86_64 7.5 MB/s | 20 MB 00:02
Extra Packages for Enterprise Linux 9 openh264 (From Cisco) – x86_64 1.3 kB/s | 2.5 kB 00:01
Dependencies resolved.
===========================
Package Architecture Version Repository Size
===========================
Installing:
snapd x86_64 2.72-1.el9 epel 19 M
Installing dependencies:
bash-completion noarch 1:2.11-5.el9 baseos 291 k
libpkgconf x86_64 1.7.3-10.el9 baseos 35 k
pkgconf x86_64 1.7.3-10.el9 baseos 40 k
pkgconf-m4 noarch 1.7.3-10.el9 baseos 14 k
pkgconf-pkg-config x86_64 1.7.3-10.el9 baseos 10 k
snap-confine x86_64 2.72-1.el9 epel 3.1 M
snapd-selinux noarch 2.72-1.el9 epel 101 k
xdelta x86_64 3.1.0-17.el9 epel 87 k

Transaction Summary
===========================
Install 9 Packages

~(中略)~

Installed:
bash-completion-1:2.11-5.el9.noarch libpkgconf-1.7.3-10.el9.x86_64 pkgconf-1.7.3-10.el9.x86_64 pkgconf-m4-1.7.3-10.el9.noarch pkgconf-pkg-config-1.7.3-10.el9.x86_64 snap-confine-2.72-1.el9.x86_64
snapd-2.72-1.el9.x86_64 snapd-selinux-2.72-1.el9.noarch xdelta-3.1.0-17.el9.x86_64

Complete!

snapを設定します。

[root@vm-01 ~]# ln -s /var/lib/snapd/snap /snap 
[root@vm-01 ~]# echo 'export PATH=$PATH:/var/lib/snapd/snap/bin’ > /etc/profile.d/snap.sh
[root@vm-01 ~]# systemctl enable –now snapd.service snapd.socket
Created symlink /etc/systemd/system/multi-user.target.wants/snapd.service → /usr/lib/systemd/system/snapd.service.
Created symlink /etc/systemd/system/sockets.target.wants/snapd.socket → /usr/lib/systemd/system/snapd.socket.

snapを使用してCertbotをインストールします。
snapコマンドの使用方法については、以下のサイトを参考にしています。

Snap(archlinux)

[root@vm-01 ~]# snap install certbot –classic
2026-03-06T11:46:01Z INFO Waiting for automatic snapd restart…
Warning: /var/lib/snapd/snap/bin was not found in your $PATH. If you’ve not restarted your session
since you installed snapd, try doing that. Please see https://forum.snapcraft.io/t/9469
for more details.

certbot 5.3.1 from Certbot Project (certbot-eff✓) installed

[root@vm-01 ~]# snap list
Name Version Rev Tracking Publisher Notes
certbot 5.3.1 5370 latest/stable certbot-eff✓ classic
core24 20260107 1349 latest/stable canonical✓ base
snapd 2.73 25935 latest/stable canonical✓ snapd

DNS-01チャレンジでSSL証明書発行

DNS-01チャレンジを使用してSSL証明書を発行します。
DNS-01チャレンジを利用する場合は、Certbot実行時に–preferred-challenges dnsオプションを指定します。
Certbot実行後に表示される値を、DNSのTXTレコードに設定します。

※DNSにはAzure DNSを使用しています。

DNS-01チャレンジでSSL証明書発行

CertbotでSSL証明書を発行します。
DNS-01チャレンジを使用する場合は–preferred-challenges dnsオプションを指定します。
-dオプションで証明書を発行するドメイン名を指定します。

※手順のサンプルドメインはwww.example.comとしています。
※PATHが通っていない場合は、/snap/bin/certbotのように絶対パスでコマンドを実行します。
–manualオプションで発行した証明書は自動更新されません。証明書の有効期限前に同じコマンドを再実行して更新する必要があります。

[root@vm-01 ~]# certbot certonly –manual -d www.example.com –preferred-challenges dns

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address or hit Enter to skip.
(Enter 'c’ to cancel): メールアドレス(admin@example.com) # 管理者のメールアドレス

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Please read the Terms of Service at:
https://letsencrypt.org/documents/LE-SA-v1.6-August-18-2025.pdf
You must agree in order to register with the ACME server. Do you agree?
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
(Y)es/(N)o: Y # 規約同意の確認

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let’s Encrypt project and the non-profit organization that
develops Certbot? We’d like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
(Y)es/(N)o: N # 案内メールの送信確認
Account registered.
Requesting a certificate for www.example.com

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Please deploy a DNS TXT record under the name:

_acme-challenge.www.example.com. # TXTレコードの名前

with the following value:

_MQcbXXXxxXXXXxxXXxxxxXXXXjM6ddI-m-7vlyXXXX # TXTレコードに設定する値

Before continuing, verify the TXT record has been deployed. Depending on the DNS
provider, this may take some time, from a few seconds to multiple minutes. You can
check if it has finished deploying with aid of online tools, such as the Google
Admin Toolbox: https://toolbox.googleapps.com/apps/dig/#TXT/_acme-challenge.www.example.com.
Look for one or more bolded line(s) below the line ';ANSWER’. It should show the
value(s) you’ve just added.

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Press Enter to Continue

DNSにTXTレコードを追加します。
名前には_acme-challenge.ドメイン名を指定します。
レコード値にはCertbot実行時に表示された値を設定します。

Azure DNSへレコード追加(Let's EncryptのDNS-01チャレンジを利用してSSL証明書を発行する手順)

追加したTXTレコードが表示されていることを確認します。

Azure DNSへ追加したレコードを表示(Let's EncryptのDNS-01チャレンジを利用してSSL証明書を発行する手順)

TXTレコード追加後にエンターキーを押して処理を再開します。
DNSのTXTレコードによるドメイン検証が完了すると、証明書ファイルが生成されます。

Press Enter to Continue # DNSにTXTレコード設定後、処理を再開します

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/www.example.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/www.example.com/privkey.pem
This certificate expires on 2026-06-0X.
These files will be updated when the certificate renews.

NEXT STEPS:
– This certificate will not be renewed automatically. Autorenewal of –manual certificates requires the use of an authentication hook script (–manual-auth-hook) but one was not provided. To renew this certificate, repeat this same certbot command before the certificate’s expiry date.

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
If you like Certbot, please consider supporting our work by:
* Donating to ISRG / Let’s Encrypt: https://letsencrypt.org/donate
* Donating to EFF: https://eff.org/donate-le
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

/etc/letsencrypt/live/ドメイン名/配下に4つのファイルが生成されます。

    • cert.pem : SSL証明書
    • chain.pem : 中間証明書
    • fullchain.pem : SSL証明書と中間証明書を連結したファイル
    • privkey.pem : 秘密鍵

[root@vm-01 ~]# ls -l /etc/letsencrypt/live/www.example.com/
-rw-r–r–. 1 root root 692 Mar 7 01:38 README
lrwxrwxrwx. 1 root root 45 Mar 7 01:38 cert.pem -> ../../archive/www.example.com/cert1.pem
lrwxrwxrwx. 1 root root 46 Mar 7 01:38 chain.pem -> ../../archive/www.example.com/chain1.pem
lrwxrwxrwx. 1 root root 50 Mar 7 01:38 fullchain.pem -> ../../archive/www.example.com/fullchain1.pem
lrwxrwxrwx. 1 root root 48 Mar 7 01:38 privkey.pem -> ../../archive/www.example.com/privkey1.pem

発行した証明書をpem形式からpfx形式に変換

発行した証明書をpfx形式に変換して利用することもできます。
opensslコマンドを使用して、pem形式からpfx(PKCS#12)形式に変換します。
pfx形式のSSL証明書名は、example.pfxとしています。

    • -export : PFX(PKCS#12)形式でエクスポート
    • -inkey : 秘密鍵ファイルを指定
    • -in : 証明書ファイルを指定
    • -certfile : 中間証明書ファイルを指定
    • -out : 出力するPFXファイル名を指定

opensslコマンドの使用方法については、以下のサイトを参考にしています。

openssl-pkcs12

pem形式からpfx形式に変換

[root@vm-01 ~]# cd /etc/letsencrypt/live/www.example.com/
[root@vm-01 www.example.com]# openssl pkcs12 -export -inkey privkey.pem -in cert.pem -certfile chain.pem -out www.example.pfx
Enter Export Password: XXXXXX #設定するパスワードを入力
Verifying – Enter Export Password: XXXXXX #設定するパスワードを再入力
[root@vm-01 www.example.com]# ls -l www.example.pfx
-rw——-. 1 root root 2752 Mar 7 01:48 www.example.pfx

※-in fullchain.pemとしても同等ですが、手順では-certfileを使用しています。

—広告—

キーコンテナー(Azure Key Vault)で発行した証明書を管理

キーコンテナーを使って証明書を管理できます。
キーコンテナーで管理することで、有効期限前に通知を受け取ったり、Azureリソースから簡単に参照したりできます。
ここでは、変換したpfx形式のSSL証明書をキーコンテナーにアップロードします。

キーコンテナーのリソース作成、証明書発行、有効期限前の通知などの手順については、こちらで紹介しています。

証明書のアップロード手順

キーコンテナーで証明書を操作するには、適切な権限が必要です。
事前にロールを割り当てておきます。

※RBACによるアクセス制御を利用しています。
※証明書管理用の権限が必要です。ここではキーコンテナー証明書責任者(Key Vault Certificates Officer)のロールを割り当てています。

キーコンテナーのアクセス権を確認(Let's EncryptのDNS-01チャレンジを利用してSSL証明書を発行する手順)
左側のメニューで証明書を選択します。
生成/インポートを選択します。
証明書の作成方法でインポートを選択します。
証明書の名前は管理用の名前です。
発行したSSL証明書(pfx形式)をアップロードします。
パスワードにはpfx形式に変換した際に設定したパスワードを入力します。
アップロードが完了すると、証明書が一覧に表示されます。
キーコンテナーで証明書設定(Let's EncryptのDNS-01チャレンジを利用してSSL証明書を発行する手順)
キーコンテナーで証明書をインポート(Let's EncryptのDNS-01チャレンジを利用してSSL証明書を発行する手順)
キーコンテナーでインポートされた証明書を表示(Let's EncryptのDNS-01チャレンジを利用してSSL証明書を発行する手順)

最後に

Let’s EncryptのDNS-01チャレンジを利用したSSL証明書の発行手順を確認しました。
DNS-01チャレンジを利用することで、Webサーバーを用意しなくてもSSL証明書を発行できます。
DNSにTXTレコードを追加する手順は必要ですが、比較的簡単に証明書を取得できるため便利かと思います。

引き続き、いろいろ試してみたいと思います。

Azure App Serviceのカスタムドメイン追加や、マネージド証明書の発行手順については、こちらで紹介しています。

スポンサーリンク