当サイトはGoogle検索にまだ表示されないためBing検索をご利用ください> Membership

Let’s Encrypt 証明書をサーバ公開できない環境で作成する方法【DNS-01チャレンジ】

本記事はアフィリエイトリンクを含んでいます。

目次

Let’s Encrypt で証明書を作成したいがサーバを公開できない

無料で信頼できる SSL 証明書を作成することができるサービスである Let’s Encrypt ですが、標準的な方法で Let’s Encrypt から証明書を取得するためには証明書を取得させる対象 Web サーバをインターネットに公開し、インターネット上からその Web サーバに対してアクセスできる状態にしておく必要があります。

しかし、以下のような状況では Web サーバをインターネットに公開することが難しいです。

インターネットへの公開が難しい状況
  • 組織の内部ネットワーク内の検証環境に Web サーバがあり外部からのアクセスが不可の場合
  • インターネット接続ルータでポートフォワーディングの設定を行うことが難しい場合
  • グローバル IP アドレスを使用できないタイプの回線を使用している場合

筆者の検証環境でも、インターネット回線として WiMAX を使用しておりグローバル IP を使用できないため Web サーバをインターネットに公開することができません。

このような環境でも Let’s Encrypt から証明書を取得できる DNS-01 チャレンジという方式があります。

以下では Let’s Encrypt から DNS-01 チャレンジで証明書を取得する方法について説明します。

Web サーバ以外のサーバ用の証明書やワイルドカード証明書も作成可能

本記事で説明する方法を使用すると、Web サーバ用証明書だけでなく、STARTTLSを使用するメールサーバ用や SSL-VPN サーバ用の証明書を作成することもできます。またドメイン内の任意のホストで使用できるワイルドカード証明書を作成することもできます。

証明書作成の前提条件

本記事で紹介する方法で証明書を作成するためには以下の条件を満たしている必要があります。

証明書作成の前提条件
  • 使用するドメインをドメイン取得サービス(お名前ドットコム等)にて取得済みであること
  • ドメインの権威 DNS サーバが存在し、任意にレコードを追加する管理権限を持っていること
  • Let’s Encrypt に対して証明書発行を要求するサーバからインターネット接続が可能であること
  • 証明書発行を要求するサーバとして RHEL 系 OS サーバを使用できること

本記事では以下のようなネットワーク環境で、証明書発行要求サーバとして CentOS Stream 9 を使用します。

また使用するドメインの取得はお名前ドットコムで取得し、権威 DNS サーバとしてお名前ドットコムの DNS サーバを使用しています。同じようにお名前ドットコムでドメインを取得したい人は以下の記事を参考にしてください。

あわせて読みたい
お名前ドットコムでドメインを無料で取得する方法と注意点 無料ドメイン取得の必要性 インフラエンジニア業務や個人の趣味でサーバの動作検証を行う際、サーバをインターネットに公開するためにドメインが必要になることがありま...

Let’s Encrypt からの証明書取得手順【DNS-01チャレンジ】

検証環境

本記事では以下の環境で検証を行っています。

  • CentOS Stream release 9
  • certbot-2.9.0-1

certbot のインストール

Let’s Encrypt を使用するために certbot をインストールします。ただしこれをインストールするためには先に epel-release をインストールしておく必要があるため、以下コマンドでこの2つを順にインストールします。

dnf -y install epel-release
dnf -y install certbot

Let’s Encrypt からの証明書の取得

以下の手順で Let’s Encrypt から証明書を取得します。

STEP
certbot コマンドの実行

Let’s Encrypt サーバに対して証明書発行を要求する以下のコマンドを実行します。特定ホスト用の証明書を取得するか、ワイルドカード証明書を取得するかでドメインの指定方法に違いがあります。

◆特定のホスト用の証明書を取得する場合

certbot certonly --manual \
 --preferred-challenges dns \
 -d <サーバFQDN> \
 -m <任意のメールアドレス> \
 --agree-tos

以下はコマンド例です。

certbot certonly --manual \
 --preferred-challenges dns \
 -d myserver.kagenokouchikusya.xyz \
 -m user01@kagenokouchikusya.xyz \
 --agree-tos

