이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

보안

PKI 리서치 - OpenSSL을 통해 직접 PKI 환경을 구축해보자

이쿠우우 2022. 4. 2. 11:34
반응형

 

PKI 리서치

 

목표

SSH, Kubernetes 등을 리서치 하면서 항상 개념이 혼란스러웠던 주제가 바로 인증서였음.
그러다 보니 ca.crt, ca.key, server.crt 같은 인증서 관련 파일만 보면 시작하기도 전에 걱정이 먼저였음...
대칭키, 공개키 알고리즘 개념은 완벽히 알고있지만 인증서, 전자서명 개념만 들어가면 개념이 흔들렸음.
이를 해결하기 위해 날을 잡고 개념부터 심화까지 글과 그림을 그려가며 리서치를 진행함.
개념적인 부분 부터 하나하나 다시 복습하는 마음으로 필자가 궁금증이 생겼던 시점의 순서대로 정리해봄.

 


PKI 리서치 시리즈 이동

PKI 리서치 - 암호화 알고리즘 개념
PKI 리서치 - 비대칭키(공개키) 알고리즘을 이용한 전자서명
PKI 리서치 - 공개키를 공개하는 방법 : PKI
PKI 리서치 - 실생활에서의 PKI : HTTPS - SSL/TLS
PKI 리서치 - OpenSSL을 통해 직접 PKI 환경을 구축해보자

 

 


 

OpenSSL을 통해 직접 PKI 환경을 구축해보자

 
지금까지 알아본 PKI 구조를 Openssl을 사용해서
직접 key pair와 인증서를 생성해보겠음.
 

ROOT CA 의 SSC 인증서 생성

 
ROOT CA의 경우 상위 기관이 없으니 
스스로 서명한 ROOT CA 인증서 즉 SSC(Self Signed Certificate)를 생성해야함
SSC 인증서 생성 과정은 아래 image의 1,2,3 번 과정에 해당함.
OpenSSL을 사용해서 SSC 인증서를 먼저 생성해보겠음.
 

ROOT CA의 Private key 생성

 
상위 그림에서 

부분이 있는데
여기서 Private Key를 생성하는 과정임.
 
[명령어]
openssl genrsa -aes256 -out ./rootCA/rootca_private.key 2048
 
[옵션 설명]
 
옵션
설명
genrsa
RSA 알고리즘을 사용해서 Private key 생성
-out <file>
Private key 생성 경로
-aes256
Private key를 aes256 알고리즘으로 암호화 함
해당 option을 추가하지 않으면 
Private key를 암호화 하지 않음
Enter pass phrase for "key" 입력항목도 나오지 않음
2048
Private key의 Bits size
[생성 결과]
Enter pass phrase for rootca_private.key 항목에는 private key 암호화에 사용할 password를 입력함.

 

 

 
 

ROOT CA의 CSR 생성

 
[CSR이란] 
CSR (Certificate Signing Request ) 파일은 인증서 서명 요청 파일로
인증서 발급을 위해 필요한 정보를 저장하고 있음.
CSR에 포함되어 있는 내용은 Publicy Key와 
인증서 발급을 요청하는 "요청자"의 도메인 정보가 포함되어 있음
즉 상위 그림 중 

해당 항목을 확인해보면 
"공개키의 주인" 항목이 있는데
해당 항목에는 인증서 발급을 요청한 곳의 정보가 들어가야함.
여기에 들어가야할 정보를 미리 입력해놓는 설정파일임
 
[명령어]
openssl req -new -key  ./rootCA/rootca_private.key -out ./rootCA/rootca.csr
 
[옵션 설명]
옵션
설명
req
인증 서명 요청 또는 인증서 생성
해당 명령에서는 인증서 서명 요청(CSR)을 생성
-new
새로운 csr  파일 생성
-key
Private key 경로를 입력해줘야함
-out
csr 파일 생성 경로
 
[결과]

Enter pass phrase for ./rootCA/rootca_private.key: "private key 생성 시 입력했던 Password 입력"
 
