LetsEncrypt 인증서가 갱신되지 않음

안녕하세요. 제 LetsEncrypt 인증서가 최근 4일에 만료되었고, 갱신을 시도해도 모두 실패하고 있습니다. 비슷한 문제를 겪는 다른 분들의 게시물을 꽤 많이 읽어 보았지만, 제시된 해결책들(컨테이너 재빌드, 수동 갱신 명령 실행 등)은 제 경우에는 효과가 없었습니다.

가이드의 문제 해결 섹션을 따라가다 보니 로그(./launcher logs app)에 오류가 있음을 발견했습니다:

[Fri Dec  6 05:30:05 PM UTC 2024] Using CA: https://acme-v02.api.letsencrypt.org/directory
[Fri Dec  6 05:30:05 PM UTC 2024] Multi domain='DNS:discourse.[DOMAIN1].org,DNS:discourse.[DOMAIN1].org,DNS:[DOMAIN2].org'
[Fri Dec  6 05:30:05 PM UTC 2024] Getting domain auth token for each domain
[Fri Dec  6 05:30:07 PM UTC 2024] Getting webroot for domain='discourse.[DOMAIN1].org'
[Fri Dec  6 05:30:08 PM UTC 2024] Getting webroot for domain='discourse.[DOMAIN1].org'
[Fri Dec  6 05:30:08 PM UTC 2024] Getting webroot for domain='[DOMAIN2].org'
[Fri Dec  6 05:30:08 PM UTC 2024] Verifying: discourse.[DOMAIN1].org
[Fri Dec  6 05:30:08 PM UTC 2024] Pending, The CA is processing your order, please just wait. (1/30)
[Fri Dec  6 05:30:12 PM UTC 2024] Pending, The CA is processing your order, please just wait. (2/30)
[Fri Dec  6 05:30:15 PM UTC 2024] Pending, The CA is processing your order, please just wait. (3/30)
[Fri Dec  6 05:30:19 PM UTC 2024] Pending, The CA is processing your order, please just wait. (4/30)
[Fri Dec  6 05:30:22 PM UTC 2024] Success
[Fri Dec  6 05:30:22 PM UTC 2024] Verifying: discourse.[DOMAIN1].org
[Fri Dec  6 05:30:23 PM UTC 2024] Success
[Fri Dec  6 05:30:23 PM UTC 2024] Verifying: [DOMAIN2].org
[Fri Dec  6 05:30:23 PM UTC 2024] Pending, The CA is processing your order, please just wait. (1/30)
[Fri Dec  6 05:30:27 PM UTC 2024] [DOMAIN2].org:Verify error:198.49.23.145: Invalid response from http://[DOMAIN2].org/.well-known/acme-challenge/ohJAvgwBR81O8qmzsMPx-ZnmxoKOPAfuGCz0VZJeFWk: 404
[Fri Dec  6 05:30:27 PM UTC 2024] Please check log file for more details: /shared/letsencrypt/acme.sh.log
CN = discourse.[DOMAIN1].org
error 10 at 0 depth lookup: certificate has expired
error fullchain.cer: verification failed

우선, 왜 여기에 두 개의 도메인이 표시되고 있을까요? 저는 Discourse 인스턴스가 위치한 DOMAIN1에 인증서가 필요할 뿐입니다. DOMAIN2는 SMTP 릴레이 호스트이며, 이미 인증서가 있습니다.

두 번째로, 언급된 LetsEncrypt 로그 파일(/shared/letsencrypt/acme.sh.log)은 존재하지 않거나, 적어도 해당 경로에서 찾을 수 없습니다.

가장 중요한 것은, 스크립트가 DOMAIN2를 확인하는 것을 중단하고 DOMAIN1의 인증서만 성공적으로 갱신하도록 만드는 방법이 있는지 궁금합니다.

이것은 표준 설치인가요? 리버스 프록시를 사용 중인가요?

Digital Ocean의 드롭렛을 사용하고 있으며, 해당 스크립트로 설치했지만 여전히 표준 설치로 간주되는 것 같습니다. Cloudflare이 DNS를 관리하고 있지만, 오렌지 클라우드(프록시)는 꺼져 있습니다. 제가 아는 한 리버스 프록시는 존재하지 않습니다.

해당 IP 주소는 Discourse가 아닙니다. DNS 설정에 문제가 있는 건가요? A 레코드가 여러 개 있는 건가요?

호스트명이 무엇인가요?

맞습니다. 그 IP 주소는 [DOMAIN2]에 속해 있으며, 이는 Discourse와는 전혀 관련이 없는 우리가 소유한 다른 도메인입니다. 이는 제가 처음에 제기했던 질문, 즉 왜 그 도메인과 IP가 로그에 나타나는지에 대한 문제점으로 돌아가게 됩니다.

DNS는 정상적으로 작동하고 있습니다. 브라우저의 만료된 인증서 경고 우회 시에도 사이트를 접근할 수 있습니다. 또한, Discourse가 아닌 다른 웹사이트도 정상적으로 작동하고 있습니다. 우리의 호스트명(Discourse용, 다른 도메인이 아닌)은 discourse.gomomentum.org입니다.

정말 까다로운 문제였네요! Let’s Encrypt가 잘못된 호스트로 요청을 보내는 이유를 도저히 떠올릴 수가 없었습니다. 결국 DNS 때문인 경우가 항상 있는 것은 아니었네요.

요약하자면: 기존 Discourse 도메인 외에 베어 도메인(bare domain)에 대한 인증서도 발급받도록 Let’s Encrypt에 설정해 두었다가, 나중에 베어 도메인의 DNS를 다른 사이트로 변경한 것이 원인이었습니다.

좀 더 자세한 설명 . . .

어느 날 discourse.gomomentum.org뿐만 아니라 gomomentum.org에 대한 요청도 Discourse가 처리하도록 하고 싶으셨을 겁니다. 그래서 여기에서 설명한 대로 app.yml에 스타네이(stanza)를 추가하셨을 것입니다: Set up Let’s Encrypt with multiple domains / redirects

즉, Let’s Encrypt는 두 도메인 모두가 원래 Discourse 서버로 가리키고 있는지 확인했습니다.

이것이 왜 다른 도메인에 대한 요청이 Let’s Encrypt로 가고 있었는지를 설명해 줍니다.

그리고 또 다른 날, 아마도 수년 전이겠지만 지난 3개월 사이 누군가는 gomomentum.org가 더 이상 Discourse 사이트가 아니라 메인 사이트로 가리켜야 한다고 결정했습니다. 그 시점에 Let’s Encrypt가 작동하지 않게 되었지만, 인증서는 3개월간 유효하므로 이 일이 발생한 시점에서는 DNS 변경과 인증서 갱신 실패를 연결 짓기 거의 불가능한 상태였습니다.

해당 스타네이를 app.yml에서 제거하고 재빌드(rebuild)를 진행했는데, 이제 정상적으로 돌아가고 있습니다!

:man_facepalming: 그렇군요, 이제 기억이 납니다. 몇 달 전에 이메일 문제를 겪을 때 도메인 설정을 많이 만졌었거든요. 당시 제가 추측으로 했던 것들이 의도치 않은 부작용을 일으킨 것 같습니다. 감사합니다, 제이!