📌 SSL 인증서 발급 방법은 아래 포스팅을 참고해주세요.
이전 포스팅에서 SSL 인증서를 발급받았고,
이제는 내 프로젝트에 발급받은 인증서를 적용할 차례이다.
인증서를 발급받으면 아래와 같이 Install Certificate이 나온다.
나는 우분투로 할 것이기 때문에 Server Type을 Ubuntu로 변경 후,
zip 파일 다운로드 버튼을 눌러준다.

먼저 인증서가 제대로 발급이 되었는지 확인해보려고 한다.
다운받은 인증서 폴더로 들어가면 아래 세 파일이 존재한다.

👉 ca_bundle.crt
👉 certificate.crt
👉 private.key
그 중 .crt 파일을 누르면 아래와 같이 인증서 정보와 인증서 설치 버튼이 나온다.

버튼을 누르면 아래와 같이 인증서 가져오기 마법사를 통해 인증서를 가져올 수 있다.

잘 완료되었으면 window + R에서 certmgr.msc를 검색하여 인증서를 확인해볼 수 있다.
여러 인증서들이 있는데, 거기서 개인용 - 인증서 경로로 들어가면 내가 발급받은 SSL 인증서가 나온다.

그리고 인증서 눌러보면 아래와 같이 정보가 잘 나와 잘 발급받았다는 것을 확인할 수 있다!

먼저, 내 프로젝트에 적용시킬 파일을 생성하기 위해 우분투에서 해야할 일이 있다.
우분투에서 인증서의 경로로 들어가서
아래 명령어로 key 파일을 keystore.p12로 바꿔주어야한다.
👉 openssl pkcs12 -export -out keystore.p12 -inkey private.key -in certificate.crt -certfile ca_bundle.crt

인증서 패스워드를 정하고 나면,
해당 경로에 아래와 같이 keystore.p12 파일이 생긴다.

이 파일을 내 프로젝트의 resource 경로에 넣어줄 것이다.

그리고 application.yml 파일에 SSL 설정을 해주기 위해
우리가 넣었던 인증서 파일의 경로와, 설정했던 패스워드를 넣어준다.

그리고 변경사항을 배포하기 위해 머지한다.
나의 경우 AWS EC2로 배포를 했기 때문에 EC2서버로 내 파일들을 옮겨야한다.
그래서 scp 명령어를 사용하여 옮겨줄 것이다.
👉 scp -i ~/Desktop/{aws 인스턴스 pem키 파일} ~/Desktop/jandpSSL/{옮길 파일} ubuntu@43.202.248.10:/home/ubuntu/
위 명령어로 내 인증서 폴더에 있는 세개의 파일을 옮겨주어야한다.

여기서 jandpSeoul.pem 은 AWS 인스턴스 생성할 때 받았던 pem key이므로 잘 저장해 두었어야한다.
여기까지 하고 aws 서버 들어가면 루트 경로에 이렇게 세 파일이 옮겨져있을 것이다.

그런데 얘네들을 루트 경로에 넣는 것보다는 /etc/ssl/ 경로에 넣는게 안전하다고 한다.
❗ 파일들을 /etc/ssl/ 경로로 이동시키는 것이 더 표준적이고 관리하기 쉬운 방법입니다.
❗ 이 경로는 대부분의 서버에서 SSL 관련 파일을 보관하는 디렉토리입니다.
따라서 sudo mv 명령어로 해당 파일들을 모두 옮겨주고
👉 sudo mv /home/ubuntu/certificate.crt /etc/ssl/certs/
👉 sudo mv /home/ubuntu/private.key /etc/ssl/private/
👉 sudo mv /home/ubuntu/ca_bundle.crt /etc/ssl/certs/
해당 경로에 들어가보면 잘 옮겨진 것을 확인할 수 있다.
private 폴더의 경우 cd 명령어로 들어갈 수 없어서 sudo ls /etc/ssl/private/ 이런 식으로 들어있는 list를 확인해 옮겨졌는지 확인이 가능하다.
https://narup.tistory.com/240 이거 참고
( 위에 블로그 캡쳐한 거 )
여기까지 했으면 리다이렉션 설정을 하기 위해 Nginx 적용할 것이다.
EC2에 아래 명령어로 Nginx 설치한다.
👉 sudo apt update
👉 sudo apt install nginx
그럼 /etc/nginx 이 경로에 Nginx 설치된다.

해당 경로에 들어가 nano 명령어로 Nginx 설정 파일을 열어서 편집할 것이다.
👉 sudo nano /etc/nginx/sites-available/default

아래와 같이 내 서버명과 https의 리다이렉트 주소를 넣어주고,
Nginx를 사용할 때 기존에 80포트(HTTP)로 접근되는 요청을 proxy_pass에 특정 웹서버(:3000)로 연결시켰다면,
SSL을 사용할 때는 443포트(HTTPS)로 연결시키도록 작성해주는 것이 포인트다!
여기서 특히 SSL 인증서 설정 부분이 중요한데,
아래와같이 SSL 인증서 파일의 경로를 작성해주는 것은 443으로 들어오는 요청을 SSL 인증서로 암호화하겠다는 의미이다.
// HTTP 서버 설정 (포트 80) server { listen 80; server_name jandp-travel.kro.kr; return 301 https://$server_name$request_uri; } ⠀ // HTTPS 서버 설정 (포트 443) server { listen 443 ssl; server_name jandp-travel.kro.kr; ⠀ // ssl 인증서 설정 ssl_certificate /etc/ssl/certs/certificate.crt; ssl_certificate_key /etc/ssl/private/private.key; ssl_trusted_certificate /etc/ssl/certs/ca_bundle.crt; ⠀ // 요청 처리 설정 location / { proxy_pass https://localhost:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
이렇게 설정을 편집하고 저장한 후에
이 내용을 적용하기 위해서 아래 명령어로 nginx를 재시작한다.
👉 sudo systemctl restart nginx
( 또는 sudo service restart nginx )
❗
sudo nginx -t명령어로 설정 파일 테스트를 해볼 수 있다.
--> 만약 재시작했는데 failed했다고 하면, 이 명령어로 왜 실패했는지 알 수 있음
여기까지 하고 다시 서버를 돌리기 위해 jar 파일 실행(빌드)하면 서버가 돌아가고 완성이다!

Nginx 파일 수정 시, 요청을 받을 로컬 서버도 https가 되어야한다는 점이다.
⠀
Nginx를 사용하게 되면 보통 흐름이 아래와 같이 흐른다.
사용자가 브라우저(클라이언트)를 통해 https://jandp-travel.kro.kr에 접근
Nginx 서버가 이 HTTPS 요청을 받고, 요청 처리
Nginx는 로컬 서버(Ex. localhost:8080)에 요청을 전달해야 하는데,
➜ proxy_pass http://localhost:8080; ➜ 이 경우 HTTP로 요청을 전달하게 되어, HTTPS 요구 사항에 맞지 않아 오류가 발생
➜ proxy_pass https://localhost:8080; ➜ 이 경우 HTTPS로 요청을 전달하게 되어, 오류 없이 정상적으로 통신이 이루어짐
⠀
- 클라이언트 ➜ 사용자의 웹 브라우저
- Nginx 서버 ➜ HTTPS 요청을 처리하는 웹 서버
- 로컬 서버 ➜ Nginx가 요청을 전달하는 백엔드 서버
따라서 s를 안쓰고 proxy_pass http://localhost:8080;로 하게 되면 에러가 난다는 점 주의하기!!