본문 바로가기
Q&A2026년 8월 10일1분 읽기

certbot 인증서 갱신이 자꾸 실패하는데 수동으로는 발급이 됩니다

c
certbot_yohan
조회 605댓글 1

nginx에 Let's Encrypt 인증서 붙여 쓰는데, 90일 다 돼서 자동갱신을 확인하려고 certbot renew --dry-run 돌리니 실패합니다. 처음 발급할 땐 잘 됐거든요.

Challenge failed for domain example.com
http-01 challenge for example.com
Detail: Invalid response from http://example.com/.well-known/acme-challenge/xxxx: 404

브라우저로 사이트는 정상 접속되고 https도 잘 물려 있습니다. 근데 갱신만 404가 나네요. 처음엔 됐는데 왜 지금은 challenge 파일을 못 찾는 걸까요?

댓글 1

김김영삼2개월 전
처음 발급은 됐는데 갱신만 404면, 갱신 때 쓰는 challenge 검증 경로랑 지금 nginx 설정이 어긋난 거예요. http-01 챌린지는 Let's Encrypt 서버가 http://example.com/.well-known/acme-challenge/토큰 파일을 실제로 읽어갈 수 있어야 통과하는데, 그 요청이 파일까지 못 닿고 있는 겁니다.

제일 흔한 원인 두 가지예요.

하나는 처음 발급을 standalone 모드(certbot이 잠깐 자기 웹서버 띄우는 방식)로 했는데, 지금은 nginx가 80을 점유하고 있어서 갱신 때 standalone이 못 뜨거나, webroot 경로가 실제 nginx 루트랑 달라서 파일을 엉뚱한 데 놓는 경우입니다. /etc/letsencrypt/renewal/example.com.conf 열어서 authenticator랑 webroot_path가 뭘로 돼 있는지 보세요. webroot_path가 지금 nginx의 실제 도큐먼트 루트랑 같아야 합니다.

둘은 http를 전부 https로 301 리다이렉트 걸어놔서, challenge 요청(.well-known/acme-challenge)까지 https로 튕겨버리는 경우예요. 이때 80 포트 server 블록에 이 예외를 먼저 둬야 해요.

location ^~ /.well-known/acme-challenge/ {
root /var/www/html;
allow all;
}

이 location을 리다이렉트 지시어보다 위에 ^~ 로 두면 challenge 경로만 리다이렉트를 안 타고 파일을 직접 내려줍니다. root는 webroot_path랑 맞추고요. 정리하면 renewal conf의 webroot_path와 nginx가 challenge를 서빙하는 경로를 일치시키는 게 핵심이에요. 고치고 다시 --dry-run 돌려서 확인하세요.
Ctrl+Enter로 등록