PEM: Privacy Enhanced Mail은 특정 값을 Base64 인코딩하여 텍스트로 저장하는 형식
이는 개인키, 클라이언트인증서(clcert), CA인증서(cacert) 중 하나 또는 모두를 포함할 수 있음 (즉, PEM이 특정 종류를 의미하는 것은 아님)
CRT/CER: PEM 형식으로 저장되는 인증서로서, 공개키, 소유자, CA 서명 등의 정보를 포함 (공개키 및 그 증명서)
(-----BEGIN CERTIFICATE----- 로 시작)
※ p12 파일로부터 아래 명령어로 추출 가능, 단, 해당 인증서가 p12 내에 있어야 함. (in 및 out 파일명 변경 가능)
# openssl pkcs12 -in cert.p12 -clcerts -nokeys -out client.crt (p12 클라이언트인증서로부터 pem 클라이언트인증서 추출)
# openssl pkcs12 -in cert.p12 -cacerts -nokeys -out ca.crt (p12 클라이언트인증서로부터 pem CA인증서 추출)
# openssl pkcs12 -in ca.p12 -nokeys -out client.crt (p12 CA인증서로부터 pem CA인증서 추출, clcerts 옵션을 줘도 동일)
※ 암호 입력까지 자동화하려면 입력은 -passin pass:암호, 출력은 -passout pass:암호 파라미터 추가 (ex: -passin pass:1234)
KEY: PEM 형식으로 저장되어 인증서 서명 요청(CSR) 생성, SSL 통신 암/복호화에 사용 (개인키를 의미)
(-----BEGIN PRIVATE KEY----- 로 시작)
※ p12 파일로부터 아래 명령어로 개인키 추출 가능, 단, 개인키가 p12 내에 있어야 함. (in 및 out 파일명 변경 가능)
# openssl pkcs12 -in cert.p12 -nocerts -nodes -out client.key (평문 개인키)
# openssl pkcs12 -in cert.p12 -nocerts -out client.key (암호화된 개인키)
P12: PKCS#12는 인증서와 개인키, 그리고 필요 시 중간 인증서까지 암호화하여 하나의 바이너리 파일로 통합 저장하는 형식
즉, p12 파일로부터 pem 형식의 인증서와 개인키 추출이 가능 (아래는 모든 정보 추출, 각각은 위 CRT/KEY 항목의 명령어 참조)
# openssl pkcs12 -in ca.p12 -out ca.pem
JKS: Java KeyStore는 P12와 동일한 내용을 담고있으며 Java 기반 환경에서 사용됨 (JDK 9부터는 P12가 기본 포맷)
아래는 P12로 변환 방법 (반대는 src, dest 만 바꿔서)
# keytool -importkeystore -srckeystore source.jks -srcstoretype JKS -srcstorepass <jks_비밀번호> -destkeystore target.p12 -deststoretype PKCS12 -deststorepass <p12_비밀번호>
CA: Certificate Authority는 신뢰할 수 있는 제3자 기관으로, 개인이나 서버 등 요청자의 공개 키에 공식 서명을 하여 인증서를 발급함. 내부 네트워크에서 사용하려면, 공인CA를 이용하지 않고 자체(Private)CA를 생성하여 인증 처리 가능함
인증서: 공개키가 특정 주체(예: 서버, 사용자) 것임을 CA가 보증한다는 증명서 역할을 함
CSR: Certificate Signing Request은 인증서 서명 요청으로서, 이를 CA에게 보내거나, (자체CA는)CA 인증서/개인키를 사용해 CSR 파일에 서명하여 실제 인증서 파일 생성
Keystore: 자신의 인증서와 개인 키(Private Key)를 저장하는 저장소, 서버나 클라이언트가 자신을 증명할 때 사용
Truststore: 신뢰할 수 있는 CA(인증 기관)나 외부 상대방의 공개 키 인증서만을 저장하는 저장소, 클라이언트가 서버의 인증서를 검증하는 데 사용