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
제일 흔한 원인 두 가지예요.
하나는 처음 발급을 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 돌려서 확인하세요.