◆ワイルドカード証明書を取得する場合

certbot certonly --manual \
 --preferred-challenges dns \
 -d <*.ドメイン> -d <ドメイン>\
 -m <任意のメールアドレス> \
 --agree-tos

以下はコマンド例です。

certbot certonly --manual \
 --preferred-challenges dns \
 -d *.kagenokouchikusya.xyz -d kagenokouchikusya.xyz \
 -m user01@kagenokouchikusya.xyz \
 --agree-tos

各オプションの意味は以下の通りです。

オプション意味
certonly証明書の取得だけを行い、インストールは行わない
--manual対話的に、またはシェルスクリプトで証明書を取得する
--preferred-challenges <値>チャレンジ(認証方式)を http または dns から指定。
本記事のケースでは dns を指定
-d <値>取得したい証明書のドメインを指定。
-d を複数指定することも可能
-m <値>Let’s Encrypt からの通知を受け取る任意のメールアドレス
--agree-tosACME サーバの加入者契約に同意する
STEP
DNS サーバへの TXT レコードの追加

certbot コマンドを実行すると、以下のように DNS サーバへ追加すべき TXT レコードの内容が表示され、Enter 押下待ち状態になります。

[root@localhost ~]# certbot certonly --manual \
 --preferred-challenges dns \
 -d *.kagenokouchikusya.xyz -d kagenokouchikusya.xyz \
 -m user01@kagenokouchikusya.xyz \
 --agree-tos
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for *.kagenokouchikusya.xyz and kagenokouchikusya.xyz

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

_acme-challenge.kagenokouchikusya.xyz.

with the following value:

NPfl_MwLd2MuLXLeHq5favoSCknIBDSyi0_Ewda4Mho

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue

上記表示例の場合は以下のような TXT レコードを追加する必要があります。

_acme-challenge.kagenokouchikusya.xyz. IN TXT "NPfl_MwLd2MuLXLeHq5favoSCknIBDSyi0_Ewda4Mho"

本記事ではお名前ドットコムの DNS サーバを使用しているため、お名前ドットコムの DNS サーバ設定画面で以下の内容の TXT レコードを追加しています。

レコード追加後、任意の端末で追加したTXTレコードに対してクエリを行いレコードがインターネット上に反映されたことを確認します。Windows のコマンドプロンプトであればnslookup -type=TXT _acme-challenge.<ドメイン>で確認できます。

C:\WINDOWS\system32>nslookup -type=TXT _acme-challenge.kagenokouchikusya.xyz
サーバー:  OpenWrt.lan
Address:  192.168.179.1

権限のない回答:
_acme-challenge.kagenokouchikusya.xyz   text =

        "NPfl_MwLd2MuLXLeHq5favoSCknIBDSyi0_Ewda4Mho"

クエリに失敗する場合はまだ反映されていないので、クエリに成功するようになるまで待機します。

STEP
certbot 処理の続行と2回目の TXT レコード追加

TXTレコードが反映されたら、certbot を実行したターミナルに戻り Enter を押下します。すると2回目の TXT レコード追加が求められるため、再度 DNS サーバに TXT レコードを追加します。

Press Enter to Continue

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

_acme-challenge.kagenokouchikusya.xyz.

with the following value:

R2xFE13iMotM4IzQjNOOwh47kYedoI2ryNwwpIFL9yo

(This must be set up in addition to the previous challenges; do not remove,
replace, or undo the previous challenge tasks yet. Note that you might be
asked to create multiple distinct TXT records with the same name. This is
permitted by DNS standards.)

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.kagenokouchikusya.xyz.
Look for one or more bolded line(s) below the line ';ANSWER'. It should show the
value(s) you've just added.

- - - - - - - - - - - -

本記事では以下の TXT レコードを追加しました。

追加後、インターネット上への反映を確認します。

C:\WINDOWS\system32>nslookup -type=TXT _acme-challenge.kagenokouchikusya.xyz
サーバー:  OpenWrt.lan
Address:  192.168.179.1

