170. PKCS#7 / CMS (Cryptographic Message Syntax)

⚠️ 이 문서는 인터넷에 흩날리는 수많은 인증서, 전자서명 도장, 그리고 암호화된 알맹이(Data)들을, 해커가 함부로 찢어볼 수 없도록 하나의 거대하고 표준화된 디지털 마트료시카(상자) 안에 예쁘게 쓸어 담아 완벽하게 밀봉(Envelope)해 주는 최상위 보안 포장지 규격, PKCS#7 (CMS)을 다룹니다.

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

  1. 본질: PKCS#7 (현대 명칭 CMS)는 암호화된 데이터, 여러 사람의 전자서명 도장, 그리고 그 서명을 보증하는 인증서(X.509) 다발들을 한곳에 몽땅 우겨넣고 구조화하는 **'다목적 암호학적 메시지 포장(Envelope) 표준 규격'**이다.
  2. 가치: 데이터 따로, 서명 따로, 인증서 파일 따로 던져주면 수신자의 프로그램이 파싱하다 에러를 뿜는다. CMS는 이 모든 걸 .p7b.p7m 이라는 하나의 단일 캡슐 파일 안에 질서정연하게 우겨넣어 주어 완벽한 호환성(Interoperability)과 봉투 암호화 아키텍처를 실현한다.
  3. 융합: 이 위대한 포장지 껍데기는 기업용 보안 이메일 표준인 S/MIME, 윈도우 프로그램의 .exe 실행 파일 서명(Authenticode), 그리고 KEM/DEM 기반 하이브리드 암호의 패킷 구조 등 현대 애플리케이션 보안의 가장 바깥쪽 껍질로 강력하게 융합되어 있다.

Ⅰ. 개요 및 왜 '포장지' 표준이 필요한가? (Context & Necessity)

우리가 앞서 배운 [169번 문서]에서 앨리스가 CSR(신청서)을 보냈다. CA(인증기관)는 심사를 마치고 드디어 앨리스에게 "인증서"를 발급해 준다. 그런데 CA가 인증서를 줄 때, 그냥 텍스트 파일 하나만 달랑 주지 않는다.

  • 앨리스 본인 인증서 1장
  • 앨리스를 찍어준 중간 CA(Intermediate CA) 인증서 1장
  • 대장 Root CA 인증서 1장 (브라우저가 3단 콤보로 검사할 수 있게 '인증서 체인(Chain)' 뭉치를 통째로 줘야 한다.)

이 3장의 파일을 따로따로 압축(.zip)해서 주면 될까? 암호학자들은 불안했다. "해커가 압축을 풀고 중간 CA 파일을 쏙 빼고 가짜를 껴 넣으면 어떡해? 이 파일 3개가 한 몸뚱이라는 걸 증명하는 '수학적 묶음 포장지'가 필요해!"

그리하여 RSA Security 회사가 발표한 포장지 규격 PKCS#7이 탄생했다. (후에 IETF로 넘어가 CMS - Cryptographic Message Syntax 라는 공식 명칭으로 진화했다). 이 포장지는 인증서 묶음뿐만 아니라, 이메일 암호문, 전자서명 등 뭐든지 다 주워 담을 수 있는 '도라에몽의 4차원 주머니' 같은 표준이 되었다.

📢 섹션 요약 비유: 귀중한 도자기(데이터)와 보증서 3장(인증서 체인), 그리고 작가의 친필 사인(전자서명)을 택배로 보냅니다. 이걸 비닐봉지에 대충 따로 담으면 분실되고 찢어집니다. PKCS#7(CMS)은 겉면에 "절대 파손 금지, 내용물 5개 묶음"이라고 정밀하게 적힌, 충격 흡수 스펀지가 꽉 찬 '최고급 항공 배송용 특수 강철 컨테이너 박스'입니다. 받는 사람은 박스만 딱 까보면 모든 구성품이 손상 없이 100% 질서 있게 들어있음을 알 수 있습니다.


Ⅱ. PKCS#7 / CMS 컨테이너의 3대 변신 모드

이 캡슐의 가장 무서운 점은 상황에 따라 '서명 봉투', '암호화 봉투', '인증서 보관함'으로 자유자재로 모드 체인지(트랜스포머)를 한다는 것이다.

