MENU
Language

Certbot を使った Let’s Encrypt 証明書の取得が失敗した場合の対処法

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 レコードを作成することでドメイン所有権を証明します。

メリット

  1. ポートが不要:
    • ポート80や443を使用しないため、ネットワークやファイアウォールの制約を回避可能。
  2. 内部サーバーや非公開ドメインに対応:
    • ドメインが公開されていなくても、DNSが操作可能であれば利用できる。
  3. ワイルドカード証明書に対応:
    • ワイルドカード(例: *.example.com)証明書を取得できるのはDNSチャレンジのみ。

デメリット

  1. DNS設定の手間:
    • DNSプロバイダでTXTレコードを手動または自動的に設定する必要がある。
  2. 自動化の複雑さ:
    • 自動化するには、対応する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 のトークン値を指定

設定例

レコードタイプ名前TTL
Aexample.comxxx.xxx.xxx.xxx300
TXT_acme-challengeABC00000000000000000300

4. TXTレコードの反映状況確認

反映が完了したかどうかを確認するには、次のコマンドを使用します:

Linux/MacOSの場合(dig コマンド)

dig _acme-challenge.example.com TXT

結果に以下のような値が含まれていれば成功です:

_acme-challenge.example.com. 300 IN TXT "ABC00000000000000000"

オンラインツールを使用

  • DNS伝搬チェッカー を利用して、世界中のDNSサーバーで反映状況を確認できます。

外部:DNS伝搬チェッカー の例

5. 注意点

  1. 反映時間:
    • DNSの変更は、TTL(Time to Live)の設定とDNSプロバイダーによって数分~数時間かかることがあります。
  2. 複数のTXTレコード:
    • 同じドメインに複数のTXTレコードを設定する場合、問題ありません。ただし、_acme-challengeの名前で他のTXTレコードを設定している場合、競合が発生する可能性があるので注意してください。
  3. 手動認証の手間:
    • 手動でTXTレコードを追加するDNS-01チャレンジは、自動更新には向いていません。証明書を定期的に更新する場合、自動化する設定(例: HTTP-01 チャレンジ)を検討してください。

解決手順3(ALPN-01 チャレンジ):

概要

  • HTTPS(ポート443)を使用してドメイン所有権を証明。
  • ALPN(Application Layer Protocol Negotiation)を利用して、TLSハンドシェイク中に証明書所有権を確認。

メリット

  1. ポート80が不要:
    • ポート443が使用できればよい。
  2. 迅速な証明書発行:
    • HTTP-01と同様に手動操作が不要。
  3. 自動化が容易:
    • Certbotやacme.shなどのツールで比較的簡単に設定可能。

デメリット

  1. ポート443が必須:
    • ポート443が他のサービスで占有されている場合に設定が難しい。
  2. ワイルドカード証明書には非対応:
    • 単一ドメインやサブドメインの証明書しか発行できない。

適した用途

  • ポート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-01DNS-01ALPN-01
使用ポートポート80不要(DNSを使用)ポート443
公開サーバー必須必須不要必須
ワイルドカード対応なし対応なし
非公開サーバーでの使用不可対応不可
自動化の難易度簡単DNSプロバイダのAPIが必要簡単
設定のスピード高速DNS伝播の遅延あり高速
用途公開サーバーの基本的な証明書発行ワイルドカードや非公開サーバーHTTPSが利用可能な公開サーバー

HTTP-01 を選ぶポイント

  • 公開されたWebサーバーがあり、ポート80が利用可能。
  • 単一のドメインやサブドメインにSSLを適用するだけで十分。

DNS-01 選ぶポイント

  • ワイルドカード証明書(例: *.example.com)が必要。
  • サーバーが非公開(内部ネットワーク内)で動作している。
  • ポート80/443が使用できない場合。

ALPN-01 選ぶポイント

  • ポート443が使用可能だが、ポート80が閉じている場合。
  • 公開サーバーで単一のドメインやサブドメインの証明書を発行したい。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

AIアーティスト | エンジニア | ライター | 最新のAI技術やトレンド、注目のモデル解説、そして実践に役立つ豊富なリソースまで、幅広い内容を記事にしています。フォローしてねヾ(^^)ノ

コメント

コメント一覧 (1件)

コメントする

目次