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

Azure,DNS

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

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

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

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

※確認には、Rocky Linux release 8.9 (Green Obsidian)を使用しています。
※Azure DNSを使用して手順確認しています。

スポンサーリンク

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
      • ACMEプロトコルのTLS拡張を利用して証明書の認証を行う方法
      • WebサーバーがHTTPSをサポートし、指定されたTLS拡張が有効である必要がある

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

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

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

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

Getting Started

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

パッケージをインストール

epelリポジトリ(epel-release)をインストールします。

[root@test-vm-01 ~]# dnf -y install epel-release
Last metadata expiration check: 0:05:01 ago on Sat 10 Feb 2024 06:30:10 AM UTC.
Dependencies resolved.
================================================================================
Package Architecture Version Repository Size
================================================================================
Installing:
epel-release noarch 8-18.el8 extras 24 k

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

~(以下略)~

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

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

[root@test-vm-01 ~]# dnf –enablerepo=epel -y install snapd
Last metadata expiration check: 0:06:54 ago on Sat 10 Feb 2024 06:39:18 AM UTC.
Dependencies resolved.
================================================================================
Package Architecture Version Repository Size
================================================================================
Installing:
snapd x86_64 2.61.1-0.el8 epel 18 M
Installing dependencies:
bash-completion noarch 1:2.7-5.el8 baseos 272 k
libpkgconf x86_64 1.4.2-1.el8 baseos 34 k
pkgconf x86_64 1.4.2-1.el8 baseos 37 k
pkgconf-m4 noarch 1.4.2-1.el8 baseos 16 k
pkgconf-pkg-config x86_64 1.4.2-1.el8 baseos 14 k
snap-confine x86_64 2.61.1-0.el8 epel 3.8 M
snapd-selinux noarch 2.61.1-0.el8 epel 560 k

Transaction Summary
================================================================================
Install 8 Packages

~(以下略)~

snapを設定します。

[root@test-vm-01 ~]# ln -s /var/lib/snapd/snap /snap 
[root@test-vm-01 ~]# echo 'export PATH=$PATH:/var/lib/snapd/snap/bin’ > /etc/profile.d/snap.sh
[root@test-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@test-vm-01 ~]# snap install certbot –classic
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 2.8.0 from Certbot Project (certbot-eff?) installed
[root@test-vm-01 ~]# snap list
Name Version Rev Tracking Publisher Notes
certbot 2.8.0 3566 latest/stable certbot-eff? classic
core 16-2.60.4 16202 latest/stable canonical? core
core20 20231123 2105 latest/stable canonical? base

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

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

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

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

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

※手順のサンプルドメインはwww.example.comとしています。
※パスが正常に通っていない場合は、/snap/bin/配下で./certbotとしてコマンドを実行してください。

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

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
(Enter 'c’ to cancel): メールアドレス(admin@example.com) # 管理者のメールアドレス

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.4-April-3-2024.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:

nIDG1NUDpaV—————xp-0pq10rgiPDPM96_lDc # 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実行時に表示された値を設定します。

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

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 2024-05-10.
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@test-vm-01 ~]# ls -l /etc/letsencrypt/live/www.example.com/
total 4
lrwxrwxrwx. 1 root root 45 Feb 10 00:40 cert.pem -> ../../archive/www.example.com/cert.pem
lrwxrwxrwx. 1 root root 46 Feb 10 00:40 chain.pem -> ../../archive/www.example.com/chain.pem
lrwxrwxrwx. 1 root root 50 Feb 10 00:40 fullchain.pem -> ../../archive/www.example.com/fullchain.pem
lrwxrwxrwx. 1 root root 48 Feb 10 00:40 privkey.pem -> ../../archive/www.example.com/privkey.pem
-rw-r–r–. 1 root root 692 Feb 10 00:40 README

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

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

    • -export : PFX形式に変換
    • -inkey : 秘密鍵ファイルを指定
    • -in : 証明書ファイルを指定
    • -out : 出力するPFX形式ファイル名を指定
pem形式からpfx形式に変換

[root@test-vm-01 ~]# cd /etc/letsencrypt/live/www.example.com/
[root@test-vm-01 www.example.com]# openssl pkcs12 -export -inkey privkey.pem -in cert.pem -out example.pfx
Enter Export Password:
Verifying – Enter Export Password:
[root@test-vm-01 www.example.com]# ls -l |grep pfx
-rw——-. 1 root root 1.6K Feb 10 00:55 example.pfx

—広告—

キーコンテナー(Azure Key Vault)で証明書管理

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

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

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

キーコンテナー(Key Vault)で証明書を操作するためには、権限の付与が必要です。
事前に割り当てておきます。

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

左側のメニューで証明書を選択します。
生成/インポートを選択します。
証明書の作成方法でインポートを選択します。
証明書の名前は管理用の名前です。
発行したSSL証明書(pfx形式)をアップロードします。
パスワードにはpfx形式に変換した際に設定したパスワードを入力します。
アップロードが完了すると、証明書が一覧に表示されます。

最後に

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

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

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

スポンサーリンク