이 공개키가 진짜 그 사람 걸까, 인증서
지난 강에서 개인키로 서명해 위조할 수 없는 표시를 만드는 법을 봤어요. 그런데 한 가지 빈틈이 남아요. 누군가의 공개키로 메시지를 잠그거나 서명을 확인하려면, 먼저 그 공개키가 진짜 그 사람 것이어야 하죠. 만약 중간에서 누가 슬쩍 자기 공개키를 그 사람 것처럼 건넸다면요? 우리는 무엇을 믿고 그 공개키가 진짜라고 할 수 있을까요?
가짜 공개키가 끼어들 수 있어요
지금까지 우리는 공개키를 그냥 믿고 썼어요.
받은 공개키가 당연히 그 사람 것이라고요.
그런데 여기에 빈틈이 하나 있어요.
나와 상대 사이에 누가 끼어 있다면요?
그 사람이 진짜 공개키 대신
자기 공개키를 슬쩍 건네면
나는 모르고 그걸 진짜로 믿어버려요.
그러면 내가 잠근 비밀은
엉뚱한 사람에게 풀려버리죠.
공개키 자체는 멀쩡한데
그게 누구 것이냐가 흔들리는 거예요.
보내는 공개키를 눌러봐요. 진짜 공개키가 그대로 오면 안전하지만, 중간에서 바꿔치기된 가짜가 오면 위험을 알아챌 수 있어요.
두 경우의 차이가 보였죠.
진짜가 그대로 오면 아무 문제 없어요.
하지만 가짜로 바꿔치기되면
나는 그걸 알아챌 방법이 없었어요.
공개키만 봐서는
그게 진짜 주인 것인지 알 수가 없거든요.
공개키에는 이름표가 안 붙어 있으니까요.
그러니 필요한 건 분명해요.
이 공개키가 진짜 그 사람 것이라고
믿을 만하게 보증해 줄 무언가요.
다음에서 그 보증을 누가 해주는지 봐요.
신뢰받는 기관이 보증해요
여기서 모두가 믿는 기관이 등장해요.
인증기관, 줄여서 CA라고 불러요.
사이트는 자기 공개키를 CA에 가져가요.
CA는 그게 진짜 그 사이트 것인지 확인하고
이렇게 보증해 줘요.
이 공개키는 진짜 이 사이트의 것이다.
그리고 그 보증에 자기 개인키로 서명을 붙여요.
위조할 수 없는 그 서명 말이에요.
공개키와 사이트 이름, CA의 서명이
한 묶음으로 담긴 이 문서가 바로 인증서예요.
공개키에 믿을 만한 신원표가 붙은 셈이죠.
발급 단계를 차례로 눌러봐요. CA가 사이트 공개키를 확인하고, 보증에 자기 서명을 붙여 인증서로 묶어줘요.
이제 공개키 혼자 떠다니지 않아요.
CA의 서명이라는 보증을 등에 업었죠.
핵심은 그 서명이 위조될 수 없다는 거예요.
CA의 개인키는 CA만 가지고 있으니까요.
그래서 인증서를 받은 사람은
CA의 공개키로 그 서명을 확인할 수 있어요.
서명이 맞으면 보증은 진짜고
공개키도 적힌 그 사이트 것이 맞아요.
하지만 여기서 또 하나가 걸려요.
그 CA는 또 어떻게 믿죠?
다음에서 신뢰의 사슬을 따라가 봐요.
브라우저의 신뢰 목록, PKI
CA를 믿는 근거는 의외로 단순해요.
브라우저에는 신뢰하는 CA들의 목록이
처음부터 미리 들어 있어요.
이 목록은 출발점이 되는 믿음이에요.
사이트가 인증서를 보내면
브라우저는 그걸 서명한 CA를 봐요.
그 CA가 또 상위 CA의 보증을 받았다면
그 위로 한 칸씩 따라 올라가요.
그렇게 올라가다
신뢰 목록에 있는 CA에 닿으면
사슬이 믿음에 연결돼 검증이 끝나요.
이렇게 보증이 보증을 잇는 구조 전체를
공개키 기반구조, PKI라고 불러요.
사슬을 한 칸씩 따라 올라가 봐요. 사이트 인증서에서 시작해 브라우저가 신뢰하는 CA에 닿으면 검증이 완성돼요.
사슬을 따라 올라가니
결국 믿음의 출발점에 닿았죠.
브라우저가 미리 신뢰하는 그 CA요.
거기까지 사슬이 끊김 없이 이어지면
맨 아래 사이트의 공개키까지
믿을 수 있게 되는 거예요.
보증이 보증을 떠받치는 구조예요.
나는 사이트를 직접 몰라도
내가 믿는 CA가 보증해 줬으니 믿어요.
그렇다면 실제로 인증서가 들어왔을 때
무엇을 보고 통과와 경고를 가를까요?
다음에서 그 검증을 비교해 봐요.
진짜 인증서는 통과, 가짜는 경고
브라우저가 인증서를 받으면
두 가지를 차분히 따져봐요.
먼저 서명한 CA가 신뢰 목록에 닿는지.
그리고 그 서명이 실제로 들어맞는지.
둘 다 맞으면 인증서는 통과예요.
주소창에 잠금 표시가 뜨고
안심하고 비밀을 주고받을 수 있어요.
반대로 신뢰 목록에 없는 곳이 서명했거나
서명이 어긋나거나 사이트 이름이 안 맞으면
브라우저가 큼직한 경고를 띄워요.
이 검증이 가짜 공개키를 걸러내는 문지기예요.
두 인증서를 비교해 봐요. 신뢰 목록에 닿는 진짜는 통과하고, 신뢰 안 된 곳이 서명한 가짜는 경고를 띄워요.
진짜 인증서는 조용히 통과했죠.
가짜는 곧장 경고로 막혔고요.
그 경고가 바로 우리를 지켜주는 신호예요.
웹을 쓰다 큼직한 경고 화면을 만나면
그냥 무시하고 넘어가지 말라는 뜻이에요.
그 사이트의 공개키가 진짜인지
믿을 만하게 보증되지 않았다는 알림이거든요.
첫 강에서 본 가짜 공개키의 위험을
바로 이 검증이 막아주는 거예요.
이제 인증서가 무엇을 지키는지 또렷해졌죠.
다음에서 전체를 한 번에 정리해 봐요.
정리해볼까요
한 줄로 모으면 이래요.
공개키를 안전하게 쓰려면
그게 진짜 그 사람 것인지 믿을 수 있어야 해요.
중간에서 가짜 공개키를 건네면 위험하니까요.
그래서 신뢰받는 기관 CA가
이 공개키는 진짜 이 사이트 것이라고 서명해 보증해요.
이 보증 문서가 인증서예요.
브라우저는 신뢰하는 CA 목록을 미리 가지고 있어
인증서를 그 목록까지 따라 올라가 검증해요.
보증이 맞으면 통과, 어긋나면 경고예요.
이 신뢰의 그물 전체가 PKI고요.
핵심을 차례로 눌러 되짚어봐요. (가짜 공개키 위험 -> CA가 서명해 보증 -> 신뢰 목록으로 따라 올라감 -> 통과 또는 경고)
이제 그 공개키가 진짜 그 사람 것인지
무엇을 믿고 판단하는지 알게 됐어요.
혼자 떠다니는 공개키는 흔들리지만
CA의 보증이 붙은 인증서는 믿을 수 있죠.
우리가 매일 보는 주소창의 잠금 표시 뒤에
바로 이 인증서와 신뢰의 사슬이 있어요.
암호의 여러 조각이 이렇게 모이면
실제로 안전한 통신 하나를 이룰 수 있어요.
잠그기, 서명, 신원 보증이 한데 엮이는 거죠.
다음엔 이 조각들이 실제 연결에서
어떻게 함께 작동하는지 살펴봐요.