Engineering/PKI, OpenSSL

OpenSSL CSR 발급 및 x.509 인증서 발급

블로그 닉네임 입력 제한 수는 몇 자인가요? 2025. 4. 29. 11:06
 

OpenSSL 설치 및 인증서 발급

OpenSSL이란OpenSSL은 데이터를 암호화하거나 보안을 적용할 때 사용하는 오픈소스 툴킷보통 인터넷에서 HTTPS 같은 보안 통신, 전자서명, 인증서 발급, 암호화된 파일 생성 등에 사용공인된 인증 기

happyqa.tistory.com

해당 게시글과 이어집니다. 

 

CSR이란 

CSR(Certificate Signing Request)은 인증서 발급을 요청하기 위해 작성하는 전자 서류 
인증기관(CA, Certificate Authority)에 제출되며, 
인증기관은 CSR을 검토한 후, 요청 데이터를 담고 서명된 인증서(X.509 인증서)를 발급합니다. 

1. CSR 사용처
HTTPS 웹사이트의 SSL/TLS 인증서 발급 (ex. Let's Encrypt, DigiCert, GlobalSign 등)

VPN 서버 인증서 발급
이메일 서명 및 암호화를 위한 개인 인증서 발급
사내 시스템 간 보안 통신용 인증서 발급 

2. CSR 구성 요소 
CSR은 요청 데이터와 서명 데이터로 구성됩니다.  
요청 데이터 :  요청자의 정보 및 공개키 
서명 데이터 : 요청자가 자신의 개인키로 서명(암호화)한 데이터 

요청 데이터(Request Data)

공개키(Public Key)

요청자의 조직 정보 (회사 이름, 부서, 국가, 지역)
도메인 이름 (Common Name, CN)
이메일 주소 (선택사항)
기타 추가 정보 (ex. SAN - Subject Alternative Name)
서명 데이터(Signature Data)

[요청 데이터 (공개키, 조직정보, 도메인 등)]
↓ (SHA-256 해시)
[해시값 (고정 길이의 데이터)]
↓ (개인키로 암호화)
[서명 (Signature)]

 

3. 서명 데이터의 목적 
그렇다면 서명 데이터가 왜 필요할까요? 

 요청 데이터가 무결성, 부인 방지, 인증성을 가진다는 것을
증명하기 위해 요청자의 개인키로 서명하는 것입니다.

개인키로 서명하는 이유 
해당 개념을 이해하기 위해서는 
PKI(공개키 기반 구조)에 대한 이해가 선행되어야 합니다.  
PKI는 정말 방대하고 복잡하니 따로 포스팅해서 다뤄보도록 하겠습니다! 

- 자신이 요청 데이터의 생성자임을 증명
- 서명은 개인키로만, 검증은 공개키로만 가능
- 요청자가 해당 개인키의 소유자임을 증명 가능 

서명이 보장하는 보안적 특성은 이렇습니다. 

보안 속성 설명
무결성 CSR 생성 후 정보 변경 여부 확인 가능
부인 방지 서명자는 자신의 개인키로 서명했기에 발급 요청에 대한 부인 불가
인증 CSR에 포함된 공개키가 진짜 그 사람(조직)의 것임을 증명

 

4. CSR 발급 흐름

[개인키 생성]

[CSR 생성] (공개키 + 요청자 정보 입력)

[CSR을 인증기관(CA)에 제출]

[CA의 CSR 검토 및 인증서 서명] (CA가 요청자의 공개키를 사용하여 CSR의 서명 검증)

[서명된 X.509 인증서 발급] (CA 개인키로 서명)

[서버나 클라이언트에 인증서 설치]

[보안 통신에 사용]

 

5. CSR 생성

1) openssl 버전 확인
설치 방법은 이전 글에서 확인 가능합니다. 

2) 개인키 생성
2048 비트의 RSA로 암호화된 개인키를 생성합니다.

3) CSR 생성
인증서의 DN 입력 후
Challenge password 및 optional company name은 입력하지 않고 엔터 키
- Challenge password : 선택 입력, 인증서 재발급이나 수정 요청을 할 때 추가 인증용 비밀번호.
단, 실제 CA에서 쓰이지 않기 때문에 입력하지 않아도 됩니다.
- optional company name : 선택 입력, 추가 회사명이나 부서를 작성 가능

4) CSR 파일 내용 검증
CSR 파일 내 요청 데이터 및 서명 데이터를 확인 가능합니다.

// 1. openssl 설치 확인
openssl -v
// 2. 개인키 생성
openssl genrsa -out my_private_key.pem 2048
// 3. CSR 생성
openssl req -new -key my_private_key.pem -out my_csr.csr
// 4. CSR 검증
openssl req -text -noout -verify -in my_csr.csr

 

6. CA 생성

실제 CA( Let's Encrypt, DigiCert, GlobalSign, Sectigo 등)에
직접 생성한 CSR을 제출할 수도 있고 
테스트용 CA를 생성할 수도 있습니다.

저는 OpenSSL로 테스트용 CA를 생성해보겠습니다.

1) CA 개인키 생성

2) CA 인증서 생성 
자체 서명한 유효기간 10년의 CA 인증서를 생성합니다.

3) CA 개인키로 CSR 검토 후 서명하여 인증서 발급

4) 서명된 X.509 인증서 내용 확인

5) 서명된 X.509 인증서 검증
해당 서버 인증서는 신뢰할 수 있는 CA 인증서로 서명되었고
유효하다는 의미입니다.

// 1. CA 개인키 생성
openssl genrsa -out my_ca_private_key.pem 4096
// 2. CA 인증서 생성 
openssl req -x509 -new -nodes -key my_ca_private_key.pem -sha256 -days 3650 -out my_ca_cert.pem
// 3. CA 개인키로 CSR 검토 후 서명하여 인증서 발급
openssl x509 -req -in my_csr.csr -CA my_ca_cert.pem -CAkey my_ca_private_key.pem -CAcreateserial -out my_server_cert.pem -days 365 -sha256
// 4. 서명된 X.509 인증서 내용 확인
openssl x509 -in my_server_cert.pem -text -noout
// 5. 서명된 X.509 인증서 검증
openssl verify -CAfile my_ca_cert.pem my_server_cert.pem

 

7. 해당 인증서를 설치하여 HTTPS 서버 띄우기
HTTPS에서는 서버와 클라이언트 간 통신을 암호화하기 위해 인증서가 필요합니다.
서버는 인증서를 통해 자신의 공개키를 안전하게 전달하고,
클라이언트는 인증서를 검증하여 서버의 신원을 확인합니다.
이 과정을 통해 중간자 공격을 방지하고, 신뢰할 수 있는 통신이 가능합니다.


다음에는 간단하게 HTTPS 서버 띄우기를 진행해볼게요.