SSL 인증서 파일 형식 완전 가이드: PEM, CER, DER, CRT, CSR 한번에 정리

SSL 인증서 파일 형식(PEM, CER, DER, CRT, CSR)의 차이점과 사용법을 완벽 정리. 개발자와 시스템 관리자를 위한 실무 가이드로 웹서버 SSL 설정부터 AWS 키 관리까지 모든 것을 다룹니다.

SSL 인증서 파일, 왜 이렇게 종류가 많을까요?

웹서버 SSL 설정을 하다 보면 .pem, .crt, .cer, .der, .key 등 다양한 확장자를 가진 파일들을 마주하게 됩니다. “다 똑같은 인증서 파일인데 왜 이렇게 복잡하지?“라고 생각해보신 적 있으실 텐데요.

실제로는 운영체제별, 용도별, 시대별로 다른 형식들이 혼재되어 있어서 혼란스러운 것이 사실입니다. 오늘은 이런 SSL 인증서 파일 형식들의 차이점과 언제 어떤 것을 사용해야 하는지 명확하게 정리해보겠습니다!

PEM: 가장 범용적인 표준 형식

PEM이란 무엇인가요?

**PEM(Privacy Enhanced Mail)**은 이름에서 알 수 있듯이 원래 이메일 보안을 위해 만들어진 형식입니다. 하지만 현재는 가장 널리 사용되는 SSL 인증서 표준 형식이 되었어요.

PEM의 핵심 특징

Base64 인코딩 ASCII 텍스트

  • 바이너리 데이터를 Base64로 인코딩해서 텍스트 형태로 저장
  • 메모장, VSCode 등 일반 텍스트 에디터로 열어서 확인 가능
  • 복사/붙여넣기가 쉬워서 설정 파일 작업이 편리합니다

명확한 시작/끝 표시

  • -----BEGIN XXX----------END XXX----- 구문으로 구분
  • 한 파일 안에 여러 개의 인증서나 키를 포함 가능
  • 내용물의 종류를 쉽게 구분할 수 있어요

PEM 파일의 다양한 형태

서버 인증서

-----BEGIN CERTIFICATE-----
MIIDczCCAlugAwIBAgIBBDANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJLUjEN
MAsGA1UECgwES0lTQTEuMCwGA1UECwwlS29yZWEgQ2VydGlmaWNhdGlvbiBBdXRo
...
UNkAAk/bg9ART6RCVmE6fhMy04Qfybo=
-----END CERTIFICATE-----

RSA 개인키

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,754D916B5B2D2AF9ACDEED19908F0336

oB2JARMSnliQOgu4V96xwuqqo9rP/XXJbYFT6XEriBpVX/qOwSpAkLXAL71SB0VS
iEDdxK96zctIgo0q3zpowO2cx6uAxk4BIDWxvpM4A8xCFJgskpXeXpI5pnpgDiLO
...
-----END RSA PRIVATE KEY-----

OpenSSH 키 (AWS EC2에서 사용)

-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jdHIAAAAGYmNyeXB0AAAAGAAAABC/fXuBoa
WboQk95dZ4Udj3AAAAEAAAAAEAAAGXAAAAB3NzaC1yc2EAAAADAQABAAABgQC+dEvO8yL7
...
-----END OPENSSH PRIVATE KEY-----

PEM의 장점

호환성이 최고

  • 99% 이상의 시스템에서 지원하는 범용 형식
  • Apache, Nginx, IIS, AWS, GCP 등 대부분의 플랫폼에서 사용 가능
  • 클라우드 환경에서 표준으로 채택

관리 편의성

  • 텍스트 파일이라서 버전 관리 시스템(Git)에서 추적 가능
  • 이메일이나 메신저로 안전하게 공유 가능
  • 스크립트를 통한 자동화 처리가 쉬움

CRT와 CER: 운영체제별 인증서 표현

CRT 파일이란?

**CRT(Certificate)**는 인증서(Certificate)의 줄임말입니다. 주로 Linux/Unix 계열 시스템에서 인증서 파일임을 명확히 구분하기 위해 사용하는 확장자예요.

특징:

  • 내용은 거의 100% PEM 형식
  • -----BEGIN CERTIFICATE----- 구문으로 시작
  • Apache, Nginx 등 리눅스 웹서버에서 표준으로 사용

CER 파일이란?