1. EnvelopedData 모드 (봉투 암호화 모드)

  • 용도: 기밀성 보장 (해커가 못 읽게 꽁꽁 싸매기).
  • 내용물:
    • 내부에 10GB짜리 영화를 대칭키(AES)로 갈아서 넣은 '본체 암호문 덩어리'가 꽉 차 있다.
    • 그리고 상자 뚜껑 안쪽(헤더)에, 아까 그 AES 대칭키를 수신자의 공개키(RSA)로 한 번 더 잠가버린 쪼그만 '키 캡슐'을 테이프로 딱 붙여놓는다.
    • (완벽한 하이브리드 암호, KEM/DEM 구조를 통째로 담아내는 포맷이다).

2. SignedData 모드 (전자서명 모드)

  • 용도: 무결성 및 신분 증명 (누가 보냈는지 확실히 인증하기).
  • 내용물:
    • 알맹이는 암호화하지 않고 원래 평문(계약서 내용) 그대로 상자에 넣는다. (누구나 읽을 수 있음)
    • 대신 상자 겉면에 송신자(나)의 마스터 개인키로 전자서명(해시+RSA) 도장을 쾅 찍는다.
    • ★ 가장 중요한 꿀 기능: 상대방이 내 도장을 검증할 수 있도록, '내 공개키가 들어있는 X.509 인증서 파일' 자체를 아예 상자 안에 같이 쑤셔 넣어서 동봉해 버린다! (상대방이 내 인증서를 따로 찾으러 다닐 필요가 없는 미친 편의성).

3. Certificates-Only 모드 (인증서 다발 보관함)

  • 용도: 데이터나 서명은 1도 없고, 오직 "인증서 파일 여러 개 묶음 배송" 용도로만 쓴다.
  • 내용물: CA가 앨리스에게 발급해 준 방금 전의 그 상황이다. [내 인증서 + 중간 CA 인증서 + Root 인증서] 3장을 차곡차곡 포개어 .p7b 확장자를 가진 파일 하나로 예쁘게 합쳐서 뱉어준다.
