반응형
개요
프로젝트를 진행하던 중 nginx를 이용하여 웹 서버를 만들면서 SSL/TLS를 적용한 방식을 설명한다.
프로젝트의 서버 구조는 다음과 같다.
- netlify에 프론트를 배포하고 백엔드와의 통신을 위해 HTTPS를 적용하기로 했다!
본론
SSL/TLS(HTTPS 적용) 절차
- letsencrypt로부터 인증서를 발급받는다.
- 발급받은 키(인증서)를 nginx에 적용한다.
- nginx에 스프링 부트로 리버스프록시를 설정한다.
인증서를 발급받기 전에 해당 인증서를 발급받기 위한 준비를 먼저 하자!
0. 인증서 발급 전 준비 (nginx 실행)
sudo docker run -d --name nginx --network {네트워크명} -p 80:80 -p 443:443 \
-v /home/ubuntu/conf:/etc/nginx/conf.d \
-v /home/ubuntu/letsencrypt:/etc/letsencrypt \
-v /home/ubuntu/certbot/www:/var/www/certbot \
nginx:latest
- -v /home/ubuntu/{하고싶은 디렉토리}:/etc/nginx/conf.d : nginx의 설정 파일을 넣을 공간을 컨테이너내부 디렉터리-로컬 디렉터리 마운트해준다.
- -v /home/ubuntu/letsencrypt:/etc/letsencrypt : 발급받은 인증서에 접근하기 위한 공간도 마운트해준다.
- -v /home/ubuntu/certbot/www:/var/www/certbot : 인증서를 발급받기 위한 정보가 있는 공간도 마운트해준다.
0-1. 정적 파일 서빙
cd /home/ubuntu/conf
sudo touch default.conf
sudo vim default.conf
---
server {
listen 80;
server_name test-domain.com;
location / {
root /var/www/certbot;
}
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
}
:wq
---
sudo docker restart nginx
/
로 시작하는 요청이 온 경우 nginx는 /var/www/cerbot의 위치에 있는 정적 파일을 서빙한다./.well-known/acme-challenge/
로 시작하는 요청이 온 경우 위와 같이 /var/www/cerbot의 위치에 있는 정적 파일을 서빙한다.
0-2. 인증서 발급 테스트
인증서 발급 시도는 도메인당 최대 5회로 그 이상 시도하게될 경우 해당 도메인으로 발급을 받을 수 없다.
- 따라서 몇가지 테스트를 진행해보자.!
cd /home/ubuntu/certbot
sudo touch index.html
sudo vim index.html
---
<h1>test</h1>
- 위와같이 작성해주고 http://test-domain.com/index.html로 접속했을 때, test라는 글씨가 담긴 html이 응답으로 오는지 확인해본다.
docker run --rm --name certbot --network {네트워크명} \
-v /home/ubuntu/letsencrypt:/etc/letsencrypt \
-v /home/ubuntu/certbot/www:/var/www/certbot \
certbot/certbot certonly --webroot --webroot-path=/var/www/certbot \
-d {도메인명} -m {이메일} --agree-tos --staging --no-eff-email
--staging
옵션을 달아서 인증서 발급 테스트도 해볼 수 있다!
1. 인증서 발급
docker run --rm --name certbot --network {네트워크명} \
-v /home/ubuntu/letsencrypt:/etc/letsencrypt \
-v /home/ubuntu/certbot/www:/var/www/certbot \
certbot/certbot certonly --webroot --webroot-path=/var/www/certbot \
-d {도메인명} -m {이메일} --agree-tos --no-eff-email --force-renewal
- -v /home/ubuntu/letsencrypt:/etc/letsencrypt : 발급받을 인증서가 저장될 공간을 마운트한다.
- -v /home/ubuntu/certbot/www:/var/www/certbot : 인증서를 발급받기 위해 접근되어야 할 공간이다.
2. 발급받은 키(인증서)를 nginx에 적용 및 리버스 프록시
아래와 같이
default.conf
를 수정해준다.
cd /home/ubuntu/conf
sudo vim default.conf
---
server {
listen 80;
server_name {도메인};
# HTTP 요청을 HTTPS로 리디렉션
location / {
return 301 https://$host$request_uri;
}
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
}
server {
listen 443 ssl;
server_name {};
ssl_certificate /etc/letsencrypt/live/{도메인}/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/{도메인}/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://{스프링-컨테이너명}:80;
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;
}
}
:wq
---
sudo docker restart nginx
- 80번 포트로 요청이 온 경우https로 리다이렉션 한다.
- 443 포트로 요청이 온 경우 스프링 컨테이너의 내부 포트 80번으로 요청을 프록시한다.
결론
- 성공적으로 SSL/TLS가 적용된 것을 볼 수 있다.
- http 요청이 온 경우에도 바로 https로 리다이렉션 시키는 것도 확인할 수 있었다.
반응형
'데브옵스' 카테고리의 다른 글
[Jenkins] 젠킨스 sudo 명령어 권한 (0) | 2024.02.17 |
---|---|
[Jenkins] 젠킨스 빌드할 때 필요한 파일 미리 넣어두기 (0) | 2024.02.17 |
[Jenkins] Jenkinsfile을 통해서 파이프라인 실행 (0) | 2024.02.16 |
윈도우에 우분투 설치 (1) | 2024.02.15 |
[NCP] NCP 쿠버네티스 클러스터 사용법 (1) | 2023.11.13 |