CNAME과 TXT 충돌로 인한 인증서 발급 문제
Categories:
동일한 접두사의 CNAME과 TXT는 공존할 수 없다
도메인을 다루어본 사람은 A, AAAA 레코드가 CNAME과 공존할 수 없다는 것을 알겠지만, TXT와 CNAME이 충돌하는 경우는 경험해보지 못했을지도 모른다.
어떤 상황에서 TXT와 CNAME이 같은 접두사로 동시에 사용될 수 있을까?
그 중 하나는 LetsEncrypt 인증서 발급 시 DNS-01 챌린지를 사용해 도메인 소유권을 검증하는 경우이다.
- Certbot은 ackey와 acsecret 또는 token을 사용해
_acme-challenge.example.com의 TXT 레코드를 생성한다 - Letsencrypt는 TXT 레코드를 조회해 신청자가 DNS 레코드를 생성할 권한이 있음을 확인하고, 도메인 소유권을 증명한다
- Letsencrypt가 인증서를 발급한다
- Certbot이
_acme-challenge.example.com의 TXT 레코드를 정리한다
TXT 레코드를 생성할 때, 이미 _acme-challenge.example.com에 CNAME 레코드가 있다면 TXT 레코드 생성에 실패할 수 있고, 이는 도메인 챌린지 검증 실패로 이어질 수 있다.
왜 _acme-challenge.example.com에 CNAME 레코드가 생기게 된 것일까?
알리바바 클라우드에서 새로推出的 ESA(Edge Security Acceleration)는 cloudflare와 유사하며, 원래 DCDN 전역 가속의 개명 및 기능 강화 버전이다. 초기 사용 시 와일드카드 도메인 인증서를 직접 발급받을 수 없었고, 스크립트를 통해 주기적으로 직접 발급받은 와일드카드 인증서를 업로드해 관리하는 데 불편함이 있었다. 이후 托管 DCV(위탁 DCV)가 출시되면서 와일드카드 도메인 인증서를 직접 발급하고 업데이트할 수 있게 되었고, 설명에 따라 직접 관리할 수 있었다. 하지만 몇 달 후에야 발견된 잠재적 위험이 있었다. 이 CNAME 레코드가 지속적으로 존재하면 동일한 접두사의 TXT 레코드를 생성할 수 없게 되어, 다른 곳에서 도메인 소유권을 증명할 수 없게 된다.

해결책
해결책 1:托管 DCV 사용하지 않기
托管 DCV는 _acme-challenge.example.com에 지정된 값을 써야 하며, 본질적으로 해당 도메인이 제3자에게 속한다고 선언하는 것으로, 더 이상 해당 도메인에 대한 제어권을 가지지 못하게 된다.
와일드카드 도메인이 필요하다면, ESA API를 호출하는 작업 스크립트를 통해 와일드카드 인증서를 주기적으로 ESA로 업로드할 수 있다.
해결책 2: DNS-01 검증 방법 사용하지 않기
Certbot은 DNS-01 외에도 HTTP-01, TLS-ALPN-01 등 여러 가지 도메인 소유권 검증(챌린지) 방법을 제공한다.
HTTP-01과 TLS-ALPN-01 방법은 먼저 서비스를 구축하고 접근 가능성을 검증한 후 인증서를 발급받는다.
DNS-01은 서비스 구축 전에 인증서를 미리 발급받을 수 있다.
해결책 3: ESA와 클라우드 DNS 해석의 업무 장벽 허물기
이 두 업무는 모두 알리바바 클라우드에 속해 있지만, 각각 별도의 DNS API를 구현했다. 만약 ESA가 클라우드 DNS 해석에서 CNAME이나 TXT 레코드를 직접 설정하고, 인증서를 발급받은 후 레코드를 삭제할 수 있다면, 다른 곳에서 DNS-01 챌린지를 사용하는 데 영향을 주지 않을 것이다.
해결책 4: 알리바바 ESA 사용하지 않기
cloudflare에서는 이런 문제가 없고, 인증서를 자유롭게 발급받을 수 있다.