이전 글(구글 클라우드 플랫폼(GCP)에 OpenVPN 서버 구축(5) : EasyRSA 설정)에 이어서 쓰는 글입니다.

 

EasyRSA로 인증서 생성을 해봅시다.

 

 

PKI 초기화

우선, PKI 초기화(초기설정. initialize)를 해야 됩니다.
PKI는 Public Key Infrastructure의 약자입니다. 공개키 인프라로 해석하면 쉽게 와닿으실까요? 인증서의 생성, 관리, 배포, 사용, 저장, 파기 등의 작업을 하려면 기반(Infrastructure)을 마련하는 초기 작업(initialize)을 해야 되는 것 같습니다.

 

▼ 아래의 명령어를 입력하면 PKI initialize가 됩니다. 스샷에서는 cd 명령어로 EasyRSA-3.0.8 디렉토리에 접근한 상태이기 때문에 /easyrsa 파일이 있는 경로/ 입력을 생략했습니다.

./easyrsa 파일이 있는 경로/easyrsa init-pki

현재 위치에 pki 디렉토리가 생깁니다. 기존에 pki 디렉토리가 있었다면 지워지고 다시 만들어집니다. 저는 EasyRSA-3.0.8 디렉토리에서 easyrsa 명령어를 실행했기 때문에 EasyRSA-3.0.8 디렉토리에 pki 폴더가 생겼습니다. (만약 cd 명령어로 디렉토리를 옮기게 되면 해당 디렉토리에는 pki 디렉토리가 없을테니 ./easyrsa init-pki 명령어를 다시 쳐줘야 하겠지요?)

 

▼ pki 디렉토리, pki/private 디렉토리, pki/reqs 디렉토리의 내용은 이렇게 되어 있었습니다.

 

CA build

다음 절차는 CA build입니다. CA는 Certification Authority(인증 기관)의 약자입니다. 그러니까 CA Build는 인증기관 건설(설치) 정도로 생각하면 됩니다.

 

▼ 아래의 명령어를 입력하면 CA build가 됩니다. 스샷에서는 cd 명령어로 EasyRSA-3.0.8 디렉토리에 접근한 상태이기 때문에 /easyrsa 파일이 있는 경로/ 입력을 생략했습니다. 원칙대로라면 암호도 지정하고 해야겠지만, 개인적으로 쓸 인증서 만드는 건데 인증기관 단도리까지 할 필요가 있나 싶어서 nopass 옵션을 주었습니다.ㅋ

 

./easyrsa 파일이 있는 경로/easyrsa build-ca nopass

이전 글에서 set_var EASYRSA_DN 옵션을 cn_only로 넣어서 그런지 DN 항목 입력을 건너뛰고 CN(Common Name) 항목 입력만 요구하네요. 원한다면 입력하면 되는데, 이것도 엔터 치면 그냥 넘어가 버립니다. pki 디렉토리에 ca.crt 파일이 생겼다는 메세지가 뜨면서 마무리 됩니다.

 

▼ ll 명령어로 pki 디렉토리 내용을 다시 확인해 봤는데, 요소들이 많이 늘어났습니다.

 

▼ pki/private 디렉토리에는 ca.key 파일이 생성되었습니다.

 

이제 인증기관(CA)이 준비되었으므로, 인증서 관련 요청이 들어왔을 때 서명 작업을 할 수 있습니다. 인증서 생성/폐기 요청을 최종 승인할 수 있게 된 것이지요.
이것으로 OpenVPN 서버에 필요한 필수 구성 요소들이 모두 설치되었습니다.

 

server.key, server.req 파일 생성(gen-req)

다음 절차는 OpenVPN 서버에서 사용할 key(열쇠)와 req(인증 요청) 파일 생성입니다. 파일 이름은 server로 할 거예요. 다른 이름으로 하면 나중에 /etc/openvpn/server.conf 의 내용을 수정해줘야 합니다.

 

▼ ./easyrsa 파일이 있는 경로/easyrsa gen-req server nopass

스샷에서는 cd 명령어로 EasyRSA-3.0.8 디렉토리에 접근한 상태이기 때문에 /easyrsa 파일이 있는 경로/ 입력을 생략했습니다. nopass 옵션을 추가해서 패스워드 지정도 건너뛰었습니다.

▲ 명령을 실행하면 CN(Common Name) 항목 입력을 요구하는데, 원한다면 입력을 하세요. 엔터 치면 그냥 넘어가 버립니다.

절차가 끝나면 생성된 server.req 파일(인증 요청 파일. certificate request)과 server.key 파일(키페어 파일. keypair)의 경로를 띄워줍니다.

 

server.key 파일에 사인 요구(sign-req)

다음 절차는 인증기관(CA)이 부여된 EasyRSA 프로그램으로 server.key 파일에 사인 요구(sign-req)를 하는 것입니다. 본문은 EasyRSA와 OpenVPN이 하나의 서버에서 돌아가는 경우를 가정하고 설명합니다.

 

