SSL 인증서와 개인키는 여러 파일 형식으로 저장할 수 있습니다. 내용은 동일하며 인코딩과 패키징 방식이 다릅니다. 대부분의 혼란은 서버에 특정 형식이 필요할 때 발생합니다.
형식 비교
| 형식 | 확장자 | 인코딩 | 포함 내용 | 사용처 |
|---|---|---|---|---|
| PEM | .pem, .crt, .cer, .key | Base64 (텍스트) | 인증서, 키 또는 체인 (파일당 하나) | Nginx, Apache, 대부분의 Linux 서버 |
| DER | .der, .cer | 바이너리 | 단일 인증서 또는 키 | Java, 일부 Windows 앱 |
| PFX/PKCS#12 | .pfx, .p12 | 바이너리 | 인증서 + 키 + 체인을 하나의 파일로 | Windows IIS, Azure, macOS 키체인 |
PEM — 가장 일반적인 형식
PEM(Privacy Enhanced Mail)은 Base64로 인코딩된 텍스트입니다. 텍스트 편집기로 열 수 있습니다:
-----BEGIN CERTIFICATE-----
MIIFYjCCBEqgAwIBAgISA8ht...
(base64 encoded data)
-----END CERTIFICATE-----
PEM 파일은 인증서, 개인키 또는 인증서 체인을 포함할 수 있습니다. 헤더가 내용물을 알려줍니다:
BEGIN CERTIFICATE— 인증서BEGIN PRIVATE KEY— 개인키 (또는BEGIN RSA PRIVATE KEY/BEGIN EC PRIVATE KEY)BEGIN CERTIFICATE REQUEST— CSR
GetHTTPS는 PEM 형식으로 출력합니다 — privkey.pem, cert.pem, chain.pem, fullchain.pem.
DER — 바이너리 인코딩
DER은 PEM이 텍스트로 인코딩하는 동일한 데이터의 바이너리 형태입니다. 사람이 읽을 수 없습니다. 주로 Java 애플리케이션(keytool)과 일부 Windows 구성 요소에서 사용됩니다.
PFX/PKCS#12 — 번들 형식
PFX(Personal Information Exchange)는 인증서, 개인키, 체인을 하나의 비밀번호로 보호된 파일로 묶습니다. Windows IIS, Azure App Service, macOS 키체인에서 이 형식이 필요합니다.
형식 간 변환
모든 변환은 OpenSSL을 사용합니다:
PEM → PFX
openssl pkcs12 -export \
-out certificate.pfx \
-inkey privkey.pem \
-in cert.pem \
-certfile chain.pem
내보내기 비밀번호를 설정하라는 메시지가 나타납니다.
PFX → PEM
# Extract certificate
openssl pkcs12 -in certificate.pfx -clcerts -nokeys -out cert.pem
# Extract private key
openssl pkcs12 -in certificate.pfx -nocerts -nodes -out privkey.pem
# Extract chain
openssl pkcs12 -in certificate.pfx -cacerts -nokeys -out chain.pem
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
어떤 형식이 필요한가요?
| 서버/플랫폼 | 형식 | 필요한 파일 |
|---|---|---|
| Nginx | PEM | fullchain.pem + privkey.pem |
| Apache | PEM | cert.pem + chain.pem + privkey.pem |
| IIS (Windows) | PFX | certificate.pfx (PEM에서 변환) |
| Azure App Service | PFX | certificate.pfx |
| AWS (ACM) | PEM | cert.pem + chain.pem + privkey.pem (콘솔에 붙여넣기) |
| Java (Tomcat) | JKS 또는 PFX | PEM → PFX → JKS로 keytool을 사용하여 변환 |
| Node.js | PEM | 코드에서 파일을 직접 읽기 |
파일 형식 식별 방법
어떤 형식인지 확실하지 않다면 확인하세요:
# If it starts with "-----BEGIN" — it's PEM (base64 text)
head -1 mystery-file.pem
# If it's binary (garbled text) — it's DER or PFX
file mystery-file.cer
# Output like "data" or "certificate" = DER
# Output like "PKCS12" = PFX
# Inspect a PEM certificate
openssl x509 -in cert.pem -noout -text
# Inspect a DER certificate
openssl x509 -in cert.der -inform DER -noout -text
# Inspect a PFX file
openssl pkcs12 -in cert.pfx -info -nokeys
흔한 파일 확장자 혼동
| 확장자 | 일반적인 의미 | 다른 가능성 |
|---|---|---|
.pem | PEM (base64) | 항상 PEM |
.crt | PEM 인증서 | Windows에서는 DER |
.cer | PEM 인증서 | Windows에서는 DER |
.key | PEM 개인키 | DER (드묾) |
.pfx | PKCS#12 번들 | 항상 PFX |
.p12 | PKCS#12 번들 | 항상 PFX (.pfx와 동일) |
.der | DER (바이너리) | 항상 DER |
.jks | Java KeyStore | 항상 JKS |
경험 법칙: 텍스트 편집기로 파일을 여세요. -----BEGIN CERTIFICATE-----가 보이면 확장자와 관계없이 PEM입니다. 바이너리 데이터가 보이면 DER이나 PFX입니다.
자주 묻는 질문
.crt, .cer, .pem의 차이점은 무엇인가요?
모두 PEM 형식일 수 있습니다. 확장자는 형식 표시가 아니라 명명 관례입니다. .crt와 .cer는 인증서 파일에 흔히 사용되고, .pem은 모든 PEM 인코딩 파일에 사용됩니다. Windows에서는 .cer 파일이 때때로 DER 인코딩일 수 있으므로 텍스트 편집기로 확인하세요.
GetHTTPS가 왜 4개 파일을 제공하나요?
최대 호환성을 위해서입니다. GetHTTPS는 다음을 제공합니다: privkey.pem(개인키), cert.pem(인증서만), chain.pem(중간 CA 인증서), fullchain.pem(인증서 + 체인 결합). Nginx는 fullchain.pem이 필요하고, Apache는 별도의 cert.pem + chain.pem이 필요하며, IIS는 PFX(PEM에서 변환)가 필요합니다.
Windows/IIS용 PFX를 어떻게 만드나요?
위의 OpenSSL PEM → PFX 명령을 사용하세요. GetHTTPS의 privkey.pem, cert.pem, chain.pem이 필요합니다. 결과 .pfx는 IIS, Azure App Service 또는 macOS 키체인으로 가져올 수 있습니다.
개인키 없이 형식을 변환할 수 있나요?
인증서는 개인키 없이 PEM과 DER 간 변환이 가능합니다. 하지만 PFX를 만들려면 개인키가 필요합니다(인증서 + 키를 하나로 묶으므로). 개인키를 분실한 경우 새 인증서를 생성해야 합니다.
Let’s Encrypt는 어떤 형식을 사용하나요?
Let’s Encrypt(GetHTTPS를 포함한 모든 ACME 클라이언트를 통해)는 PEM 형식으로 출력합니다. 서버에 다른 형식이 필요한 경우 위의 OpenSSL 명령으로 변환하세요.