CAA 레코드

DNS CAA 레코드
DNS Certification Authority Authorization


0. 용어 정리

Domain Name : Domain을 식별하기 위한 주소
ex) google.com, naver.com, dwer.kr

DNS 레코드 (DNS RR) : Domain Name에 대한 정보를 가지고 있는 Record 값. 종류로는 A, AAAA, CNAME, MX, TXT 등이 있음

CA (Certificate Authority) : 디지털 인증서를 발급하는 기관. 공신력이 있는 기관의 인증서를 발급받아야 정상적인 서비스가 가능

[인증서 종류]
일반 인증서 예시 : dwer.kr, google.com
Wildcard 인증서 예시: *.dwer.kr, *.google.com (*, 와일드카드 발급)



1. CAA 레코드란?

- Domain Name에 대한 인증서 정책을 선언/확인하기 위한 DNS 레코드
- 해당 Domain Name의 인증서를 발급할 수 있는 기관이 어디인지 확인할 수 있다. (정책을 기반으로)

선언할 수 있는 정책의 예시는 다음과 같음
ex) "dwer.kr 일반 인증서를 발급할 수 있는 CA는 amazon.com 가 유일하다"
ex) "dwer.kr의 Wildcard 인증서를 발급할 수 있는 CA는 amazon.com, letsencrypt.org 가 있다"
ex) "dwer.kr는 일반 인증서를 발급하지 않는다"
ex) "dwer.kr의 일반 인증서를 발급할 수 있는 CA는 amazon.com, letsencrypt.org가 있으며, Wildcard 인증서는 발급하지 않는다"


- CA에서는 Domain Name에 대한 인증서를 발급하기 전 CAA 레코드를 확인, 자신들이 해당 Domain Name에 대한 CA가 맞는 경우에만 인증서를 발급한다. (일반적으로)

- 위 사진은 필자의 도메인에서 CAA 레코드에 의해 인증서가 발급되지 못한 모습이다.
- 필자의 CAA 레코드에서 letsencrypt.org를 허용하는 정책을 업데이트하여 문제를 해결함


2. 선언 방법

DNS Zone File에 다음 레코드를 추가, 적용하면 된다.
Domain Name과 CA는 자신이 원하는 대로 수정하면 된다.

(0) 주의점

일반 인증서와 Wildcard 인증서를 구분하여 선언한다.
만일 CAA 레코드가 없는 경우(부재), 모든 CA에서 인증서를 발급할 수 있는 것으로 간주한다.


(1) 일반 인증서 

Value format : {0 issue CA이름}

[예시]
1
2
3
4
5
6
7
8
9
dwer.kr.    IN    CAA    0 issue "amazon.com"
-> "dwer.kr의 일반 인증서를 발급할 수 있는 CA는 amazon.com 가 유일하다"
 
dwer.kr.    IN    CAA    0 issue "amazon.com"
dwer.kr.    IN    CAA    0 issue "letsencrypt.org"
-> "dwer.kr의 일반 인증서를 발급할 수 있는 CA는 amazon.com, letsencrypt.org 가 있다"
 
dwer.kr.    IN    CAA    0 issue ";"
-> "dwer.kr의 일반 인증서는 발급하지 않는다"
cs


(2) 와일드카드 인증서

Value format : {0 issuewild CA이름}

[예시]
1
2
3
4
5
6
7
8
9
dwer.kr.    IN    CAA    0 issuewild "amazon.com"
-> "dwer.kr의 Wildcard 인증서를 발급할 수 있는 CA는 amazon.com 가 유일하다"
 
dwer.kr.    IN    CAA    0 issuewild "amazon.com"
dwer.kr.    IN    CAA    0 issuewild "letsencrypt.org"
-> "dwer.kr의 Wildcard 인증서를 발급할 수 있는 CA는 amazon.com, letsencrypt.org 가 있다"
 
dwer.kr.    IN    CAA    0 issuewild ";"
-> "dwer.kr의 Wildcard 인증서는 발급하지 않는다"
cs


(3) CA가 정책에 위반된 인증서 발급 요청을 받을시 CA가 연락하기 위한 이메일

Value format : {0 iodef "mailto:메일주소"}

[예시]
1
dwer.kr.    IN    CAA    0 iodef "mailto:master@dwer.kr"
cs

* 참고로, iodef는 실제로 작동하지 않는 경우가 많습니다. 법적 의무사항은 아니니까요(?)



3. 예시

[BIND9 양식]
1
2
3
4
dwer.kr.    IN    CAA    0 issue "amazon.com"
dwer.kr.    IN    CAA    0 issue "letsencrypt.org"
dwer.kr.    IN    CAA    0 issuewild ";"
dwer.kr.    IN    CAA    0 iodef "mailto:master@dwer.kr"
cs
-> "dwer.kr의 일반 인증서를 발급할 수 있는 CA는 amazon.com, letsencrypt.org가 있으며, Wildcard 인증서는 발급하지 않는다. 정책에 위반된 요청시 master@dwer.kr로 이메일을 발송한다."


[AWS Route53]
-> "example.com의 일반 인증서 및 Wildcard 인증서는 amazon.com CA에서만 발급할 수 있다. 정책에 위반된 요청시 master@dwer.kr로 이메일을 발송한다."



[GCP CloudDNS]



[Google Domains]




(실제 CAA 쿼리시)

* 간혹 네임서버 버전이 낮은 경우 CAA 레코드 지원이 안될 수도 있음.


4. 참고 링크

https://sslmate.com/caa/
쉽게 CAA 레코드를 생성할 수 있는 사이트

https://dnsspy.io/labs/caa-validator
https://caatest.co.uk/
CAA 레코드가 잘 반영되어 있는지 확인할 수 있는 사이트



댓글