**CER(Certificate)**는 Windows 환경에서 주로 사용하는 인증서 파일 확장자입니다.

특징:

  • Windows의 “인증서 내보내기” 기능에서 기본 선택되는 형식
  • 내용은 PEM 형식과 동일
  • Windows IIS에서 주로 사용되지만, 리눅스에서도 인식 가능

CRT vs CER 실무 팁

실제로는 확장자만 다를 뿐 내용은 같은 PEM 형식입니다. 다만 관례적으로:

  • Linux 서버: .crt 확장자 선호
  • Windows 서버: .cer 확장자 선호
  • 혼재 환경: .pem 확장자로 통일 권장

DER: 바이너리 형식의 특수한 경우

DER이 무엇인가요?

**DER(Distinguished Encoding Rules)**는 바이너리 형태로 인코딩된 인증서 파일입니다. PEM이 텍스트라면, DER은 순수한 바이너리 데이터예요.

DER의 특징과 한계

바이너리 파일

  • 텍스트 에디터로 열면 깨진 문자만 보입니다
  • 파일 크기가 PEM보다 약간 작아요
  • 바이너리라서 이메일 전송 시 첨부파일로만 가능

제한적인 사용 범위

  • 사설 인증서 또는 금융권 특수 시스템에서 사용
  • 구형 레거시 시스템에서 요구하는 경우가 있음
  • 최근 웹서버 SSL에서는 거의 사용하지 않음

언제 DER를 사용하나요?

  • 특정 하드웨어 장비에서 요구하는 경우
  • 금융권이나 공공기관의 특수 보안 시스템
  • Java 애플리케이션의 특정 라이브러리 요구 사항

KEY 파일: 개인키 전용 확장자

KEY 파일의 용도

.key 확장자는 주로 개인키(Private Key) 파일임을 명확히 구분하기 위해 사용합니다.

사용 환경:

  • OpenSSL 도구 사용 시
  • Java 애플리케이션에서 키 파일 구분
  • Docker 컨테이너 내부에서 키 파일 매핑

KEY 파일 확인 방법

파일을 직접 열어서 확인해야 함:

  • PEM 형식이면: -----BEGIN PRIVATE KEY----- 또는 -----BEGIN RSA PRIVATE KEY-----
  • DER 형식이면: 바이너리 데이터로 깨져 보임

실무 꿀팁:

# 파일 형식 확인
file certificate.key
# 또는 openssl 명령어 사용
openssl rsa -in certificate.key -text -noout

CSR: 인증서 발급 요청서

CSR이 무엇인가요?

**CSR(Certificate Signing Request)**는 인증기관(CA)에 SSL 인증서 발급을 요청할 때 사용하는 특별한 파일입니다.

CSR에 포함되는 정보

기업/도메인 정보

  • 도메인 이름 (Common Name)
  • 조직명 (Organization)
  • 국가 코드 (Country)
  • 지역 정보 (State, City)

암호화 정보

  • 공개키 정보
  • 사용할 암호화 알고리즘
  • 키 길이 (보통 2048bit 또는 4096bit)

CSR 파일 예시

-----BEGIN CERTIFICATE REQUEST-----
MIICvjCCAaYCAQAweTELMAkGA1UEBhMCVVMxDTALBgNVBAgMBFV0YWgxDjAMBgNV
BAcMBUxlaGkxFTATBgNVBAoMDERpZ2l0YWxPY2VhbjERMA8GA1UEAwwIKi5qb3Nz
...
-----END CERTIFICATE REQUEST-----

CSR 생성과 활용

OpenSSL로 CSR 생성:

openssl req -new -key private.key -out certificate.csr

Let’s Encrypt에서 자동 생성:

  • Certbot 등의 도구가 자동으로 CSR 생성
  • 도메인 소유권 검증 후 자동으로 인증서 발급

CA-Bundle.crt: 신뢰 체인의 핵심

CA-Bundle이란?

CA-Bundle.crt여러 인증기관(CA)의 루트 인증서를 하나로 묶어놓은 파일입니다. 브라우저나 시스템이 SSL 인증서의 신뢰성을 검증할 때 사용해요.

왜 필요한가요?

SSL 인증서 신뢰 체인

  1. 웹사이트 인증서 (End Entity)
  2. 중간 인증기관 인증서 (Intermediate CA)
  3. 루트 인증기관 인증서 (Root CA)