┌────────────────────────────────────────────────────────────────────────────────────┐
│           CMS (PKCS#7)의 SignedData 모드(전자서명 캡슐) 해부 시각화                │
├────────────────────────────────────────────────────────────────────────────────────┤
│                                                                                    │
│ [ 📦 거대한 CMS 캡슐 껍데기 (.p7m 파일) ]                                          │
│   ┌──────────────────────────────────────────────────────┐                         │
│   │ 1. 📜 인증서 묶음 보관함 (Certificates)                   │                    │
│   │    - 앨리스의 인증서 (공개키 포함)                           │                 │
│   │    - DigiCert 중간 인증서 (앨리스를 보증함)                   │                │
│   ├──────────────────────────────────────────────────────┤                         │
│   │ 2. 📝 진짜 원본 데이터 (Encapsulated Content)             │                    │
│   │    - "김부장, 내일 A급 작전 개시한다." (평문 메시지)            │              │
│   ├──────────────────────────────────────────────────────┤                         │
│   │ 3. ✍️ 서명 도장 묶음 (Signer Infos)                      │                     │
│   │    - 방금 위쪽 2번 데이터를 앨리스의 개인키로 암호화한 도장 쾅!    │           │
│   │    - (필요하면 다른 부장의 결재 도장 여러 개도 줄줄이 추가 가능)    │          │
│   └──────────────────────────────────────────────────────┘                         │
│                                                                                    │
│ ★ 완벽한 패키징: 수신자는 이 캡슐 하나만 딱 다운받으면, 안에 들어있는 앨리스의     │
│   인증서로 1초 만에 맨 밑의 도장을 검사하여 2번 메시지가 진짜인지 확신할 수 있다!  │
└────────────────────────────────────────────────────────────────────────────────────┘

[다이어그램 해설] 이 포맷의 무서움은 **'확장성'**에 있다. 서명 도장을 1명이 아니라 10명(다중 서명, Multi-Signature)이 연달아 찍어 붙여도 상자 크기만 살짝 늘어날 뿐 규격이 전혀 깨지지 않는다. 이 복잡한 정보 덩어리들을 바이트 배열 안에서 어디서부터 어디까지가 인증서고, 어디부터가 서명인지 한 치의 오차 없이 파싱(Parsing)해 주는 컴퓨터 언어 체계가 바로 그 악명 높은 ASN.1 과 DER 인코딩 기술이며, CMS는 이 뼈대 위에서 돌아간다.

  • 📢 섹션 요약 비유: 친구한테 생일 선물을 보낼 때, 장난감(원본 데이터)과 사용 설명서(인증서), 그리고 내 친필 편지(서명)를 각각 우편으로 보내면 순서도 섞이고 하나가 분실되면 게임을 못 합니다. CMS는 이 세 가지를 예쁜 종합선물 세트 박스 하나에 딱 고정시켜서 뽁뽁이로 포장해 버리는 완벽한 올인원 배송 상자입니다.

Ⅲ. 실무 융합: S/MIME과 Authenticode (실생활의 쉴드)

PKCS#7 (CMS) 포맷은 당신이 지금 마우스를 클릭하는 순간순간 윈도우 OS 안에서 맹활약하고 있다.

  1. S/MIME (보안 이메일 표준)
    • 대기업이나 군대에서 사내 이메일을 보낼 때, 해커가 못 뜯어보게 암호화하거나 서명을 붙일 때 쓰는 절대 표준 기술이다.
    • 아웃룩(Outlook) 메일 클라이언트가 메일 본문과 첨부파일을 이 거대한 CMS 상자(SignedDataEnvelopedData 모드)에 통째로 쑤셔 넣고 .p7m 파일로 압축하여 메일망(SMTP) 위로 던져버린다.
  2. Microsoft Authenticode (.exe 실행 파일 서명)
    • 인터넷에서 setup.exe 같은 게임 설치 파일을 다운받아 더블 클릭할 때 화면이 어두워지며 "이 앱을 신뢰하시겠습니까? (게시자: Nexon)" 라고 파란 방패가 뜬다.
    • 이것은 넥슨(Nexon)의 개발자가 자기가 짠 setup.exe 파일 겉면에 PKCS#7 (CMS) 캡슐로 자기 회사의 공인 인증서 도장을 찰싹 붙여놨기 때문이다. 윈도우 OS는 실행 직전 이 캡슐을 까서 해커가 파일을 변조(바이러스 주입)하지 않았음을 0.1초 만에 확인하고 안전망을 풀어준다.

Ⅳ. 결론

"알맹이가 아무리 눈부셔도, 훌륭한 포장지가 없으면 쓰레기통에서 썩게 된다." 암호학자들이 수십 년간 깎아낸 RSA, AES, SHA-256이라는 찬란한 보석들은 PKCS#7 (CMS)이라는 단단하고 유연한 가죽 지갑이 발명되고 나서야 비로소 인터넷이라는 진흙탕에 안전하게 굴러다닐 수 있게 되었다. 인증서와 데이터, 서명 도장을 하나의 우아한 구조체로 통합한 이 캡슐 포장 기술은, 앞으로 도래할 양자 내성 암호(PQC)의 거대한 열쇠 뭉치들마저도 군말 없이 넉넉하게 품어 안으며 현대 통신 아키텍처의 가장 바깥쪽 외투 역할을 묵묵히 수행할 것이다.


📌 관련 개념 맵

  • 전체 시리즈: PKCS (Public-Key Cryptography Standards) 계보
  • 형제 규격: PKCS#10 (CSR 신청서 캡슐), PKCS#12 (비밀키까지 다 담아버리는 백업용 캡슐, .pfx .p12)
  • 공식 IETF 명칭: CMS (Cryptographic Message Syntax, RFC 5652)
  • 실전 응용처: S/MIME (보안 이메일), Authenticode (코드 서명), SSL/TLS 인증서 체인 배포 파일(.p7b)

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

  1. 우리가 10GB짜리 영화 파일에 자물쇠를 채우고, 내 신분증도 동봉하고, 친필 사인 도장까지 꽉 찍어서 보내려고 해요.
  2. 이 3개를 덜렁덜렁 따로 던져주면 택배 배달부(인터넷)가 길에서 잃어버리거나 도둑이 바꿔치기하기 쉬워요.
  3. 그래서 이 모든 것을 흔들리지 않게 차곡차곡 담을 수 있는 엄청나게 단단하고 칸막이가 잘 쳐진 '마법의 종합선물 세트 상자(PKCS#7)'를 발명해서, 이 상자 하나만 쓱 던져주면 받는 사람이 한 번에 싹 풀어볼 수 있게 만들었답니다!