権限のない回答:
_acme-challenge.kagenokouchikusya.xyz   text =

        "R2xFE13iMotM4IzQjNOOwh47kYedoI2ryNwwpIFL9yo"
_acme-challenge.kagenokouchikusya.xyz   text =

        "NPfl_MwLd2MuLXLeHq5favoSCknIBDSyi0_Ewda4Mho"

条件は不明ですが2回目の TXT レコード追加が必要ない場合もあります。

STEP
certbot 処理の続行と証明書の取得

TXTレコードが反映されたら、certbot を実行したターミナルに戻り Enter を押下します。以下のようなログが表示されれば証明書の取得が成功しています。

Press Enter to Continue

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/kagenokouchikusya.xyz/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/kagenokouchikusya.xyz/privkey.pem
This certificate expires on 2024-08-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
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[root@localhost ~]#

以下のパスに取得された証明書と秘密鍵が格納されます。

Certificate is saved at: /etc/letsencrypt/live/kagenokouchikusya.xyz/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/kagenokouchikusya.xyz/privkey.pem

上記パスは本記事の検証環境でのパスです。/etc/letsencrypt/live/ 配下のディレクトリ名は certbot コマンドのオプションで指定したドメイン名と同じになります。

上記パスのファイルはシンボリックリンクになっています。実体のファイルは以下のパスにあります。

/etc/letsencrypt/archive/kagenokouchikusya.xyz/fullchain1.pem
/etc/letsencrypt/archive/kagenokouchikusya.xyz/privkey1.pem

以上で Let’s Encrypt からの証明書の取得は完了です。

備考

  • Let’s Encrypt によって発行される証明書の有効期間は3カ月(90日)のため、これを超えてサーバを運用する場合は定期的な証明書更新が必要になります

参考資料

あわせて読みたい
チャレンジの種類 - Let's Encrypt - フリーな SSL/TLS 証明書 Let’s Encrypt から証明書を取得するときには、ACME 標準で定義されている「チャレンジ」を使用して、証明書が証明しようとしているドメイン名があなたの制御下にあ...

【支援ありがとうございます】Amazon アフィリエイトリンク

以下は Amazon アフィリエイトリンクです。このリンクをクリック後に Amazon で購入いただくと当サイト管理人に紹介料が入ります(以下の商品以外を購入でも発生)。支援いただける方は以下のリンクをクリック後に Amazon にて購入していただけると大変助かります。当サイト更新のモチベーションになります。

note メンバーシップへの参加もお待ちしています!

note(ノート)
陰の構築者たちのメンバーシップ|シェイド@陰の構築者 ネットワーク設計構築をする人に役立つメンバーシップです。 独自ブログ(https://shadowgarden.org/)にてネットワークエンジニア向け情報を発信しており、その活動を応援...

【アフィリエイト】おすすめ WordPress テーマ【SWELL

当サイトでは WordPress テーマとして SWELL を使用しています。以前は無料・高機能テーマとして知られる Cocoon を使用していて Cocoon も使いやすかったのですが、SWELL を使い始めてからは SWELL のほうが圧倒的に使いやすいなと思いました。そして何より読み込み速度が速い。SWELL を使い始めてから、過去の Cocoon のブログを見直したときに「あれ、こんなに表示遅かったっけ?」という感覚になりました。

また SWELL はデフォルトでもオシャレなデザインですが柔軟にカスタマイズすることもでき個性のあるサイトを作成できます。さらにブログパーツや広告タグといった再利用可能なブログの「部品」も作成することができ、ブログ作成効率も高いです。

技術ブログやアフィリエイト等での収益化を見据えたブログの作成に SWELL は最適です。初見では価格が高いなと思うと思いますが、私としては SWELL を採用して良かったしそれ以上の価値があると感じています。
ブログの新設やテーマ変更を考えている人は一度 SWELL を検討してみてください。
以下の画像リンクから詳細な情報を確認できます。

レンタルサーバーを探している人には安定性に定評のあるエックスサーバーをお勧めします。
当サイトもエックスサーバーを使用しています。WordPress のインストールも簡単にできます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次