무료 ssl 인증서는 3개월마다 한번씩 만료된다. 이를 서버에 다시 적용할 때마다 방법을 다시 찾아보는게 귀찮아서, 문서화도 하고 약했던 서버 관련 개념도 정리할 겸 블로깅해본다.

 

따라서 이번 포스팅에서는 Nginx를 이용해 Ec2 인스턴스에서 SSL/TLS 인증서를 설정하고, HTTPS 보안 연결을 활성화하는 과정을 작성해보려 한다.

 

SSL/TLS 는 웹 사이트와 사용자의 브라우저 간 통신을 암호화하여, 데이터를 안전하게 만드는 프로토콜이다.

SSL과 TLS는 사실상 같은 기능을 하는 프로토콜이지만 TLS가 SSL의 후속 버전이다.

 

자세한건 다음 블로깅에서 포스팅할 예정

 

일단 인증서 발급 사이트에서 다운받은 인증서를 인증서 가져오기로 가져온다! (ZeroSSL를 이용했다)

 

 

1️⃣ 다운받은 인증서 가져오기

인증서를 다운받으면 위와 같이 세개의 파일이 다운받아진다.

각 파일들은 다음과 같은 역할을 한다.

 

🔑 private.key(개인키) 

서버에서만 사용되는 비밀 키이다.

SSL/TLS 인증서와 연관된 암호화 및 복호화 작업을 수행하는데 사용된다.

이 키는 절대로 외부에 노출되거나 공유되어서는 안된다.

서버는 이 개인 키를 사용하여 클라이언트 (ex: 웹 브라우저) 와의 통신을 암호화하고,

클라이언트는 서버의 공개 인증서를 사용하여 데이터를 복호화한다.

 

📄 certificate.crt (공개 인증서)

서버의 신원을 증명하는 공개 인증서이다.

인증기관(CA)에 의해 서명되며, 서버의 도메인과 관련된 정보를 포함하고 있다.

클라이언트는 이 인증서를 사용하여 서버의 신뢰성을 확인한다.

 

📑 ca_bundle.crt (중간 인증서, 인증 체인)

최종 사용자의 인증서와 루트 인증서 사이를 연결해 주는 역할을 한다.

클라이언트가 서버의 인증서를 검증할 때, 이 중간 인증서들이 사용되어 루트 인증서까지 신뢰 경로를 만든다.

대보본의 SSL/TLS 설정에서 이 파일을 포함시키는 것이 필수적이다.

 

 

 

2️⃣ keystore.p12 생성

앱이 외부 api와 통신할 때 ,앱이 직접적으로 HTTPS를 통해 요청할 때 등의 보안을 위하여

Nginx 설정 외에 프로젝트 내부에도 인증서를 두면 좋은데,

관리하기 쉽게 이제 다운받은 키와, 인증서들을 묶어 파일을 하나로 묶어 .p12 파일로 만들어 줄 것이다.

 

이러면 파일을 개별적으로 관리할 필요 없이 , 하나의 파일만 사용하여 SSL/TLS 설정을 완료할 수 있다.

많은 서버와 앱들은 .p12 또는 .pfx 형식을 사용하여 인증서를 가져오도록 설계되어 있다. 

이 p12 파일은 암호화된 상태로 저장되며, 이 파일을 사용할 때는 비밀번호가 필요하다. 

 

우분투에서 해당 인증서가 있는 위치로 이동하여 다음 명령어로 keystore.p12 파일을 생성한다

openssl pkcs12 -export -out keystore.p12 -inkey private.key -in certificate.crt -certfile ca_bundle.crt

openssl -> openssl 라이브러리를 이용하는 명령어

pkcs12 -> PKCS#12 형식을 나타냄. 이형식은 개인 키와 인증서를 저장하는 바이너리 형식이다

-export -> 데이터를 PKCS#12 파일로 내보내기 하겠다는 명령어

-out keystore.p12 -> 결과로 생성될 파일의 이름을 지정 (keystore.p12)

-certificate ca_bundle.crt -> 추가로 포함할 인증서(중간 인증서나 루트 인증서 등)을 지정

이때 비밀번호도 설정 (비밀번호 짧으면 나중에 서버에서 안먹히니까 넉넉하게 길게 만들어두기)

 

 

3️⃣  p12 파일 프로젝트 내 적용

만들어준 .p12 파일을 프로젝트 내 다음 위치에 넣고,

yml 에서 비밀번호도 아까 설정해준 걸로 변경한다.

 

 

 

 

 

4️⃣ 서버환경(EC2)으로 파일 이동

이제 AWS EC2 인스턴스에 SSL/TLS 인증서를 설치하고, Nginx 웹 서버를 HTTPS로 구성해주기 위해, 서버로 파일들을 보내야 한다.

scp 명령어를 이용하여 내 로컬에서 서버환경(EC2)으로 파일을 보내준다.

