Certbot を使った Let’s Encrypt 証明書の取得が失敗した場合の対処法
問題の要点
エラーの詳細:
- エラー内容: HTTP-01 チャレンジが失敗しました。
- 理由:
Unauthorized: Invalid response from http://example.com/.well-known/acme-challenge/XXXXXX: 404
Let’s Encrypt のサーバーが.well-known/acme-challenge/
に正しいトークンを確認できず、HTTP 404 エラーが返されました。
Certbot 証明書のリストを確認
インストールされた証明書の一覧を確認します。
sudo certbot certificates
正常にインストールがされている場合は、以下のような結果が返されます。
正しい結果が取得できない場合は、原因を調査します。
Certificate Name: example.com
Domains: example.com sub.example.com
Expiry Date: 2024-02-26 12:00:00+00:00 (VALID: 89 days)
Certificate Path: /etc/letsencrypt/live/example.com/fullchain.pem
Private Key Path: /etc/letsencrypt/live/example.com/privkey.pem
原因の可能性と確認ポイント
ドメインのDNS設定が不正確:ドメイン example.com
が正しいサーバーのIPアドレスに解決されていない可能性があります。IPアドレスが、Certbot が動作しているサーバーのIPと一致しているか確認してください。
確認方法:
dig example.com A
ポート 80 が使用不可:
sudo netstat -tuln | grep :80
対処方法:Apache、または、Nginxを停止
Apacheを停止
sudo systemctl stop apache2
Nginxを停止
sudo systemctl stop nginx
ファイアウォールまたはネットワーク制限:
ファイアウォールの状態を確認:
sudo ufw status
必要に応じて、ポート 80 を許可:
sudo ufw allow 80
IPv6 アドレスの競合:
certbot certonly --standalone --preferred-challenges http -d example.com --agree-tos --email <メールアドレス> --http-01-port 80
解決手順1
DNS設定確認:
ドメインが Certbot を実行しているサーバーの IP アドレスに解決されていることを確認します。
ポート 80 の利用状況確認:
他のプロセスを停止または再構成して、ポート 80 が Certbot の一時的なサーバーに利用可能であることを確認します。
ファイアウォール設定:
ポート 80 への外部接続を許可します。
Certbot コマンドの再試行:
上記の問題を解決した後、Certbot を再実行します:
certbot certonly --standalone -d example.com --agree-tos --email <メールアドレス>
代替のチャレンジ方法の使用(最終手段):
HTTP-01 チャレンジがうまくいかない場合、DNS-01 チャレンジを使用します。これには DNS レコードに特定の TXT レコードを追加する必要があります。
解決手順2(DNS-01 チャレンジ):
概要
DNSチャレンジ(dns-01
)は、Let’s Encrypt が指定する DNS TXT レコードを作成することでドメイン所有権を証明します。
メリット
- ポートが不要:
- ポート80や443を使用しないため、ネットワークやファイアウォールの制約を回避可能。
- 内部サーバーや非公開ドメインに対応:
- ドメインが公開されていなくても、DNSが操作可能であれば利用できる。
- ワイルドカード証明書に対応:
- ワイルドカード(例:
*.example.com
)証明書を取得できるのはDNSチャレンジのみ。
- ワイルドカード(例:
デメリット
- DNS設定の手間:
- DNSプロバイダでTXTレコードを手動または自動的に設定する必要がある。
- 自動化の複雑さ:
- 自動化するには、対応するAPIやツールの設定が必要。
適した環境
- ネットワーク構成が複雑でポート80や443が利用できない場合。
- ワイルドカード証明書を取得したい場合。
- ドメインのDNSを制御できる場合。
DNS-01 チャレンジを開始:
certbot certonly --manual --preferred-challenges dns -d example.com
指示に従って DNS に TXT レコードを設定します。
1. TXTレコードを追加するとは?
TXTレコードは、ドメイン名に関連付けられた任意のテキストデータを保存するDNSレコードの種類です。Let’s EncryptのDNS-01チャレンジでは、証明書を発行するために指定されたトークンをTXTレコードとして追加します。
2. DNS-01チャレンジの流れ
Certbotコマンドを実行:
certbot certonly --manual --preferred-challenges dns -d example.com
表示される指示を確認:
Certbotが次のようなトークン(例)を表示します:
Please deploy a DNS TXT record under the name:
_acme-challenge.example.com
With the following value:
ABCXXXXXXXXXXXXXXXXX
ここで、_acme-challenge.example.com
がTXTレコードの名前、ABCXXXXXXXXXXXXXXXXX
が値です。
DNS設定でTXTレコードを追加:
ドメインを管理しているDNSプロバイダー(例: Google Domains、AWS Route 53、Cloudflareなど)のコントロールパネルにログインします。
DNSレコードを管理するページに移動します。
新しいレコードを追加します:
タイプ: TXT
名前: _acme-challenge
(または _acme-challenge.example.com
)
値:ABCXXXXXXXXXXXXXXXXX
(Certbotが提供した値)
TTL: 300秒(例)
Certbotに戻り続行:
DNSに設定が反映されるまで数分~数時間待ちます。
設定が完了したら、Certbotのプロセスを進めます。CertbotがDNSレコードを確認し、証明書を発行します。
3. Aレコードとの併用はできる?
- 併用可能です。
- TXTレコードはAレコードと異なる目的のレコードであり、互いに干渉しません。
- 同じドメイン(
example.com
)に対して、以下のように複数のレコードを設定できます:- Aレコード: IPv4アドレスを指定(例:
xxx.xxx.xxx.xxx
) - TXTレコード:
_acme-challenge
のトークン値を指定
- Aレコード: IPv4アドレスを指定(例:
設定例
レコードタイプ | 名前 | 値 | TTL |
---|---|---|---|
A | example.com | xxx.xxx.xxx.xxx | 300 |
TXT | _acme-challenge | ABC00000000000000000 | 300 |
4. TXTレコードの反映状況確認
反映が完了したかどうかを確認するには、次のコマンドを使用します:
Linux/MacOSの場合(dig
コマンド)
dig _acme-challenge.example.com TXT
結果に以下のような値が含まれていれば成功です:
_acme-challenge.example.com. 300 IN TXT "ABC00000000000000000"
オンラインツールを使用
- DNS伝搬チェッカー を利用して、世界中のDNSサーバーで反映状況を確認できます。
外部:DNS伝搬チェッカー の例

5. 注意点
- 反映時間:
- DNSの変更は、TTL(Time to Live)の設定とDNSプロバイダーによって数分~数時間かかることがあります。
- 複数のTXTレコード:
- 同じドメインに複数のTXTレコードを設定する場合、問題ありません。ただし、
_acme-challenge
の名前で他のTXTレコードを設定している場合、競合が発生する可能性があるので注意してください。
- 同じドメインに複数のTXTレコードを設定する場合、問題ありません。ただし、
- 手動認証の手間:
- 手動でTXTレコードを追加するDNS-01チャレンジは、自動更新には向いていません。証明書を定期的に更新する場合、自動化する設定(例: HTTP-01 チャレンジ)を検討してください。
解決手順3(ALPN-01 チャレンジ):
概要
- HTTPS(ポート443)を使用してドメイン所有権を証明。
- ALPN(Application Layer Protocol Negotiation)を利用して、TLSハンドシェイク中に証明書所有権を確認。
メリット
- ポート80が不要:
- ポート443が使用できればよい。
- 迅速な証明書発行:
- HTTP-01と同様に手動操作が不要。
- 自動化が容易:
- Certbotやacme.shなどのツールで比較的簡単に設定可能。
デメリット
- ポート443が必須:
- ポート443が他のサービスで占有されている場合に設定が難しい。
- ワイルドカード証明書には非対応:
- 単一ドメインやサブドメインの証明書しか発行できない。
適した用途
- ポート80が閉じているがポート443が使用可能な場合。
- 単一のドメインやサブドメインで十分な場合。
- サーバーが公開されており、HTTPSでの所有権確認を選びたい場合。
前提条件
acme.sh のインストール
ALPN チャレンジに対応する acme.sh がインストール済みであること。
未インストールの場合、以下のコマンドでインストールします。
curl https://get.acme.sh | sh
ポート443が使用可能
ALPN チャレンジはポート443を使用するため、このポートが他のサービスで占有されていないことを確認します。
ドメインがサーバーに向いていること。example.com
がサーバーのIPアドレスを指していること。
手順
証明書の発行
acme.sh を使用して ALPN チャレンジで証明書を発行します。
コマンド
~/.acme.sh/acme.sh --issue --alpn -d example.com
解説
--issue
: 証明書を発行するオプション。--alpn
: ALPN チャレンジを使用。-d test.brain-ai-lab.com
: ドメインを指定。
まとめ – 比較表
特徴 | HTTP-01 | DNS-01 | ALPN-01 |
---|---|---|---|
使用ポート | ポート80 | 不要(DNSを使用) | ポート443 |
公開サーバー必須 | 必須 | 不要 | 必須 |
ワイルドカード対応 | なし | 対応 | なし |
非公開サーバーでの使用 | 不可 | 対応 | 不可 |
自動化の難易度 | 簡単 | DNSプロバイダのAPIが必要 | 簡単 |
設定のスピード | 高速 | DNS伝播の遅延あり | 高速 |
用途 | 公開サーバーの基本的な証明書発行 | ワイルドカードや非公開サーバー | HTTPSが利用可能な公開サーバー |
HTTP-01 を選ぶポイント
- 公開されたWebサーバーがあり、ポート80が利用可能。
- 単一のドメインやサブドメインにSSLを適用するだけで十分。
DNS-01 を選ぶポイント
- ワイルドカード証明書(例:
*.example.com
)が必要。 - サーバーが非公開(内部ネットワーク内)で動作している。
- ポート80/443が使用できない場合。
ALPN-01 を選ぶポイント
- ポート443が使用可能だが、ポート80が閉じている場合。
- 公開サーバーで単一のドメインやサブドメインの証明書を発行したい。
コメント
コメント一覧 (1件)
[…] ai0w.com Certbot を使った Let’s Encrypt 証明書の取得が失敗した場合の対処法 | ai0w.com Certbot を使った Let’s Encrypt 証明書の取得が失敗した場合の対処法 問題の要点 エラーの詳細: エラ […]