SSL 인증서 관리하다가 파일 형식 때문에 막힌 적 있으신가요? PEM과 CRT 파일 형식의 차이점부터 실제 변환 방법까지, 모든 것을 한 번에 해결하는 실용적인 가이드를 준비했습니다.
📋 목차
PEM과 CRT 파일이란?
PEM 파일의 특징
PEM(Privacy-Enhanced Mail) 파일은 Base64로 인코딩된 텍스트 형식의 인증서입니다. 파일을 열어보면 -----BEGIN CERTIFICATE-----
로 시작하고 -----END CERTIFICATE-----
로 끝나는 구조를 가지고 있습니다.
-----BEGIN CERTIFICATE-----
MIIDXTCCAkWgAwIBAgIJAKoK/heBjcOuMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV...
-----END CERTIFICATE-----
CRT 파일의 정체성
CRT 파일은 인증서를 담고 있는 컨테이너입니다. 내부적으로는 PEM 형식이나 DER(바이너리) 형식으로 저장될 수 있어서, 단순히 확장자만 다른 경우가 많습니다.
핵심 차이점 정리
- PEM: 텍스트 형식, Base64 인코딩, 사람이 읽을 수 있음
- CRT: 인증서 파일의 일반적인 확장자, 내부 형식은 PEM 또는 DER
- 실제로는 대부분의 CRT 파일이 PEM 형식을 사용
언제 파일 변환이 필요한가?
웹서버 설정 시나리오
- Apache: .crt 확장자를 선호
- Nginx: .pem, .crt 모두 지원
- IIS: .cer, .crt 형식 요구
- Java Keystore: .jks 형식으로 별도 변환 필요
클라우드 서비스 요구사항
현대의 클라우드 환경에서는 각 서비스마다 선호하는 인증서 형식이 다릅니다:
- AWS ELB: PEM 형식 필수
- Google Cloud: PEM 또는 CRT 모두 지원
- Azure: PFX, CER 형식 선호
OpenSSL을 이용한 변환 방법
기본 변환 명령어
1. PEM에서 CRT로 변환
# 기본 변환 (사실상 파일명만 변경)
openssl x509 -in certificate.pem -out certificate.crt
# 더 명확한 형식 지정
openssl x509 -inform PEM -in certificate.pem -outform PEM -out certificate.crt
2. 개인키 파일 변환
# RSA 개인키 변환
openssl rsa -in private.key -text -out private.pem
# 암호화된 개인키 변환
openssl rsa -in encrypted_private.key -out decrypted_private.pem
3. 체인 인증서 포함 변환
# 인증서 체인을 포함한 변환
cat certificate.pem intermediate.pem > certificate_chain.crt
실무 활용 변환 스크립트
웹서버 배포를 위한 일괄 변환 스크립트입니다:
#!/bin/bash
# SSL 인증서 변환 스크립트
echo "=== SSL 인증서 변환 시작 ==="
# 변수 설정
DOMAIN="example.com"
PEM_CERT="${DOMAIN}.pem"
KEY_FILE="${DOMAIN}.key"
OUTPUT_DIR="./converted"
# 출력 디렉토리 생성
mkdir -p $OUTPUT_DIR
# 1. PEM을 CRT로 변환
if [ -f "$PEM_CERT" ]; then
openssl x509 -in $PEM_CERT -out $OUTPUT_DIR/${DOMAIN}.crt
echo "✅ CRT 파일 생성 완료: $OUTPUT_DIR/${DOMAIN}.crt"
else
echo "❌ PEM 파일을 찾을 수 없습니다: $PEM_CERT"
fi
# 2. 키 파일 변환
if [ -f "$KEY_FILE" ]; then
openssl rsa -in $KEY_FILE -out $OUTPUT_DIR/${DOMAIN}_private.pem
echo "✅ 개인키 변환 완료: $OUTPUT_DIR/${DOMAIN}_private.pem"
fi
echo "=== 변환 작업 완료 ==="
실무에서 자주 사용하는 변환 패턴
Apache 웹서버용 변환
Apache에서 SSL을 설정할 때 필요한 파일들을 준비하는 과정입니다:
# 1. 인증서 파일 변환
openssl x509 -in domain.pem -out domain.crt
# 2. 중간 인증서 결합
cat domain.crt intermediate.crt > domain_bundle.crt
# 3. Apache 설정에서 사용할 형식 확인
openssl x509 -in domain_bundle.crt -text -noout
Nginx 웹서버용 준비
Nginx는 PEM 형식을 기본으로 사용하지만, 체인 인증서를 하나의 파일로 결합해야 합니다:
# 인증서와 체인을 하나로 결합
cat domain.pem intermediate.pem > domain_fullchain.pem
# 개인키는 별도 보관
cp private.key domain.key
인증서 정보 확인 명령어
변환 후 인증서가 올바르게 생성되었는지 확인하는 방법입니다:
# 인증서 정보 확인
openssl x509 -in certificate.crt -text -noout
# 인증서 유효기간 확인
openssl x509 -in certificate.crt -dates -noout
# 인증서와 개인키 매칭 확인
openssl x509 -noout -modulus -in certificate.crt | openssl md5
openssl rsa -noout -modulus -in private.key | openssl md5
변환 시 주의사항과 문제해결
자주 발생하는 오류들
1. 파일 형식 오류
# 오류: unable to load certificate
# 해결: 파일 형식 명시적 지정
openssl x509 -inform PEM -in certificate.pem -outform PEM -out certificate.crt
2. 권한 문제
# 개인키 파일 권한 설정
chmod 600 private.key
# 인증서 파일 권한 설정
chmod 644 certificate.crt
3. 암호화된 개인키 처리
# 암호 제거
openssl rsa -in encrypted_private.key -out unencrypted_private.key
# 암호 추가
openssl rsa -aes256 -in private.key -out encrypted_private.key
파일 무결성 검증
변환된 파일이 손상되지 않았는지 확인하는 체크리스트입니다:
- 인증서 구조 확인
openssl x509 -in certificate.crt -text -noout | head -10
- 인증서-키 매칭 검증
# 두 해시값이 동일해야 함
openssl x509 -noout -modulus -in certificate.crt | openssl md5
openssl rsa -noout -modulus -in private.key | openssl md5
- 인증서 체인 검증
openssl verify -CAfile ca-bundle.crt certificate.crt
보안 모범 사례
- 개인키 파일: 600 권한으로 설정하여 소유자만 읽기 가능
- 인증서 파일: 644 권한으로 설정하여 모든 사용자가 읽기 가능
- 백업 보관: 원본 파일은 안전한 위치에 별도 백업
- 만료일 관리: 인증서 만료 30일 전 갱신 알림 설정
마무리
PEM과 CRT 파일 변환은 웹서버 관리자라면 반드시 알아야 할 기본 스킬입니다. OpenSSL 명령어를 활용하면 복잡해 보이는 인증서 관리도 간단하게 처리할 수 있습니다.
특히 클라우드 환경에서 SSL 인증서를 다룰 때는 각 서비스의 요구사항에 맞는 형식으로 변환하는 것이 중요합니다. 이 가이드의 명령어들을 참고하여 안전하고 효율적인 인증서 관리를 해보세요.
추가 참고 자료
💡 도움이 되셨다면 북마크 저장하시고, 동료 개발자분들과 공유해보세요!