ex) scp -i <key file> <cert file> ubuntu@<server ip>:/home/ubuntu

 

(나는 git bash에서 실행했다)

김채은@DESKTOP-27L23Q9 MINGW64 ~
$ scp -i ~/OneDrive/바탕\ 화면/jandpSeoul.pem ~/OneDrive/바탕\ 화면/jandpssl/certificate.crt ubuntu@43.202.248.10:/home/ubuntu/
certificate.crt                                                                                         100% 2301    36.2KB/s   00:00

김채은@DESKTOP-27L23Q9 MINGW64 ~
$ scp -i ~/OneDrive/바탕\ 화면/jandpSeoul.pem ~/OneDrive/바탕\ 화면/jandpssl/ca_bundle.crt ubuntu@43.202.248.10:/home/ubuntu/
ca_bundle.crt                                                                                           100% 2431   174.5KB/s   00:00

김채은@DESKTOP-27L23Q9 MINGW64 ~
$ scp -i ~/OneDrive/바탕\ 화면/jandpSeoul.pem ~/OneDrive/바탕\ 화면/jandpssl/private.key ubuntu@43.202.248.10:/home/ubuntu/
private.key

 

 

그러면 ec2의 해당 위치로 이렇게 3개 파일이 옮겨짐~~

 

원활한 엔진엑스 설정을 위해 다음 경로로 파일을 옮겨줄 것이다!

 

인증서를 갱신하는 경우에는 일단 기존 파일들을 삭제하고

 

 

 

다음 경로로 새 파일을 옮긴다

 

 

5️⃣ 엔진엑스 설정 변경

 

-> 해당 위치의 sites-available 파일을 편집해 줄 것임

편집 명령어

sudo nano /etc/nginx/sites-available/default

 

 

6️⃣ 파일 설정 변경

 

 

Nginx (엔진엑스)란?
Nginx는 웹 서버 소프트웨어이다.

웹 서버는 클라이언트(예: 웹 브라우저)에서 요청한 웹 페이지나 리소스를 제공하는 프로그램이다.
Nginx는 또한 리버스 프록시 서버로도 사용되며,
이는 클라이언트의 요청을 다른 서버로 전달하고 응답을 클라이언트에게 다시 전달하는 역할을 한다.

Nginx의 주요 기능
정적 콘텐츠 제공: HTML 파일, 이미지, CSS 등 정적 파일을 매우 빠르게 제공할 수 있다.
로드 밸런싱: 여러 서버에 걸쳐 트래픽을 분산시켜 서버의 부하를 줄이고, 성능을 향상시킨다.
리버스 프록시: 외부에서 오는 요청을 내부 서버로 전달하여 서버의 보안을 강화한다.
HTTPS 지원: SSL/TLS를 사용하여 보안 연결을 제공할 수 있다.

 

 

jandp 프로젝트 서버의 엔진엑스 파일에는 다음과 같은 설정을 포함했다.

 

1) 443 포트 활성화.

listen 443 ssl;

HTTPS는 기본적으로 443포트를 사용한다.

이 설정은 Nginx가 443포트에서 SSL/TLS 를 사용한 보안 연결을 수신하도록 지정한다.

포트를 명시하지 않으면 기본적으로 포트 80에서 HTTP 요청을 수신하도록 설정된다.
따라서 HTTPS를 사용하려면 반드시 443 포트를 명시하고 SSL/TLS를 활성화해야 한다.

 

2) 서버 이름 설정

server_name jandp-travel.kro.kr;

해당 설정으로 특정 도메인에 대한 요청을 처리하도록 Nginx에 지시힌다.

 

3) SSL 인증서 설정

ssl 인증서들의 위치를 지정한다.

 

4) 프록시 설정

보안과 성능 향상을 위해 프록시도 설정해준다.

 

proxy_pass http://localhost:8080;  ➡️  클라이언트의 요청을 백엔드 서버 (localhost:8080)으로 전달한다.

 

이렇게 하면 

사용자가 내 웹사이트에 접속한다. 이 요청은 먼저 Nginx가 받는다

➡️  Nginx는 이 요청을 localhost:8080으로 전달한다. (이 localhost는 바로 같은 EC2 인스턴스에서 실행 중인 백엔드 애플리케이션을 가리킨다.)

➡️ 백엔드 애플리케이션이 요청을 처리하고, 그 결과를 Nginx로 보내면, Nginx는 다시 사용자에게 결과를 전달한다.

 

 

 

7️⃣ 엔진엑스 재시작 명령어로 재실행해줌

sudo sysremctl restart nginx

 

인증서 갱신의 경우 파일 위치가 똑같다면

nginx 파일의 내용이 변한게 없기에 굳이 재시작하지 않아도 된다.

 

 

이제 https 주소로 사이트에 접속할 수 있다!

 

 

끝~~~

복사했습니다!