2011년 여름, DigiNotar라는 작은 네덜란드 회사가 *.google.com에 대한 와일드카드 인증서를 발급했다.
구글은 요청한 적이 없다. 구글은 DigiNotar의 고객이었던 적도 없다. 하지만 그건 중요하지 않았다. 지구상 모든 브라우저가 DigiNotar를 신뢰했고, 신뢰받는 CA가 서명한 인증서는 거기 적힌 이름이 무엇이든 유효한 인증서이기 때문이다. 이란의 누군가가 그 인증서로 Gmail에 대한 중간자 공격을 벌였다. 사후 보고서는 위조된 인증서를 통해 구글 서비스에 접속하려 한 고유 IP 주소 298,140개를 집계했다. 그중 95%가 이란이었다.
DigiNotar는 한 달 안에 사라졌다. Mozilla, Microsoft, Google이 루트를 제거했고, 회사는 9월 20일 파산을 신청했으며, 수년간 네덜란드 정부 인증서에 조용히 서명해 온 CA가 그냥 존재하기를 멈췄다.
공격보다 더 신경 쓰여야 할 부분이 있다. 시스템의 어떤 것도 이걸 막지 못했다는 것이다. DigiNotar는 구글 인증서를 발급해선 안 됐지만, 그걸 막는 기술적 규칙은 없었다. 세상의 어느 인증기관 하나와 당신 도메인의 완벽한 위조본 사이를 가로막는 유일한 것은, 그들이 그러지 않기로 되어 있다는 사실뿐이다.
신뢰 모델은 거대한 OR다
브라우저의 인증서 설정을 열어 루트 저장소(root store)를 보라. 들어본 적 없는 인증기관들, 떠올린 적도 없는 나라의 회사들이 운영하는 CA 목록이 나온다. 그리고 당신의 브라우저는 그 하나하나를 완전히, 무조건적으로 신뢰한다.
2025년 말 기준, Mozilla 루트 저장소는 TLS 신뢰 비트가 켜진 루트 CA 약 144개를 탑재한다. Apple, Microsoft, Chrome은 각자의 저장소를 운영하는데, 목록이 상당히 겹치지만 동일하지는 않다. 어느 기기를 쓰느냐에 따라 대략 150개 안팎이다.
여기서 대부분이 잘못 아는 핵심: 그 CA 중 어느 하나라도 어떤 도메인에 대해서든 인증서를 발급할 수 있다. 자기가 “소유한” 도메인만이 아니다. 아무 도메인이나. 당신 것, 내 것, 은행 것. 신뢰는 분할되어 있지 않다. 한쪽 관할권의 CA가 지구 반대편에 등록된 호스트명을 보증할 수 있고, 당신의 브라우저는 눈 하나 깜짝 않고 받아들인다.
그러니 인증서 위조에 대한 당신의 보안은 당신이 쓰는 CA의 강도가 아니다. 150개 중 가장 약한 곳의 수준이다. 이 구조물 전체가 논리적 OR다. 공격자는 그중 단 하나만 잘못 발급하거나, 침해당하거나, 강요당하게 만들면 된다. 신뢰하지 않을 149명의 낯선 이를 당신이 고를 수도 없다.
보안 시스템을 이렇게 짓는 건 터무니없다. 그런데 이게 우리가 가진 시스템이다.
해법은 있었다. 안 썼을 뿐.
답답한 건, X.509에 수십 년 전부터 CA의 범위를 제한하는 메커니즘이 있었다는 것이다. 이름 제약(name constraints), RFC 5280에 정의되어 있다. “이 기관은 example.gov 하위의 이름만 서명할 수 있고 그 외엔 안 된다”고 명시한 CA 인증서를 발급할 수 있다. 제약이 걸린 인증서를 받은 하위 CA는 자기 차선 밖에서는 무해하다 — google.com에 대한 유효한 인증서를 물리적으로 만들어낼 수 없다.
그런데 왜 모든 퍼블릭 루트에 제약이 걸려 있지 않을까?
이유는 둘, 그리고 서로를 먹여 살린다. 첫째, 퍼블릭 CA는 사업체고 그들의 제품 자체가 “유료 고객이 통제권을 증명할 수 있는 도메인이라면 무엇이든 서명해 주는 능력”이다 — 제약을 걸면 사업의 의미가 사라진다. 둘째, 클라이언트 지원이 엉망이었다. 수년간 이름 제약을 안정적으로 강제한 건 Firefox뿐이었고, 다른 검증기들은 장식품처럼 취급하거나 아예 무시했다. 그리고 일부 클라이언트만 확인하는 보안 통제는 통제가 아니다. 권고일 뿐이다. 그러니 아무도 의존할 수 없었고, 아무도 밀어붙이지 않았고, 그렇게 변방에 머물렀다 — 사설·정부 PKI에서는 유용하지만 퍼블릭 웹에서는 부재한 채로.
결과적으로 퍼블릭 신뢰 모델은 절실히 필요했던 분할을 끝내 얻지 못했다. 모든 루트가 여전히 무엇이든 서명할 수 있다.
그런데 왜 이게 매주 안 터지나
지렛대가 옮겨 갔기 때문이다.
시스템을 떠받치는 건 영리한 프로토콜이 아니다. 루트 저장소를 운영하는 쪽이 CA를 죽일 의지를 갖게 됐고, CA들이 그걸 안다는 사실이다. 인증기관은 암호학적으로 특권을 가져서 존재하는 게 아니다. 네댓 개 브라우저 루트 프로그램이 그 인증서를 목록에 남겨 두기로 합의해서 존재한다. 그 합의가 멈추는 순간 CA는 무가치해진다 — 그동안 서명한 모든 인증서가 브라우저 경고로 변한다.
이건 비교적 최근에 생긴 종류의 권력이고, 규칙보다 처형 사례가 이야기를 더 잘 들려준다.
2017년, Chrome과 Mozilla는 Symantec을 불신하기로 했다 — 당시 웹에서 가장 큰 상용 CA, 존재하는 전체 인증서의 거대한 몫을 책임지던 곳이, 수년간의 오발급 사건 끝에. 하룻밤에 뽑아낼 수는 없었다. 영향 반경이 너무 컸다. 2018년 내내 단계적으로 빼냈고 결국 루트는 사라졌다. Symantec은 같이 죽기보다 CA 사업을 매각했다.
2022년, Mozilla와 Microsoft는 TrustCor를 제거했다. 흥미로운 건 이유다. 특정 위조 인증서가 아니라, 그 CA가 스파이웨어를 배포하는 회사와 연결되어 있다는 보도였다. TrustCor가 무엇을 오발급했는지가 아니라 어떤 곳으로 보이는지를 근거로 뽑아냈다. 신뢰성이라는 게 거래의 일부이고, 그 의미를 정하는 건 루트 프로그램이라는 뜻이다.
그리고 2024년, Google은 Entrust를 불신하겠다고 발표했다 — 업계에서 가장 오래된 이름 중 하나를. 일련의 컴플라이언스 실패, 그리고 사건 보고에 대한 “실질적이고 측정 가능한 진전의 부재”를 들면서. 타임스탬프가 2024년 11월 11일 이후인 인증서는 Chrome에서 그냥 신뢰되기를 멈췄다. Apple과 Mozilla가 몇 주 안에 뒤따랐다. 메시지는 명확했다. 긴 역사와 큰 고객 기반은, 기준을 충족하기를 멈추는 순간 아무것도 사 주지 못한다.
이제 권력은 명시적이다
웹 역사 대부분 동안 Chrome에는 자기 루트 저장소조차 없었다 — 운영체제 것을 빌려 썼다. 그게 바뀌었다. 2022년 9월 Chrome 105부터 Google은 Chrome Root Store를 배포하기 시작했고, 이제 Windows, macOS, Linux, Android, ChromeOS에서 OS와 무관한 자체 목록을 탑재한다.
다시 읽어 보라. 지구상에서 가장 많이 쓰이는 소프트웨어가, 이제 어떤 인증기관이 웹의 신뢰에 참여할 수 있는지를 스스로 결정한다. 여기에 CA/Browser Forum의 Baseline Requirements와 실제로 처형할 의지를 더하면, 현대 시스템의 진짜 모양이 나온다.
우리는 OR 게이트를 고치지 못했다. 대신 150명의 선수 중 누구든 경기장에서 퇴장시킬 수 있는 심판을 고용했다.
그러니 누군가 웹의 보안이 150개 인증기관에 달려 있다고 말한다면, 거꾸로 알고 있는 것이다. 150개 CA는 집행유예 중에 신뢰받는 쪽이다. 실제 신뢰 — 당신의 암호화된 연결이 궁극적으로 의존하는 것 — 는 루트 프로그램을 운영하며 필요할 때 루트를 뽑아낸다는 걸 보여 준 소수의 사람들에게 있다. 50개국에 흩어진 낯선 이 150명보다 작고, 더 책임을 묻기 쉬운 집단이다. 진짜 개선이다.
그리고 이건 누구도 설계해서 만든 게 아니다. 우리는 죽은 CA를 하나씩 밟으며 여기로 흘러들어 왔다.