CA-Bundle에는 이런 신뢰할 수 있는 루트 CA들의 인증서가 모두 포함되어 있습니다.

실무에서 활용법

웹서버 설정 시:

# Nginx 설정 예시
ssl_certificate /path/to/your-cert.crt;
ssl_certificate_key /path/to/your-private.key;
ssl_trusted_certificate /path/to/ca-bundle.crt;

프로그래밍에서 활용:

  • cURL 요청 시 CA 검증용
  • API 클라이언트의 SSL 검증 설정
  • Docker 컨테이너의 SSL 인증서 검증

실무 시나리오별 파일 선택 가이드

웹서버 SSL 설정

Apache/Nginx (Linux):

  • 인증서: domain.crt 또는 domain.pem
  • 개인키: private.key 또는 private.pem
  • 중간인증서: intermediate.crt

Windows IIS:

  • 인증서: domain.cer
  • PKCS#12 형식: certificate.pfx (비밀번호 포함)

클라우드 환경

AWS (Certificate Manager, ELB):

  • PEM 형식만 지원
  • 인증서, 개인키, 인증서 체인을 각각 입력

Docker 컨테이너:

  • PEM 형식 권장
  • 볼륨 마운트로 컨테이너 내부에 전달

개발/테스트 환경

자체 서명 인증서:

# 개인키 생성
openssl genrsa -out test.key 2048

# 자체 서명 인증서 생성
openssl req -new -x509 -key test.key -out test.crt -days 365

트러블슈팅: 자주 발생하는 문제들

인증서 형식 변환

PEM을 DER로 변환:

openssl x509 -in cert.pem -outform DER -out cert.der

DER을 PEM으로 변환:

openssl x509 -in cert.der -inform DER -outform PEM -out cert.pem

인증서 내용 확인

인증서 정보 보기:

openssl x509 -in certificate.crt -text -noout

CSR 내용 확인:

openssl req -in certificate.csr -text -noout

개인키-인증서 매칭 확인

# 개인키의 해시값
openssl rsa -in private.key -pubout -outform PEM | shasum

# 인증서의 공개키 해시값
openssl x509 -in certificate.crt -pubkey -noout -outform PEM | shasum

보안 관리 모범 사례

개인키 보안

권한 설정:

# 소유자만 읽기 권한
chmod 600 private.key
chown root:root private.key

암호화된 개인키 사용:

  • 프로덕션 환경에서는 패스프레이즈로 보호
  • 자동화 스크립트에서는 암호화되지 않은 키 사용

인증서 만료 관리

만료일 확인:

openssl x509 -in certificate.crt -dates -noout

자동 갱신 설정:

  • Let’s Encrypt: cron 작업으로 자동 갱신
  • 상용 인증서: 만료 30일 전 알림 설정

마무리: 복잡함 속에서 찾는 규칙성

SSL 인증서 파일 형식들이 복잡해 보이지만, 실제로는 몇 가지 핵심 원칙만 이해하면 됩니다:

  1. PEM이 현재의 표준 – 99% 상황에서 PEM 형식 사용
  2. 확장자는 용도 구분용 – .crt, .cer, .pem 모두 같은 내용
  3. 바이너리 DER은 특수 상황에서만 필요
  4. CSR은 발급 요청용, CA-Bundle은 신뢰 체인용

이제 SSL 설정 시 어떤 파일을 어떻게 사용해야 할지 혼란스럽지 않으실 거예요. 클라우드 시대에는 대부분 PEM 형식으로 통일되고 있으니, 이것만 확실히 이해하셔도 충분합니다!

여러분의 경험을 들려주세요!

SSL 인증서 설정하면서 어려웠던 점이나, 특별한 트러블슈팅 경험이 있으시면 댓글로 공유해주세요. 실무 현장의 생생한 경험담이야말로 모든 개발자들에게 도움이 되는 소중한 자산입니다.

이 가이드가 도움이 되셨다면 동료 개발자들과 공유해주시고, 북마크해두시면 언제든 참고하실 수 있어요!


다음 주제 예고: 다음 글에서는 **“Docker 컨테이너 보안의 모든 것: 이미지 스캔부터 런타임 보안까지”**에 대해 다뤄보겠습니다. DevOps 시대에 필수가 된 컨테이너 보안 전략과 실무 적용법을 상세히 정리해드릴 예정이니, 기대해주세요!

댓글 남기기