169. PKCS#10 (인증서 서명 요청, CSR)

⚠️ 이 문서는 웹 서버 관리자가 HTTPS 보안 통신을 시작하기 위해 국가나 인증기관(CA)으로부터 신분증(인증서)을 발급받으려 할 때, 자신의 신원 정보와 '공개키'를 하나로 묶어 포장한 뒤 "제발 내 공개키에 도장 좀 쾅 찍어주세요!"라고 편지를 띄워 보내는 국제 표준 청원서 양식, CSR(PKCS#10)을 다룹니다.

핵심 인사이트 (3줄 요약)

  1. 본질: CSR(Certificate Signing Request, PKCS#10)은 인증서 발급 신청자가 자신의 회사 정보(도메인, 국가, 이메일 등)와 자신이 방금 구워낸 '공개키(Public Key)'를 한 파일에 욱여넣고 묶은 텍스트 포맷의 신청 서류다.
  2. 가치: 가장 중요한 점은, 사용자가 자신의 '개인키(Private Key)'를 CA에 보내는 일은 우주가 멸망해도 절대 없다는 것이다! 개인키는 서버 깊숙이 숨겨두고, 오직 이 CSR 서류 겉면에 개인키로 **'전자서명'**만 살짝 찍어서 보냄으로써 "이 공개키의 진짜 주인은 나요!"라는 무결성 증명만 CA에게 안전하게 전달한다.
  3. 융합: 이 -----BEGIN CERTIFICATE REQUEST----- 로 시작하는 투박한 텍스트 파일 뭉치는, RA(등록기관)의 깐깐한 심사를 거친 뒤 최종적으로 CA의 마스터 서명이 덮어 씌워지며 빛나는 'X.509 HTTPS 인증서'라는 최종 결과물로 융합(변신)하게 된다.

Ⅰ. 개요 및 왜 '신청서'가 따로 필요한가? (Context & Necessity)

당신이 네이버 서버 관리자다. 크롬 브라우저가 인정해 주는 파란 자물쇠(HTTPS)를 달기 위해 DigiCert(인증기관, CA)에게 인증서를 하나 사려고 한다. 초보자들의 흔한 착각: "DigiCert 홈페이지 들어가서 돈 결제하면, DigiCert가 내 비밀번호(개인키)랑 공개키랑 다 뚝딱 만들어서 압축 파일로 던져주겠지?"

절대 아니다. 미친 짓이다. 비밀번호(개인키)는 다른 사람이 만들어주면 안 된다. CA 직원이 내 개인키를 몰래 복사해뒀다가 나중에 해킹하면 어쩔 것인가?

진실된 워크플로우 (Zero-Trust의 시작):

  1. 네이버 관리자는 인터넷을 끈 자기 컴퓨터 안에서 자체적으로 랜덤 주사위를 돌려 [공개키 + 개인키] 쌍을 스스로 깎아낸다. 개인키는 금고에 묻는다.
  2. 그리고 짝꿍인 **[공개키]**와, [회사 이름: 네이버, 도메인: naver.com] 이라는 글자를 묶어서 편지를 쓴다. "DigiCert님, 제가 키를 만들었는데, 이 공개키가 진짜 네이버 꺼 맞다고 당신네 마스터키로 보증 도장 좀 찍어서 인증서로 만들어주세요!"
  3. 이 편지가 바로 **CSR (Certificate Signing Request)**이며, 전 세계 모든 CA가 똑같이 읽을 수 있도록 IETF가 규격화한 문서 양식이 바로 PKCS#10이다.

📢 섹션 요약 비유: 은행 금고 자물쇠를 만들 때, 열쇠 수리공(CA)에게 내 열쇠 모양(개인키)을 다 보여주면서 만들어달라고 하지 않습니다. 내가 집에서 자물쇠 구멍(공개키)과 내 이름표(도메인)만 딱 잘라서 소포(CSR)로 보냅니다. 수리공은 자물쇠 안쪽 구조(개인키)는 1도 모르는 상태로, 겉면에 "이거 진짜 네이버 자물쇠 맞음"이라는 황금 도장만 쾅 찍어서 택배로 돌려보내 주는 완벽한 보안 분리 시스템입니다.


Ⅱ. PKCS#10 (CSR)의 내부 구조 해부

OpenSSL 같은 프로그램으로 openssl req -new -key mykey.pem -out myreq.csr 명령어를 치면 CSR 파일이 툭 떨어진다. 이 텍스트 파일 안에는 3가지 핵심 덩어리가 들어 있다.

1. 주체 정보 (Distinguished Name, DN)

"나는 누구인가?"를 적는 란이다.

  • CN (Common Name): 가장 중요! 접속할 도메인 주소 (예: www.naver.com)
  • O (Organization): 회사 법인명 (예: Naver Corp.)
  • C (Country): 국가 코드 (예: KR)

2. 공개키 덩어리 (Public Key)

"이 자물쇠에 도장을 찍어주시오!"

  • 내가 방금 컴퓨터에서 구워낸 RSA-2048 비트 또는 ECC 256 비트의 순수한 공개키 숫자 배열이 텍스트로 압축되어 들어간다.

3. 자기 서명 (Self-Signature) - [★ 방어막의 코어]

해커 다스가 내 CSR을 가로채서, 겉의 이름표만 hacker.com으로 고쳐서 CA에 보내면 어떡할까? 이걸 막기 위해 CSR 파일의 맨 마지막에는 "내가 숨겨둔 내 개인키($d$)"로 CSR 문서 전체를 해시 떠서 꾹 누른 전자서명 도장이 찍혀있다. (이걸 Proof of Possession, PoP - 소유권 증명이라 부른다.)

  • CA는 서류를 받자마자, 서류 안에 든 '공개키'를 꺼내서 맨 밑의 '서명 도장'을 열어본다.
  • 도장이 풀리면? "아, 이 서류를 보낸 놈이 진짜로 이 공개키의 짝꿍인 개인키를 손에 쥐고 있는 진짜 주인이 맞구나! 위조된 서류가 아니네!" 확신하고 심사에 들어간다.
┌───────────────────────────────────────────────────────────────────────────────┐
│           PKCS#10 (CSR)의 생성과 소유권 증명(PoP) 시각화 도해도               │
├───────────────────────────────────────────────────────────────────────────────┤
│                                                                               │
│ [ 👨 서버 관리자의 뒷방 작업 (오프라인) ]                                     │
│   1. `openssl genrsa` -> (마스터 개인키 🔑)와 (공개키 🔓) 한 쌍 생성!         │
│   2. 개인키 🔑 는 무덤까지 가져갈 폴더에 꽁꽁 숨김. (절대 반출 금지)          │
│                                                                               │
│ [ 📜 CSR (PKCS#10) 편지 쓰기 ]                                                │
│   ┌──────────────────────────────────────────────┐                            │
│   │ [신청자 정보] CN: www.naver.com, O: 네이버       │                        │
│   │ [내 공개키]   X9@!K (숫자 덩어리 🔓)            │                         │
│   ├──────────────────────────────────────────────┤                            │
│   │ [전자 서명]  내 숨겨진 개인키🔑로 문서 전체를 압축해서  │                 │
│   │             쾅! 도장을 찍음 (소유권 증명 PoP 완료)│                       │
│   └──────────────────────────────────────────────┘                            │
│                           │                                                   │
│                           ▼ (인터넷으로 CA에게 메일 쏨)                       │
│                                                                               │
│ [ 🏛️ CA (DigiCert)의 서류 검사 ]                                              │
│   "음, 문서 안에 있는 공개키🔓로 문서 밑의 서명 도장을 문질러볼까?"           │
│   "찰칵! 도장이 풀린다! 이놈이 진짜 개인키🔑를 들고 쓴 편지가 100% 확실하군!  │
│   좋아, 서류 접수 완료! 이제 진짜 도장(인증서) 발급 심사 들어간다!"           │
└───────────────────────────────────────────────────────────────────────────────┘

[다이어그램 해설] 초보 엔지니어들이 CSR을 만들 때 openssl 명령어에 비밀번호(Passphrase)를 넣으라는 창이 뜨면 헷갈려 한다. 이 암호는 개인키를 하드디스크에 암호화해 저장할 때 쓰는 로컬 비밀번호일 뿐, CA 서버로는 1비트의 비밀번호나 개인키도 날아가지 않는다. 인터넷 선을 타고 흐르는 CSR 파일(-----BEGIN CERTIFICATE REQUEST-----)은 전 세계 해커가 훔쳐가도 아무짝에도 쓸모없는(오직 도장 요청용) 완전히 무해하고 껍데기뿐인 청원서다.

  • 📢 섹션 요약 비유: 제가 조폐공사(CA)에 "저만의 황금 도장(인증서)을 만들어주세요!"라고 편지를 씁니다. 편지 안에는 제가 쓸 도장의 무늬(공개키) 도면만 그려서 넣습니다. 그리고 편지 맨 밑에, 도둑이 제 편지를 조작하지 못하게 저만 쓸 수 있는 마법의 인주(개인키)를 꾹 눌러 서명해서 보냅니다. 조폐공사는 이 껍데기 도면을 받아 진짜 황금틀에 박아주는 일만 할 뿐, 제 마법 인주가 어떻게 생겼는지는 영원히 모릅니다.

Ⅲ. 실무 적용: 와일드카드와 SAN (주소 여러 개 묶기)

"도메인이 blog.naver.com, mail.naver.com 10개인데 CSR을 10번 만들어서 돈을 10번 내야 하나요?"

다행히 PKCS#10 규격에는 **'확장 속성(Attributes)'**이라는 꿀 기능이 들어있다.

  • SAN (Subject Alternative Name): CSR 확장 칸에 "내 본캐는 naver.com인데, 부캐로 blog.naver.com이랑 mail.naver.com도 이 인증서 하나로 다 묶어서 퉁쳐주세요!"라고 콤마(,)로 여러 개의 주소(도메인이나 IP)를 욱여넣을 수 있다. (멀티 도메인 인증서)
  • 와일드카드 (Wildcard): 아예 CN = *.naver.com 이라고 적어서 CSR을 던지면, 훗날 네이버가 어떤 서브 도메인을 새로 파더라도 무조건 인증서 파란 불이 다 통과되는 마스터패스 인증서를 뽑아낼 수 있다.

Ⅳ. 결론

"완벽한 비대칭키 철학의 시작점, 절대 넘겨주지 않는 통제권." PKCS#10 (CSR)은 단순한 서류 양식이 아니다. "나의 개인키는 그 어떤 권력자(CA)나 통신망 앞에서도 절대 밖으로 노출되지 않는다"는 제로 트러스트(Zero Trust) 암호학의 가장 기본적이고 결벽증적인 철학을 구현한 시스템 아키텍처다. 개발자가 까만 터미널 창에서 생성한 몇 줄의 텍스트 파일(CSR) 쪼가리 안에는, 무결성을 증명하는 수학적 도장(PoP)과 신분 증명의 열망이 고스란히 압축되어 CA의 벙커를 향한 안전한 여행을 시작한다.


📌 관련 개념 맵

  • 전체 분류: PKI (공개키 기반 구조) 인증서 발급 파이프라인의 1단계 (요청)
  • 산출물 (결과): 이 CSR이 CA를 통과하면 $\rightarrow$ X.509 v3 Digital Certificate (최종 인증서)로 변신함.
  • 핵심 내장 보안 로직: PoP (Proof of Possession, 개인키 소유권 증명 전자서명)
  • 관련 표준: PKCS (Public-Key Cryptography Standards) 패밀리 (RSA Security 사가 제정한 암호학 표준)

👶 어린이를 위한 3줄 비유 설명

  1. 내가 인터넷에 식당을 열려면 시장님(CA)한테 "이 식당 진짜 내 꺼 맞아요!" 하는 허가증(인증서)을 받아야 해요.
  2. 시장님한테 허가증을 달라고 편지(CSR)를 쓸 때, 절대 내 금고 열쇠(개인키)를 동봉해서 보내면 안 돼요! 우체부가 훔치면 털리니까요.
  3. 대신 편지 안에는 내 금고의 자물쇠 모양(공개키)만 쏙 그려서 넣고, 겉면에는 나만 찍을 수 있는 마법의 지장(소유권 증명)을 찍어서 안전하게 시장님한테 "허가증 만들어주세요!" 하고 청원서(CSR)를 보내는 거랍니다.