EasyRSA가 설치된 서버와 OpenVPN이 설치된 서버가 물리적으로 분리되어 있다면(IP가 다르면) server.req 파일과 server.key 파일을 OpenVPN이 설치된 서버로 옮긴 다음 import-req 옵션으로 req 파일을 불러온 후 sign-req를 해야 합니다(OpenVPN 서버의 IP에서 인증서가 승인되어야 함).

이 방식을 선택하고 싶다면 아래의 디지털오션 튜토리얼들을 참고하시기 바랍니다.

https://www.digitalocean.com/community/tutorials/how-to-set-up-an-openvpn-server-on-ubuntu-18-04

https://www.digitalocean.com/community/tutorials/how-to-set-up-and-configure-an-openvpn-server-on-ubuntu-20-04

 

sign-req 옵션의 request 타입은 server, client 두가지가 있는데, gen-req로 서버 인증서를 생성했었으니 sign-req의 request 타입도 server로 줍니다. 아래 명령어에서 첫번째 server 글씨가 request type이고, 두번째 server 글씨는 server.key 파일을 뜻합니다(CN : Common Name을 지정했다면 CN 값을 넣어도 작동할 겁니다.).

 

▼ ./easyrsa 파일이 있는 경로/easyrsa sign-req server server

스샷에서는 EasyRSA-3.0.8 디렉토리에 접근한 상태이기 때문에 /easyrsa 파일이 있는 경로/ 입력을 생략했습니다.

▲ vars 파일에서 set_var EASYRSA_CERT_EXPIRE 옵션을 3650으로 지정했기 때문에 만료기간이 3650 days가 된 것이고, yes 라고 입력하면 계속 진행됩니다. 사인 절차가 끝나면 pki/issued/ 경로에 server.crt 파일이 생성됩니다.

 

Diffie-Hellman key 파일 생성(gen-dh)

다음 절차는 디피 헬만 키(Diffie-Hellman key) 파일 생성입니다. 디피헬만 키는 중간자공격을 방어하는 용도로 쓰입니다. vars 파일 설정할 때 set_var EASYRSA_ALGO 옵션을 ec로 바꾸었다면 이 과정을 건너뜁니다.

 

▼ ./easyrsa 파일이 있는 경로/easyrsa gen-dh

스샷에서는 EasyRSA-3.0.8 디렉토리에 접근한 상태이기 때문에 /easyrsa 파일이 있는 경로/ 입력을 생략했습니다. 시간이 오래 걸립니다.

▲ 2048비트로 생성되는군요. 절차가 끝나면 pki/ 경로에 dh.pem 파일이 생성됩니다.

 

ta.key 파일 생성

다음 절차는 ta.key 파일 생성입니다. ta.key 파일의 용도는 OpenVPN 설정 파일에 아래처럼 나와 있습니다.

For extra security beyond that provided by SSL/TLS, create an "HMAC firewall" to help block DoS attacks and UDP port flooding.

(디도스 공격과 UDP 포트 유출 차단용이군요.) 아래의 명령어를 입력합니다.

 

openvpn --genkey tls-auth ta.key

▲ 오래된 블로그 문서에 openvpn --genkey --secret ta.key 라고 입력하라고 적혀 있을 수 있는데요, 이것은 OpenVPN 2.4 버전에서 쓰는 명령어이고 OpenVPN 2.5에서는 도태(DEPRECATED)되었으니 쓰지 마세요. 대체용으로 입력한 openvpn --genkey tls-auth ta.key 명령어의 근거는 아래 스크린샷에 나와 있습니다.

 

 

/etc/openvpn/server/에 복사

여기까지 진행했을 때 생성된 파일 목록을 정리해보면 아래와 같습니다.

 

pki/ca.crt

pki/private/ca.key

pki/reqs/server.req

pki/private/server.key

pki/issued/server.crt

pki/dh.pem

ta.key

 

이 중에서 ca.crt / server.crt / server.key / dh.pem / ta.key 파일을 /etc/openvpn/server/ 경로에 복사합니다. 아래의 명령어와 스크린샷을 참고하세요.

 

sudo cp pki/ca.crt /etc/openvpn/server/

sudo cp pki/issued/server.crt /etc/openvpn/server/

sudo cp pki/private/server.key /etc/openvpn/server/

sudo cp pki/dh.pem /etc/openvpn/server/

sudo cp ta.key /etc/openvpn/server/

▲ ll 명령어로 확인해 봤더니 잘 처리되었습니다.

( ll /etc/openvpn/server/ )

 

이것으로 서버측 인증서 준비가 끝났습니다.

 

이후 과정은 다음 글에서 적겠습니다.

 

※ 다음 글 : 구글 클라우드 플랫폼(GCP)에 OpenVPN 서버 구축(7) : 클라이언트 인증서 생성

반응형