Let’s Encrypt ドメイン追加 certbot コマンドで404エラー

開発

はじめに、この記事ではcertbot certonlyコマンドでドメインを追加した際、404エラーで更新が失敗した際のトラブルシューティングの一つを共有します。

スポンサーリンク

前置き

すでにいくつか、Let’s EncryptでSSL証明書を発行済です。

更に新規でドメインを作成して、同じくLet’s EncryptでSSL証明書を発行しようとした際のことです。

新規登録時と同じようにcertbot certonlyコマンドで証明書取得を使用した際以下のようなエラーが発生しました。

■発行コマンド

# certbot certonly --agree-tos --non-interactive -d [ドメイン名] --webroot -w [ドキュメントルートのパス] --email [管理者のメールアドレス]

■実行結果

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for [ドメイン名]
Using the webroot path [ドキュメントルートのパス] for all unmatched domains.
Waiting for verification...
Challenge failed for domain [ドメイン名]
http-01 challenge for [ドメイン名]
Cleaning up challenges
Some challenges have failed.

IMPORTANT NOTES:
 - The following errors were reported by the server:

   Domain: [ドメイン名]
   Type:   unauthorized
   Detail: Invalid response from
   https://[ドメイン名]/.well-known/acme-challenge/1wvkXiFdvURE8ciWGy_M8d8KIZL-qoAcZ_Pg8JNd8Hw
   [IPアドレス]: "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML
   2.0//EN\">\n<html><head>\n<title>404 Not
   Found</title>\n</head><body>\n<h1>Not Found</h1>\n<p"

   To fix these errors, please make sure that your domain name was
   entered correctly and the DNS A/AAAA record(s) for that domain
   contain(s) the right IP address.

404で失敗してますね。

原因

発行元の確認で[ドメイン名]/.well-knownにアクセスして認証を行うようなのですが、この認証がうまくいっていないようです。
(アクセスして対象ディレクトリが存在していなくて404になっている。)

調べたところ原因はいくつか考えられるようです。
・発行コマンドの記述(パス)ミス
・htaccessで余計なリダイレクトをさせている
・ファイアウォールで80、443ポートを制限している
・DNSレコードの設定のミス


これらすべてチェックしてもダメ。
自前で[ドメイン名]/.well-knownを作成して解決した!という記事をみて、試してみたのですが、これもダメでした。

解決策

発行元のアクセスに失敗しているのが原因なので、バーチャルホストを先に定義。
ただし、SSLCertificatの定義に関連する箇所は、勿論、まだ発行前なのでコメントアウトした状態です。
(色々と疑問は残りますが、そこは置いておいて)

# vi /etc/httpd/conf.d/ssl.conf

<VirtualHost *:443>
    ServerName  [ドメイン名]
    ServerAdmin  [管理者のメールアドレス]
    DocumentRoot  [ドキュメントルートのパス]
#    SSLEngine on
#    SSLCertificateKeyFile /etc/letsencrypt/live/[ドメイン名]/privkey.pem
#    SSLCertificateFile /etc/letsencrypt/live/[ドメイン名]/cert.pem
#    SSLCertificateChainFile /etc/letsencrypt/live/[ドメイン名]/chain.pem
</VirtualHost>

設定を反映させるためにApachの再起動。

# systemctl restart httpd

あらためて証明書発行コマンドを実施

# certbot certonly --agree-tos --non-interactive -d [ドメイン名] --webroot -w [ドキュメントルートのパス] --email [管理者のメールアドレス]

実行結果を改めて見守ってみると…

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for [ドメイン名]
Using the webroot path [ドキュメントルートのパス] for all unmatched domains.
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/[ドメイン名]/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/[ドメイン名]/privkey.pem
   Your cert will expire on 2020-11-03. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - 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

やっと「Congratulations!」が…!

ここに至るまでホント長かった…


念のため証明書が保存されているかも確認しましょう。

# ls -l /etc/letsencrypt/live
total 4
-rw-r--r-- 1 root root 740 Aug  5 14:16 README
drwxr-xr-x 2 root root  88 Aug  5 14:17 [ドメイン名1]
drwxr-xr-x 2 root root  88 Aug  5 14:16 [ドメイン名2]
drwxr-xr-x 2 root root  88 Aug  5 17:59 [ドメイン名3] ←今回生成されたもの

SSLCertificatのコメントアウトも忘れずに。
# vi /etc/httpd/conf.d/ssl.conf

<VirtualHost *:443>
    ServerName  [ドメイン名]
    ServerAdmin  [管理者のメールアドレス]
    DocumentRoot  [ドキュメントルートのパス]
    SSLEngine on
    SSLCertificateKeyFile /etc/letsencrypt/live/[ドメイン名]/privkey.pem
    SSLCertificateFile /etc/letsencrypt/live/[ドメイン名]/cert.pem
    SSLCertificateChainFile /etc/letsencrypt/live/[ドメイン名]/chain.pem
</VirtualHost>

設定を反映させるためにApachの再起動。

# systemctl restart httpd


これでHTTPSアクセスできるはずです。
ブラウザで確認してみましょう!


この件、地味にはまってしまいました。
ネット上の解決策は色々試したのですが、ことごとくケースと一致せずでした。

正規の解決方法は他にあるのだろうな。と思いつつも結果、解決できたので良しとします。


以上です。

タイトルとURLをコピーしました