nameConstraints — 인증기관(CA)의 폭주를 막는 이름 공간 제약
핵심 인사이트 (3줄 요약)
- 본질: X.509 인증서의
nameConstraints(이름 제약) 확장 필드는, 권력을 가진 부모 인증기관(Sub CA)이 자식 인증서를 찍어낼 때 "너는 오직*.mycompany.com이라는 도메인 주소를 가진 자식들만 합법적으로 찍어낼 수 있고, 구글이나 네이버 같은 다른 집안 도메인 이름으로는 절대 인증서를 찍어낼 수 없어!"라고 도장 발급 권한의 영토(Name Space)를 강제로 가둬버리는 철창(Boundary) 룰이다.- 가치: 글로벌 Root CA가 특정 대기업이나 정부 기관에게 "너희가 알아서 직원들 인증서 찍어 써라"며 중간 발급 권한(Sub CA)을 위임해 줬을 때, 만약 그 기업이 해킹당하거나 배신을 때려서 가짜
google.com인증서를 마구 찍어내 전 세계를 피싱(MITM)하는 재앙적 권력 남용(Rogue CA)을 운영체제(OS)와 브라우저 단에서 100% 원천 차단하는 최고의 예방 백신이다.- 융합: 이 정책은 단순히 금지만 하는 것이 아니라, 허용(Permitted)과 거부(Excluded) 트리를 동시에 설정할 수 있으며, 이메일 주소(RFC822Name), IP 주소 범위 등 Chain of Trust(신뢰의 사슬)를 검증하는 브라우저의 TLS 엔진 로직 깊숙한 곳과 융합되어 단 1글자의 영토 침범도 얄짤없이 쳐내버린다.
Ⅰ. 개요 및 필요성 (Context & Necessity)
-
개념: X.509 인증서 족보는 왕(Root CA) ─▶ 영주(Sub CA) ─▶ 평민(서버 인증서)으로 이어진다. 왕이 영주에게 도장을 주면서 그 도장 밑바닥에
nameConstraints = permitted: *.samsung.com이라는 마법의 글귀(확장 필드)를 새겨 놓는다. 영주(Sub CA)가 자기 권한을 믿고 실수로www.naver.com이름의 평민 신분증을 찍어줬다 치자. 윈도우 OS는 이 평민의 신분증을 볼 때, 그 평민을 낳아준 영주의 도장 밑바닥 룰(nameConstraints)과 평민의 이름(naver.com)을 대조해 보고 "너는 네 영토(삼성)를 벗어난 사생아구나!" 라며 즉각 접속을 죽여버린다. -
필요성 (통제되지 않은 하위 CA의 공포): 2010년대 최악의 보안 재앙 중 하나는 통제 불능의 중간 인증기관(Sub CA)들이었다. 유명한 글로벌 Root CA가 프랑스의 모 관공서에 사내망 편하게 쓰라며 Sub CA 권한을 줬다. 그런데 그 관공서 보안이 뚫리면서, 해커가 그 Sub CA 도장으로 '가짜 구글', '가짜 애플' 인증서를 무한정 찍어내어 전 세계에 뿌렸다. 브라우저는 "어? 글로벌 Root CA의 족보를 타고 내려온 진짜 도장이네?" 라며 가짜 구글을 100% 믿고 녹색 자물쇠를 띄워 수억 명의 비밀번호가 털리는 피싱 공격(MITM)이 성립했다. "이 미친 영주(Sub CA)들이 감히 다른 나라 황제(구글)의 이름을 사칭하지 못하게, 발급 가능한 이름의 한계선(Boundary)을 인증서 자체에 물리적으로 때려 박아라!"라는 절대적 통제 장치가 바로
nameConstraints다. -
💡 비유: 대학교 학생증 발급 권한에 비유해 봅시다.
- nameConstraints가 없는 세상: 교육부(Root CA)가 각 대학교 총장(Sub CA)에게 학생증 발급 기계를 하나씩 줬습니다. A대학교 총장이 미쳐서, 자기 학교 학생이 아닌데 "하버드 대학교 의대생 홍길동"이라는 학생증을 마구 찍어서 팔아먹습니다. 기계가 정품이라 세상 사람들은 다 속아 넘어갑니다. (사기 폭발)
- nameConstraints가 적용된 세상: 교육부가 기계를 줄 때, 기계 칩 안에 "이 기계는 오직
A대학교라는 글자가 들어간 학생증만 인쇄할 수 있음" 이라는 락(nameConstraints)을 강제로 걸어버립니다. A대 총장이 "하버드 대학교"를 입력하고 엔터를 치는 순간 기계가 "영역 밖입니다(Error)!"라며 뱉어버립니다. 남의 학교 이름을 사칭하는 것이 시스템적으로 영원히 불가능해집니다.
-
등장 배경 및 발전 과정:
- 초기 PKI의 방만함: 초창기엔 "CA 인가 권한을 받았으면 무조건 착하게 쓰겠지"라는 성선설에 기반하여 족보(체인)만 검사했다.
- DigiNotar 사태 등 Rogue CA의 충격 (2011): 네덜란드 해킹 사태 등으로 하위 CA가 털려 가짜 구글 인증서가 남발되자 전 세계 브라우저 벤더들이 패닉에 빠짐.
- RFC 5280 강제화 (X.509 v3): IETF가 족보를 검증하는 과정에서 부모 인증서가 가진
nameConstraints확장을 자식 이름과 강제 대조(Path Validation)하도록 표준화하여, 현재 엔터프라이즈 사설 CA 구축의 0순위 필수 셋팅으로 정착함.
-
📢 섹션 요약 비유: 아무리 경찰서장(Sub CA) 권한을 위임받았더라도, '서울 강남경찰서장'의 직인이 찍힌 체포 영장(인증서)으로는 '부산 해운대'에 사는 사람(다른 도메인)을 절대 잡아들일 수 없도록 관할 구역(Name Space)을 엄격하게 법으로 칼로 베어놓은 관할권 통제 시스템입니다.
Ⅱ. 아키텍처 및 핵심 원리 (Deep Dive)
nameConstraints의 2대 정책 트리 (Permitted vs Excluded)
이 확장 필드는 "허락하는 땅(White-list)"과 "절대 안 되는 땅(Black-list)" 두 가지 폴더를 동시에 가질 수 있다.
┌───────────────────────────────────────────────────────────────┐
│ X.509 nameConstraints(이름 제약) 확장의 내부 구조 및 파싱 로직 │
├───────────────────────────────────────────────────────────────┤
│ │
│ [ 부모 기관 (Sub CA)의 인증서 속성 (Extensions) ] │
│ - 📍 nameConstraints: Critical (이 옵션을 모르면 즉시 뻗어라!) │
│ │
│ ✅ 1. 허용된 하위 트리 (Permitted Subtrees) - 화이트리스트 │
│ - DNS: `.samsung.com` (삼성의 모든 서브도메인 발급 허용) │
│ - IP: `192.168.0.0/16` (사내망 IP 대역만 발급 허용) │
│ │
│ ❌ 2. 제외된 하위 트리 (Excluded Subtrees) - 블랙리스트 │
│ - DNS: `test.samsung.com` (삼성 안에서도 test 도메인은 발급 금지) │
│ │
│ =============================================================│
│ │
│ [ 💻 브라우저(크롬)의 Chain of Trust 파싱 및 심판(Validation) 로직 ] │
│ │
│ (상황 1) 이 Sub CA가 `www.samsung.com` 인증서를 발급함. │
│ ▶ 크롬의 뇌: "Permitted의 `.samsung.com`에 속하네? 🟢 Pass!" │
│ │
│ (상황 2) 이 Sub CA가 `auth.test.samsung.com` 인증서를 발급함. │
│ ▶ 크롬의 뇌: "어? Excluded의 `test` 하위 도메인에 걸리네? 🔴 Fail!"│
│ │
│ (상황 3) 이 Sub CA가 `www.google.com` (해킹 피싱) 인증서를 발급함. │
│ ▶ 크롬의 뇌: "Permitted에 google이 없잖아! 넌 영토 밖이야! 🔴 Fail!"│
└───────────────────────────────────────────────────────────────┘
[다이어그램 해설] 여기서 중요한 것은 이 확장이 반드시 Critical (중요=True) 옵션으로 설정되어야 한다는 것이다. Critical이란 "만약 접속하는 클라이언트 장비(구형 핸드폰 등)가 nameConstraints라는 문법 자체를 해석할 줄 모르는 바보라면, 아예 통신을 하지 말고 자폭(Reject)해라!"라는 뜻이다. 해커가 일부러 구형 멍청한 통신 모듈로 파고들어 이름 제약을 무시하고 가짜 인증서를 우회 통과시키는 꼼수(Fallback Attack)를 원천 차단하는 무자비한 X.509의 자물쇠 장치다.
Ⅲ. 실무 적용 및 기술사적 판단
실무 시나리오
-
시나리오 — 대기업 망분리(Private CA) 프로젝트의 치명적 설계 결함 방어: 대기업 금융사가 사내 인트라넷 통신을 위해 1억 원을 들여 '자체 공인인증센터(Private Root CA)'를 구축했다. 그리고 계열사인 'A증권사', 'B카드사' 전산실에 각각 중간 서명 권한(Sub CA)을 나눠주어 알아서 직원들에게 사설 인증서를 발급하게 했다. 그런데 A증권사 직원이 악심을 품고, 자기네 Sub CA로 B카드사 결제망 이름(
pay.b-card.com)의 가짜 인증서를 찍어내어 트래픽을 가로채는 내부자 공격(Lateral Movement)을 성공시켰다.- 판단: 최상위 Root CA 아키텍트가 계열사(Sub CA)에 권한 도장을 파줄 때, 권력의 칼자루를 무제한으로 쥐여준 명칭 제약(nameConstraints) 부재라는 거버넌스 붕괴 사고다.
- 해결책: Root CA가 각 계열사의 중간 인증서(Sub CA)를 생성(Sign)해 줄 때, 무조건
openssl.cnf파일에 족쇄를 걸어야 한다.- A증권사 Sub CA 인증서에는
nameConstraints = permitted;DNS:.a-sec.com을 강제로 박는다. - B카드사 Sub CA 인증서에는
nameConstraints = permitted;DNS:.b-card.com을 강제로 박는다. 이제 A증권사가 아무리 발악하며 B카드사 이름의 가짜 인증서를 찍어내도, 윈도우(Windows)나 사내 브라우저가 접속하는 순간 족보를 읊어보고 "너는 a-sec.com 땅의 영주인데 왜 b-card.com을 찍었어?" 라며 1초 만에 차단(ERR_CERT_NAME_CONSTRAINT_VIOLATION)해 버리며 내부자 공격을 물리적으로 학살한다.
- A증권사 Sub CA 인증서에는
-
시나리오 — 글로벌 Root CA의 브릿지/크로스 서명(Cross-Signing) 리스크 통제: Let's Encrypt라는 신생 무료 CA가 전 세계에 등장했다. 아직 신생이라 구형 안드로이드 폰에는 이 회사의 루트(Root) 신분증이 깔려있지 않아서 사이트 접속이 다 튕겼다. 똥줄이 탄 Let's Encrypt는 이미 유명한 IdenTrust라는 대선배 CA에게 가서 "형님, 제 인증서에 형님 도장(Cross-Signature) 한 번만 찍어주세요! 그래야 구형 폰들이 절 믿어주죠 ㅠㅠ"라고 빌었다. 대선배는 도장을 찍어줬다. 하지만 선배는 불안했다. "이 신생아 자식들이 혹시 실수로 해커한테 털려서 내 이름에 똥칠하면 어쩌지?"
- 판단: 선배 CA가 후배 CA에게 신뢰를 빌려줄 때, 그 후배의 권한 남용을 방어할 수단이 없으면 선배도 같이 파산하는 PKI 연대보증의 공포다.
- 해결책: 선배(IdenTrust)가 후배(Let's Encrypt)를 위해 보증(크로스 인증서)을 서줄 때, **
nameConstraints블랙리스트(Excluded)**를 강력하게 박아버린다.Excluded = DNS: *.google.com, DNS: *.apple.com, DNS: *.microsoft.com ..."신생아 너희들이 일반 쇼핑몰 인증서 찍어내는 건 내 권위로 빌려줄게. 하지만 혹시라도 너네가 털려서 구글, 애플 같은 초거대 글로벌 도메인 인증서를 찍어내면? 그건 내 보증(체인) 효력이 무효화된다!" 이렇게 선을 그어둠으로써, 생태계를 돕는 크로스 서명을 하면서도 자신의 거대 리스크(Blast Radius)를 완벽하게 통제하는 외교적 아키텍처가 완성된다.
도입 체크리스트
- 이메일 주소(rfc822Name)와 URI 통제:
nameConstraints는 웹 주소(DNS)만 막는 게 아니다. 사내 이메일 서명용 인증서 체인을 발급할 때,permitted;email:.@mycompany.com이라고 이메일(rfc822Name) 제약을 걸어버려야 한다. 이를 빼먹으면, 훔쳐 낸 사내 인증서로 해커가 감히ceo@mycompany.com이나admin@naver.com같은 외부 도메인 이메일 계정으로 사칭 서명을 해서 사기 이메일(Phishing)을 뿌리는 짓을 방치하게 된다. DNS, Email, IP Address 3대장에 대한 제약 셋팅은 Sub CA 발급의 절대 수칙이다.
Ⅳ. 기대효과 및 결론
정량/정성 기대효과
| 구분 | 제한 없는 무제한 Sub CA 발급 | nameConstraints 족쇄 채운 Sub CA | 보안 및 비즈니스 개선 효과 |
|---|---|---|---|
| 정량 (사칭 사고 피해율) | Sub CA 1개 털리면 전 세계 모든 사이트 사칭 가능 | 명시된 하위 도메인 1개 구역으로 피해 국한 | 해킹 및 오발급에 의한 피해 범위(Blast Radius) 99% 축소 |
| 정량 (감사 비용) | 하위 CA가 엉뚱한 걸 안 찍는지 매일 사람이 감시 | 브라우저/OS 커널단에서 수학적으로 자동 컷 | 중간 인증기관 모니터링/감사(Audit) 리소스 비용 제로화 |
| 정성 (제로 트러스트) | "우리 계열사 보안팀은 믿으니까 권한 줄게" | "시스템이 강제하지 않은 권한은 절대 안 믿는다" | 인간의 신뢰가 아닌 수학과 프로토콜에 기반한 통제 체계 완성 |
인간의 탐욕과 실수는 끝이 없다. PKI 생태계에서 누군가에게 도장을 찍을 수 있는 서명 권한(CA)을 넘겨준다는 것은, 핵무기 발사 버튼을 쥐여주는 것과 같다. nameConstraints는 이 핵무기가 절대 바다 밖을 벗어나 엉뚱한 대륙을 타격하지 못하도록 탄두에 강제로 심어둔 무자비한 자폭 코드이자 기하학적 감옥이다. 기술사는 사내 망분리나 B2B 통신망에서 사설 인증기관(Private CA)을 설계할 때, 인증서 발급의 성공에만 웃음 짓지 말고, 발급된 서명 권한이 이탈했을 때 시스템이 단 1초 만에 이를 쳐형(Block)할 수 있는 이 위대한 **'영토 구획의 미학(Namespace Compartmentalization)'**을 아키텍처 가장 깊은 곳에 서슬 퍼렇게 벼려두어야 한다.
📌 관련 개념 맵 (Knowledge Graph)
| 개념 명칭 | 관계 및 시너지 설명 |
|---|---|
| Chain of Trust (신뢰의 족보) | 평민 ─▶ 영주(Sub CA) ─▶ 왕(Root CA)으로 이어지는 인증서의 족보. 브라우저가 이 족보를 따라 올라가며 검사할 때, 중간 영주가 제 분수(nameConstraints)를 넘었는지 귀신같이 찾아낸다. |
| Sub CA (중간 인증 기관) | 왕(Root CA)은 너무 바빠서 오프라인 금고에 잠들어 있고, 대신 도장 찍는 빡센 실무를 대행하는 중간 관리자. 해커들의 1순위 먹잇감이라 nameConstraints 족쇄가 필수다. |
| Rogue CA (부패한 인증기관) | 해킹을 당했거나 돈을 받고 타락해서, 구글이나 애플 같은 남의 회사 이름으로 가짜 신분증(인증서)을 마구 찍어내서 전 세계를 피싱 지옥으로 밀어 넣는 최악의 범죄자 인증기관. |
| Basic Constraints (기본 제약) | nameConstraints가 "너는 어느 동네(이름)만 찍어!"라면, Basic Constraints는 애초에 "너는 도장을 찍을 수 있는 부모(CA)냐, 아니면 그냥 평민(End-Entity)이냐?"를 가르는 더 원초적인 스위치다. |
| Certificate Pinning (인증서 고정) | nameConstraints가 뚫렸을 최악의 경우를 대비해, 스마트폰 앱 속에 "우리 회사 서버는 무조건 이 인증서 지문 딱 1개만 믿어!"라고 코딩을 박아버려 가짜 족보를 들이밀어도 원천 튕겨버리는 철벽 방어 기술. |
👶 어린이를 위한 3줄 비유 설명
- 경찰 서장님(Root CA)이 각 동네 파출소장님(Sub CA)에게 '주차 단속 딱지(인증서)'를 끊을 수 있는 도장을 하나씩 나눠주었어요.
- 만약 강남구 파출소장님이 미쳐서 저기 부산 해운대구에 놀러 가서 딱지를 마구 떼면 온 나라가 엉망진창이 되겠죠?
- 그래서 서장님이 도장에 마법을 걸어뒀어요! "이 도장은 [강남구] 안에서만 찍히고, 밖에서는 절대 안 찍힘! (nameConstraints)" 그래서 아무리 파출소장이 나쁜 마음을 먹어도 자기 동네 밖에서는 절대 권력을 쓸 수 없게 가둬두는 천재적인 안전장치랍니다!