연재를 쓰는 동안 같은 문장을 여러 번 적었다. "지운 뒤에는 신뢰할 수 있는 루트 인증 기관에 이 인증서가 남아 있지 않은지 확인한다." 3편의 RAON K, 4편의 위즈베라, 8편의 D'Amo 까지 매번 나온 말이다. 그래서 이번에는 프로그램 하나가 아니라 인증서 저장소 쪽에서 거꾸로 보기로 했다. 내 PC 에 들어 있는 루트 인증서 가운데 보안 프로그램이 넣은 것이 몇 개나 되는지부터 세었다.
77개 가운데 16개
Windows 의 루트 인증서는 컴퓨터 저장소(Cert:\LocalMachine\Root)와 현재 사용자 저장소(Cert:\CurrentUser\Root)에 나뉘어 있다. 컴퓨터 저장소에 든 것은 그 PC 의 모든 사용자에게 적용된다. 내 PC 의 컴퓨터 저장소에는 루트가 77개 있었다. 대부분은 Windows 가 처음부터 갖고 있거나 업데이트로 받는 공인 인증 기관이고, 나머지를 골라내려면 이름을 하나씩 봐야 한다.
Get-ChildItem Cert:\LocalMachine\Root |
Sort-Object NotBefore |
Format-Table @{ n = 'Name'; e = { $_.GetNameInfo('SimpleName', $false) } },
NotBefore, NotAfter -AutoSize
발급일순으로 정렬하면 보안 프로그램이 넣은 것들이 아래쪽에 몰린다. 설치한 날에 만들어진 인증서가 많아서다. 국내 보안·인증 업체 이름이 붙은 루트를 추려 보니 16개였다. 그중 이 연재에서 다룬 프로그램과 짝이 맞는 것이 아래 9개다. 모두 발급자와 주체가 같은 자체 서명 인증서였다.
| 루트 인증서 | 함께 들어온 프로그램 | 유효 기간 | 길이 |
|---|---|---|---|
| RAON K ROOT CA | RAON K (3편) | 2018-09-19 ~ 2038-12-31 | 약 20년 |
| Delfino-CA | Delfino G3 (4편) | 2026-06-29 ~ 2046-06-25 | 20년 |
| Veraport-CA | Veraport (4편) | 2026-06-29 ~ 2046-06-25 | 20년 |
| INCA Internet Co., Ltd. G3 | nProtect Online Security (10편) | 2026-06-22 ~ 2027-06-22 | 1년 |
| INTEREZEN CA | IPinside LWS Agent (11편) | 2026-06-30 ~ 2046-06-25 | 20년 |
| Dreamsecurity ROOT CA | MagicLine4NX (12편) | 2015-09-03 ~ 2035-08-29 | 20년 |
| Hancom Secure Root Authority | AnySign4PC (13편) | 2016-04-19 ~ 2036-04-14 | 20년 |
| Hancom With Root Authority | AnySign4PC (13편) | 2025-12-23 ~ 2045-12-23 | 20년 |
| iniLINE CrossEX RootCA2 | CrossEX (14편) | 2018-10-10 ~ 2099-12-31 | 약 81년 |
짝은 회사 이름으로 맞춘 것이다. INTEREZEN CA 는 주체에 담당자 이메일까지 들어 있었고, IPinside 를 만든 회사 이름과 같다. 한컴 이름의 루트 두 개는 AnySign4PC 를 만든 한컴위드 계열 이름이라 그쪽에서 들어온 것으로 보인다.
나머지 7개는 연재에서 따로 다루지 않은 프로그램의 것이다. ASTxRoot2, KICA NXS Root CA, Crosscert_Trust_Root_CA, SignKorea 의 Root, ExEcm-Root-CA, Kings Information & Network 의 Local Root CA, KWIC Certificate Auth V2 가 있었다. ASTxRoot2 는 이름으로 보아 안랩 Safe Transaction 쪽 루트로 보인다. 같은 PC 에 한국정보인증(KICA), 한국전자인증(CrossCert), 코스콤(SignKorea), CoreB2B 의 프로그램이 함께 깔려 있었으니 각각 거기서 들어왔을 가능성이 크다. KICA·CrossCert·SignKorea·ExEcm·Kings 의 루트는 22~26편의 번외 편에서 프로그램과 함께 다시 본다.
20년, 1년, 그리고 2099년
표를 기간으로 다시 읽으면 세 갈래가 보인다.
첫째는 설치한 날 발급된 20년짜리다. Delfino-CA 와 Veraport-CA 는 위즈베라 프로그램을 깐 6월 29일에, INTEREZEN CA 는 IPinside 가 들어온 6월 30일에 발급되었다. 설치할 때 PC 마다 새로 만드는 루트로 보인다. 이 방식이면 한 PC 의 개인 키가 새도 다른 PC 에는 번지지 않는다.
둘째는 발급일이 설치일보다 몇 년 앞선 것이다. RAON K 는 2018년, 드림시큐리티는 2015년, CrossEX 는 2018년에 발급되었다. 내 PC 에 들어온 날짜와 상관없이 제품에 같은 인증서가 담겨 있다는 뜻으로 보인다. 그렇다면 이 제품을 깐 모든 PC 가 같은 루트를 믿고 있는 셈이고, 그 루트의 개인 키를 어디에 어떻게 두는지가 훨씬 중요해진다. 그 부분은 밖에서 확인할 방법이 없었다. 특히 CrossEX 루트는 만료가 2099년 12월 31일이다. 사실상 기한이 없는 인증서이고, 같은 인증서가 설치 폴더에 rootCA.crt 파일로도 들어 있었다.
셋째는 1년짜리다. nProtect 의 INCA Internet G3 는 설치한 6월 22일에 발급되어 2027년 6월 22일에 끝난다. SignKorea 의 Root 도 2026-04-05 부터 1년이다. 기한이 짧은 것은 키가 새더라도 쓸 수 있는 시간이 짧다는 점에서 바람직하다. 다만 1년이 지나면 프로그램이 새 루트로 바꿔 넣을 것으로 보이는데, 그 갱신이 어떻게 이루어지는지는 아직 기한이 오지 않아 확인하지 못했다.
루트 인증 기관이라는 자리
이 인증서들이 들어가는 이유는 3·4편에서 본 대로다. https 로 된 은행 페이지가 PC 의 127.0.0.1 포트와 통신하려면, 그 포트의 프로그램도 브라우저가 믿는 인증서를 내밀어야 한다. 그래서 프로그램이 자기 루트를 신뢰 목록에 넣고, 그 루트로 127.0.0.1 용 인증서를 만들어 쓴다. 실제로 Veraport 의 16106 번 포트는 Veraport-CA 가 발급한 CN=127.0.0.1 인증서로 응답했다.
문제는 신뢰할 수 있는 루트라는 자리가 127.0.0.1 에만 쓰이도록 묶여 있지 않다는 점이다. 이 저장소에 든 인증 기관은 원칙적으로 어떤 사이트 이름으로 인증서를 발급해도 브라우저가 믿는다. 개인 키가 제대로 관리되는 동안은 문제가 없지만, 키가 새면 남의 사이트를 흉내 내는 데 쓰일 수 있다. 프로그램을 지웠는데 루트만 남아 있다면, 쓰지도 않는 회사에 그 자리를 계속 내주고 있는 것이다.
certlm.msc 와 certmgr.msc 로 지우기
루트 인증서를 지우는 일은 프로그램을 지운 다음에 한다. 프로그램이 남아 있는 상태에서 인증서만 지우면 사이트에서 연결 오류가 나고, 프로그램이 다음 실행 때 다시 넣기도 한다.
화면은 두 가지다. certlm.msc 는 컴퓨터 저장소, certmgr.msc 는 현재 사용자 저장소를 연다. 실행 창(Win+R)에 이름을 입력하면 되고, certlm.msc 에서 지우려면 관리자 권한이 필요하다. 둘 다 "신뢰할 수 있는 루트 인증 기관 → 인증서"로 들어가 이름을 찾아 삭제한다. 3·4편에서 "양쪽 저장소에 모두 있었다"고 적었는데, Windows 는 현재 사용자 화면에 컴퓨터 저장소의 루트도 함께 보여 준다. 그래서 certlm.msc 에서 먼저 지우고, certmgr.msc 를 다시 열어 남은 것이 있는지 보는 순서가 헷갈리지 않는다.
지울 때 지키는 원칙은 하나다. 이름을 보고 어느 프로그램의 것인지 확실한 것만 지운다. 낯선 이름이라고 해서 Windows 기본 루트를 지우면 정상 사이트 접속이 깨질 수 있다. 위 PowerShell 결과에서 발급일이 최근이고 국내 보안 업체 이름이 붙어 있으며, 그 업체의 프로그램이 설치된 앱 목록에서 이미 사라진 경우가 지울 대상이다.
루트 인증서는 보안 프로그램이 브라우저와 이어지는 한쪽 끝이다. 다른 쪽 끝은 그 인증서로 문을 여는 로컬 포트다. 다음 편에서는 Get-NetTCPConnection 으로 이 PC 에 열린 포트를 모아 놓고, 127.0.0.1 과 0.0.0.0 이 무엇이 다른지 본다.