OpenSSL!
SSL, TLS
- SSL(Secure Sockets Layer) 보안 소켓 계층
- 1990년대 넷스케이프(Netscape)에서 개발한 보안 프로토콜
SSL 2.0(1995),SSL 3.0(1996)으로 발전.
- TLS(Transport Layer Security) 전송 계층 보안
SSL 3.0을 기반으로IETF에서 표준화한 프로토콜.TLS 1.3(2018, 최신 버전)
핸드쉐이크를 통해 세션키(대칭키)를 공유하고 세션키로 암호화 통신 하기 위한 방법이다.
해당 키 교환을 위한 핸드쉐이크를 PKI 기반으로 수행한다.
TLS 1.3 은 여러 키(클라이언트→서버, 서버→클라이언트)를 생성한다.
X.509
ITU-T(국제전기통신연합) 에서 정의한 공개 키 기반 구조(PKI, Public Key Infrastructure) 인증서 구조 표준.
Openssl 로 생성하는 인증서(공개키) 는 모두 대부분 X.509 표준을 따른다.
아래와 같은 구조로 정의되며 ASN.1(Abstract Syntax Notation One) 구조라한다.
1 | Certificate ::= SEQUENCE { |
DN은 아래와 같은 정보가 포함된다.
- Country Name (C): US
- State or Province Name (ST): California
- Locality Name (L): San Francisco
- Organization Name (O): Example Inc.
- Organizational Unit Name (OU): IT Department
- Common Name (CN): www.example.com
- Email Address: admin@example.com
X.509는 CA 기반에서 동작하는SSL/TLS표준이다.
이외에도 이메일, Linux 패키지 서명할 때 사용하는OpenPGP같은 인증서 표준이 있다.
OpenSSL 기반 인증서 생성
테스트용으로 인증 기관에서 사용하는것 처럼 사설 루트 인증서(이하 RootCA) 를 생성,
ca.key: 루트 개인키ca.crt: 루트 공개키(루트 인증서)
공인 RootCA 를 관리하는 공인 인증 기관(CA: Public Certificate Authority) 목록은 아래와 같다.
- DigiCert - DigiCert Global Root G2
- DigiCert - DigiCert Global Root CA
- DigiCert - DigiCert High Assurance EV Root CA
- Amazon - Amazon Root CA 1
- Amazon - Amazon Root CA 2
- Let’s Encrypt (ISRG) - Let’s Encrypt Authority X3 (이전, 지금은 X1/X2)
- Let’s Encrypt (ISRG) - ISRG Root X1
- Let’s Encrypt (ISRG) - ISRG Root X2 (신규)
- Microsoft - Microsoft Root Certificate Authority 2011
- Microsoft - Microsoft ECC Root Certificate Authority 2017
- Google - GTS Root R1
- Google - GTS Root R2
- Google - GTS Root R3
- Google - GTS Root R4
- Apple - Apple Root CA
RootCA의 개인키는 물리적 금고에서 보관중이라고 함.
OS 와 브라우저 설치 및 업데이트 과정에서 신뢰 저장소 에 공식 RootCA 를 저장 및 업데이트한다.
Root CA
아래 명령을 통해 사설 RootCA 를 생성.
1 | openssl genrsa -out root_ca.key 2048 |
Intermediate CA
보통 인증서는 루트 CA 가 바로 인증해주기 보단 2 단계정도를 레벨로 구성한다.
이때 중간에 있는 CA 기관들을 Intermediate CA 라 부른다.
Intermediate CA 역시 사설로 생성
- intermediate_ca.key: 중간 CA 개인키
- intermediate_ca.csr: 서명 요청서(Certificate Signing Request)
- 중간 CA 의 공개키와 메타데이터를 서명한 파일.
- 서명을 RootCA 에 제출, RootCA 가 서명한 중간 CA 공개키를 받기 위해 사용함.
- intermediate_ca.crt: 중간 CA 공개키(중간 CA 인증서)
1 | openssl genrsa -out intermediate_ca.key 2048 |
intermediate_ca.csr 파일을 기반으로 서버 공개키(서버 인증서)를 CA 로 서명 및 생성
1 | openssl x509 -req -in intermediate_ca.csr \ |
-days 1825
RootCA 보단 유효기간을 짧게 설정해야함.-CA root_ca.crt
RootCA 공개키로 발급자 정보를 포함, 인증서에 RootCA 정보를 추가(체이닝)-CAkey root_ca.key
RootCA 개인키로 csr 파일에 서명-CAcreateserial
인증서의 고유식별자를 생성,ca.srl파일에 저장.extensions v3_ca
확장자 섹션 이름. 중간 CA로 동작하도록 설정.extfile <(cat <<EOF ... EOF)사용하여 확장자 정의를 인라인으로 제공
1 | [v3_ca] |
명령을 수행하면 root_ca.srl(인증서 고유식별자 파일) 이 생성된다.
향후 Intermediate CA 의 폐기 필요시 인증서 폐기 리스트(Certificate Revocation List) 에 저장될 용도로 사용한다.
Server 인증서
Intermediate CA 를 통해 끝단에 위치하는 서버 인증서를 생성,
- server.key: 서버 개인키
- server.csr: 서버 서명 요청서(Certificate Signing Request)
- 서버 공개키와 메타데이터를 서명한 파일.
- 서명을
IntermediateCA에 제출,IntermediateCA가 서명한 서버 공개키를 받기 위해 사용함.
- server.crt: 서버 공개키(서버 인증서)
1 | openssl genrsa -out server.key 2048 |
server.csr 파일을 기반으로 서버 공개키(서버 인증서)를 IntermediateCA 로 서명 및 생성
1 | openssl x509 -req -in server.csr \ |
명령을 수행하면 intermediate_ca.srl(인증서 고유식별자 파일) 이 생성된다.
향후 서버 인증서의 폐기 필요시 인증서 폐기 리스트(Certificate Revocation List) 에 저장될 용도로 사용한다.
인증서 파일 포맷 종류
1 | -----BEGIN CERTIFICATE----- |
1 | -----BEGIN CERTIFICATE REQUEST----- |
1 | -----BEGIN PRIVATE KEY----- |
인증서 파일을 만들다 보면 위와같은 포멧, .crt, .pem 같은 확장자 암호 관련 파일이 생성된다.
crt(Certificate)
- X.509 포멧 인증서 파일,
- PEM 또는 DER 형식으로 인코딩됨.
- 파일을 열었는데 깨진 문자열 혹은 이진 구조일 경우 DER, 16진수 형태일경우 PEM.
pem (Privacy Enhanced Mail)
- 인증서/키 같은 보안 객체를 Base64로 인코딩하여 저장한 파일.
- 대부분 crt 파일이 pem 형태로 인코딩되어있음.
cer
crt파일과 동일한 역할을 한다.- Windows 기반 인증서 파일임을 구분하기 위해서 사용되는 확장자,
crt는 주로 유닉스/리눅스에서 사용.
.p12/.pfx
- 인증서, 개인 키, CA 체인을 하나의 암호화된 파일에 저장하는 형식.
PKCS#12포멧으로 바이너리 형식으로 저장.- 백업 또는 이동용으로 주로 사용.
공개 키 암호 표준(Public-Key Cryptography Standard, PKCS)
PKCS#1, PKCS#8, PKCS#10, PKCS#12 포멧은 PKI 에서 매우 자주 사용됨.
.key 확장자의 경우 PKCS#1 혹은 PKCS#8.p12 확장자의 경우 PKCS#12
- PKCS#1
- RSA 개인키를 저장하는 가장 기본적인 형식
-----BEGIN RSA PRIVATE KEY-----로 시작함- 아래 정보가 저장됨
1 | version INTEGER, -- 0 |
- PKCS#8
- 개인 키를 저장하는 일반화된 표준, RSA뿐만 아니라 EC, DSA 등 다양한 알고리즘을 지원
PKCS#8가 더 최신 포멧-----BEGIN PRIVATE KEY-----로 시작함- 아래 정보가 저장됨
1 | version INTEGER, -- 0 |
PKCS#10
- 인증서 서명 요청 표준
-----BEGIN CERTIFICATE REQUEST-----로 시작함
PKCS#12
- 개인 정보 교환 구문 표준
- 인증서, 개인 키, CA 체인을 하나의 암호화된 파일에 저장.
- 바이너리 포멧
인증서 체인
대부분의 인증서는 RootCA, IntermediateCA 를 기반으로 보안성, 관리성을 위해 체인 형태로 제공된다.
실제 End-entity Certificate(Leaf Certificate) 파일을 openssl 명령어로 출력하면 아래와 같은데
1 | openssl x509 -in _.tistory.com.pem -text -noout |
인증서 하나는 issure(서명자) 와 subject(주제) 로 구성된다.
1 | Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=Thawte TLS RSA CA G1 |
서버는 SSL 핸드셰이크(Handshake) 과정중에 전체 인증서 체인을 제공해야한다.IntermeidateCA 인증서가 누락될 경우 클라이언트는 인증서 체인을 완성할 수 없어 검증에 실패하게 된다.
클라이언트는 ServerCA, IntermediaCA 를 순서대로 받으며 서명을 검증하고 최종적으로 신뢰 저장소에 있는 RootCA 를 통해 모든 인증서는 검증한다.
아래 명령을 통해 인증서 체인 목록을 확인할 수 있다.
1 | openssl s_client -connect google.com:443 -showcerts |
google.com 의 경우 아래와 같이 [Server Cert] -> [Intermediate CA] -> [Root CA] 구조를 가진다.
1 | depth=2 C=US, O=Google Trust Services LLC, CN=GTS Root R4 |