Country Name (2 letter code) [GB]:kr "국가 코드 입력"
State or Province Name (full name) [Berkshire]:seoul  "시/도 입력"
Locality Name (eg, city) [Newbury]:Gwangjin-gu "도시(시,군, 구) 이름 입력"
Organization Name (eg, company) [My Company Ltd]: testcompany "회사명 입력"
 
Organizational Unit Name (eg, section) []:development "회사 부서명 입력"
Common Name (eg, your name or your server's hostname) []:www.test.com "도메인 입력"
Email Address []:test@testcompany.com "관리자 E-mail 입력"
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: "Enter로 넘어감"
An optional company name []:  "Enter로 넘어감"
 
[도메인의 입력 시 주의 사항]
CN (Common Name)은 Server의 IP 또는 Domain Name을 넣어줘야함. 
Domain Name은 정확한 일치가 필요하다. 
예를들어 CN이 test.com인 경우 www.test.com 에서 이용 불가능함.
대신 *.tets.com 과 같이 wildcard는 사용가능함.
 
[생성된 csr 파일 내용을 확인]
명령어 : openssl req -text -in ./rootCA/rootca.csr
 
내용을 확인해보면 
Subject Public Key Info: 항목에
자동으로 생성된 public key를 확인할 수 있음.
즉 csr 파일 내부에 ROOT CA의 public key가 저장되어있음.
Signature Algorithm: 항목에는
위에있는 Public key가 ROOT CA의 private key인 rootca_private.key로
암호화해서 전자서명값이 저장되어있는 것을 확인 할 수 있음.
그리고 위에서 입력한 data가 똑같이 들어가 있음을 확인할 수 있음.

 

 

 

ROOT CA 인증서 생성

상위 과정에서 생성한 private key와 csr파일로
인증서를 생성함.
일반 CA라면 해당 인증서를 제 3자에게 요청해야하지만
ROOT CA의 경우 상위 기관이 없으니 
스스로 서명한 ROOT CA 인증서 즉 SSC(Self Signed Certificate)를 생성해야함
 
[명령어]
openssl x509 -req -days 365 -extensions v3_ca -set_serial 1 -in ./rootCA/rootca.csr  -signkey ./rootCA/rootca_private.key -out ./rootCA/rootca_ssc.crt 
 
[옵션 설명]
옵션
설명
x509
X.509 버전 3 인증서를 생성
-req
인증 서명 요청 또는 인증서 생성
해당 명령에서는 인증서 생성에 해당함
-days
해당 인증서의 유효기관 (365일로 설정)
-extensions
기존 인증서 형식에서 추가되어야하는 내용이 들어감.
즉 인증서 요청에 추가되어야하는 항목를 설정할 수 있음.
v3_ca의 경우 
자체 서명 인증서에 추가되어야하는 확장 필드가 입력되어 있음.
일반적으로 ROOT CA에서 많이 사용됨.
 
v3_ca 확장이 추가되는 경우 default내용은 아래와 같음.
표준이라고 생각하면 되는 듯..
 
[ v3_ca ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer:always
basicConstraints = CA:true
subjectAltName=email:move
-set_serial
인증서 번호를 설정
-in
csr 파일 경로를 입력해줘야함
 -signkey
Private key 경로를 입력해줘야함
자체 서명 인증서를 만들어줘야함으로
본인(root ca)의 private key를 입력해줌
-out
인증서 생성 경로를 입력
 
 
[결과]
Enter pass phrase for ./rootCA/rootca_private.key: "private key 생성 시 입력했던 Password 입력"

 

 
[생성된 root_ssc.crt 파일을 확인해봄]
명령어 : openssl x509 -text -in ./rootCA/rootca_ssc.crt
 
내용을 확인해보면 
Public-Key: (2048 bit) 항목에 rootCA의 public key 가 있는것을 확인할 수 있음.
그리고 Signature Algorithm: 항목에 rootca_private.key 를 사용해서 public key가 전자서명되어 있는 것을 확인할 수 있음.
Data 부분을 확인해보면 발행자와 공급자의 내용이 같음을 확인할 수 있음
즉 자체 서명된 인증서임.

 
 

 
 

SSL 인증서 발급

 
위에서 생성한 ROOT CA의 자체 서명된 인증서를 사용해서 
사용자들의 입장에서 사용자가 사용할 SSL 인증서를 발급해보겠음.
아래 그림의 사용자 B가 인증서를 전달받는 과정과 동일함.

 

사용자 B의 Private key 생성

 
상위 그림에서 

부분이 있는데
여기서 Private Key를 생성하는 과정임.
 
[명령어]
openssl genrsa -out ./userB.key 2048
 
[결과]
userB의 private key인 userB.key가 정상적으로 생성된 것을 확인 할 수 있음.
해당 private key는 암호화 하지 않음.

 

UserB의 CSR 생성

 
[명령어]
openssl req -new -key ./userB.key -out ./userB.csr
 
[결과]

 
 
[생성된 csr 파일 내용을 확인]
명령어 : openssl req -text -in ./rootCA/rootca.csr
 
내용을 확인해보면 
Subject Public Key Info: 항목에
자동으로 생성된 public key를 확인할 수 있음.
Signature Algorithm: 항목에는
위에있는 Public key가 userB의 private key인 userB.key로 암호화 되어 있는 것을 확인 할 수 있음.
하지만 해당 전자서명은 이후 CA가 서명해줄 것임으로 변경될 것 임.
아래 결과에서 계속 알아보겠음.

 

ROOT CA에게 인증서 서명 요청

 
[명령어]
openssl x509 -req -days 365 -extensions v3_user -in userB.csr -CA ./rootCA/rootca_ssc.crt -CAcreateserial -CAkey ./rootCA/rootca_private.key -out userB.crt 
옵션
설명
x509
X.509 버전 3 인증서를 생성
-req
인증 서명 요청 또는 인증서 생성
해당 명령에서는 인증서 생성에 해당함
-days
해당 인증서의 유효기관 (365일로 설정)
-extensions
기존 인증서 형식에서 추가되어야하는 내용이 들어감.
즉 인증서 요청에 추가되어야하는 항목를 설정할 수 있음.
v3_user의 경우 CA가 아닌 user가 인증서를 요청할 때 사용함.
 
[ v3_user ]
basicConstraints = CA:FALSE
authorityKeyIdentifier = keyid,issuer 
subjectKeyIdentifier = hash 
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
-set_serial
인증서 번호를 설정
-in
csr 파일 경로를 입력해줘야함
-CA
CA의 인증서(public key 정보를 가지고 있는) 경로를 입력함
 -CAkey
CA의 Private key 경로를 입력해줘야함
-out
인증서 생성 경로를 입력
 
 
[결과]

 
 
[생성된 userB.crt 파일을 확인해봄]
명령어 : openssl x509 -text -in userB.crt
내용을 확인해보면 
 
Subject Public Key Info: 항목에 userB의 public key 가 있는것을 확인할 수 있음.
그리고 Signature Algorithm: 항목을 확인해보겠음.
이전의 csr파일의 전자서명과 값이 다른것을 확인할 수 있음.
해당 crt 인증서 파일은 ROOT가 인증해줬음으로 
전자서명 값이 ROOT CA의 private key인 rootca_private.key를 사용해서
userB의 public key가 전자서명되어 있는 것을 확인할 수 있음.

 
 
이렇게 글로 직접 설명하는 것 처럼 작성하니
PKI에 대해서 완벽히 이해함..
드디어 완성 ㅠㅠ
 
 

 

 


제 글을 복사할 시 출처를 명시해주세요.
글에 오타, 오류가 있다면 댓글로 알려주세요! 바로 수정하겠습니다!


 

참고
학부생 때 기록했던 자료들을 참고함...
 
 
[openssl 참고]

 

반응형