☁️

Let's Encryptでワイルドカード証明書を発行する方法|Amazon Linux 2023

2024/05/26に公開

こんにちは、株式会社FIXER@名古屋事業所に所属している村上です。

SSL/TLS証明書を無料で発行できる「Let's Encrypt」を利用して、Amazon Linux 2023上でワイルドカード証明書を取得する方法を紹介します。ワイルドカード証明書を使用すると、1つの証明書で複数のサブドメインをカバーできるため、管理が簡単になります。

前提条件

  • SSL/TLS証明書を発行するドメインを取得していること
    • 本ブログでは Route 53 でドメインを取得しています。
  • DNSホストゾーンで取得したドメインを管理していること
    • 本ブログでは Route 53のパブリックホストゾーン でドメインを管理しています。
  • Docker DesktopやRancher DesktopなどのDokcer環境が揃っていること
    • 本ブログでは Dokcer Desktop を使用しています。

手順

1. Docker HubからAmazon Linux 2023 のDockerイメージを取得する

以下のコマンドを実行して、Amazon Linux 2023 の Docker イメージを取得します。

docker pull amazonlinux:2023

2. コンテナを起動する

取得したイメージを使用して、新しいコンテナ(ssl-cert-generator)を作成し、起動します。

docker run -it --name ssl-cert-generator amazonlinux:2023

■補足

ssl-cert-generatorのコンテナに再ログインする場合は、以下のコマンドを使用します。

docker start -ai ssl-cert-generator

3. certbotのパッケージをインストールする

以下のコマンドを実行して、certbotをインストールします。

yum -y install certbot

念の為、インストールしたcertbotのバージョンを確認します。執筆時点では、certbot 2.6.0 を使用しています。

certbot --version

4. ワイルドカード証明書を発行する

Certbot を使用して Let's Encrypt から SSL/TLS 証明書を取得します。Let's Encryptで発行される証明書はDV証明書になります。

# 「ドメイン名称」と「管理用のメールアドレス」を定義する
domain="your-domain.com"
email="your-email@example.com"

# ワイルドカード証明書を発行する
certbot certonly --manual --preferred-challenges dns -d "*.$domain" -d "$domain" --email "$email" --agree-tos

■DNS検証用のTXTレコードを登録する

コマンド実行後、Certbot はドメイン所有権の検証に必要な情報を提供します。--manual を使用しているため、発行者自身が手動でDNSレコードを追加する必要があります。

<TXTレコード値>の値をDNSホストゾーンに追加します。

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for *.<ドメイン名称> and <ドメイン名称>

Please deploy a DNS TXT record under the name:
_acme-challenge.<ドメイン名称>.
with the following value:
<TXTレコード値 1つ目>

Press Enter to Continue

Route 53 の場合、以下のように設定します。TTL(Time to Live)は、DNS レコードがキャッシュされる期間を秒単位で指定します。DNS検証用なので、私はTTLを60秒(1分)に設定しています、個人的に推奨です!

DNSレコードが反映されたことを問い合わせてみます。成功例を以下に示します。

nslookup -type=TXT -timeout=5 _acme-challenge.<ドメイン名称> 
Server:		8.8.8.8
Address:	8.8.8.8#53

Non-authoritative answer:
_acme-challenge.<ドメイン名称>	text = "<TXTレコード値 1つ目>"

Authoritative answers can be found from:

無事、1つ目のTXTレコードが登録されたことを確認できたので、Enterキーを押下して、2つ目のTXTレコードを登録していきます。

Please deploy a DNS TXT record under the name:
_acme-challenge.<ドメイン名称>.
with the following value:
<TXTレコード値 2つ目>

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

nslookup -type=TXT -timeout=5 _acme-challenge.<ドメイン名称> 
Server:		8.8.8.8
Address:	8.8.8.8#53

Non-authoritative answer:
_acme-challenge.<ドメイン名称>	text = "<TXTレコード値 1つ目>"
_acme-challenge.<ドメイン名称>	text = "<TXTレコード値 2つ目>"

Authoritative answers can be found from:

2つ目のTXTレコード値も返ってきたことを確認した後、3分ほど待機してください🍵。
この後、Certbotが証明書発行機関(Certificate Authority)であるLet's EncryptにDNS TXT レコードの検証を行うのですが、nslookupで確認できても検証に失敗することがあります。

■DNS検証を試行する

TXT レコードを登録して待機後、Enterキーを押します。DNS検証に成功すると以下のようなメッセージが表示されます。

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/<ドメイン名称>/fullchain.pem
Key is saved at: /etc/letsencrypt/live/<ドメイン名称>/privkey.pem
This certificate expires on 2024-08-24.
These files will be updated when the certificate renews.

失敗した場合は、もう一度 certbotのコマンドを実行してレコード登録から始めてください。

5. ワイルドカード証明書をダウンロードする

Dockerコンテナ上に置かれた証明書をローカルPC上に発行する手順を紹介します。
ローカルPCのホストOS上で証明書をダウンロードする専用のフォルダを作成します。

mkdir ~/letsencrypt-backup

■PEM証明書 をダウンロードしたいユーザー向け

「4. ワイルドカード証明書を発行する」で発行されるSSL/TLS証明書の形式はPEM証明書になります。Windowsシステムを利用しない場合はPEM証明書で十分なシナリオが多いです。

ホストOS上でターミナルなどのコンソールを起動して、以下のコマンドを実行してください。

docker cp ssl-cert-generator:/etc/letsencrypt/archive/<ドメイン名称>/ ~/letsencrypt-backup

ダウンロードできました👍

■PFX証明書 をダウンロードしたいユーザー向け

Microsoft AzureのPaaSやWindows ServerなどのWindowsシステムで使用したい場合は、PFX証明書を必要とする場面が多いです。

PEM形式の証明書をPFX形式に変換する必要があるため、編集可能な権限を持つフォルダにPEM証明書の資材を移動します。本ブログではroot直下に移動させています。

Dockerコンテナ上で以下のコマンドたちを1つずつ実行してください。

# 任意のディレクトリにPFX証明書の資材をコピーする
cp -r ../../etc/letsencrypt/archive/<ドメイン名称> .

# コピーしたフォルダに移動する
cd <ドメイン名称>/

# opensslをインストールする
yum install openssl

# PFX形式に変換する(PFX証明書の名前は自由に変更してOK)
openssl pkcs12 -export -in fullchain1.pem -inkey privkey1.pem -out wildcard.pfx

openssl のコマンドを実行後、パスワード入力を求められます。パスワード生成(パスワード作成)ツール などで複雑なパスワードを設定しましょう。このパスワードは 証明書をインポートするときに使用します。

最後にホストOS上でターミナルなどのコンソールを起動して、以下のコマンドを実行してください。

docker cp ssl-cert-generator:/<ドメイン名称>/wildcard.pfx ~/letsencrypt-backup

ダウンロードできました👍

Discussion