요즘 웹사이트들은 보안인증을 위해 기본적으로 HTTPS 를 적용한다.
그러므로 NginX 환경에서 SSL 인증을 해볼 것이다.
SSL 인증서는 기본적으로 구매를 해야 하는 데,
나의 경우에는 개발서버에 구축을 해야 하다보니 금액이 부담스러워
무료 SSL 인증서를 써야 했다.
고맙게도 무료 SSL 인증서를 만들어주는 곳이 있으니 그것을 활용해보자.
(90일간 사용가능하며, 인증서 갱신 가능)
필자의 경우 CentOS 에서 하므로, Yum 으로 통일한다.
1.Certbot 설치
정상적으로 설치되면 아래와 같이 나올 것이다.

Certbot 이 설치되었으니 SSL 인증을 할 도메인을 등록해주어야 한다.
2. 도메인 등록

위와 같은 명령어를 실행하고 필자의 경우 중간에 아래와 같은 에러가 발생했는 데,
80포트가 중첩되어 발생한 에러였다.
현재 사용하고 있는 80포트는 NginX 였으므로, NginX 를 stop 시키고 다시 명령어를 실행했다.
3. NginX Stop, 도메인 등록 재실행 (포트가 중첩되었을 경우에만 해당)

다시 명령어를 실행하는 경우 따로 질문을 하지않고 인증서가 등록된다.
여기서 fullchain.pem 과 privkey.pem 의 경로를 꼭 기억하고 있어야 한다.
향후 Nginx 파일을 수정할 때 작성하기 때문이다.
그 다음으로 해당 인증서가 없어질 수도 있기 때문에,
다른 곳에 따로 백업을 해두자.
4. 인증서 백업
경로는 본인 입맛에 맞는 곳으로 설정하자.
꼭 안해도 되지만, 안전을 위해 해두는 것이 좋을 것 같다.
5. default.conf 파일 수정
여기서부터 상당히 중요한데, SSL 도입을 하는 경우 앞선 포스팅의 리버스프록시 부분보다
많은 부분이 수정된다.
전체 소스
server {
listen 80 default_server;
server_name 도메인주소.kr;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2 ;
listen [::]:443 ssl http2 ;
server_name localhost;
ssl on;
ssl_certificate /etc/letsencrypt/live/도메인주소/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/도메인주소/privkey.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
resolver 8.8.8.8;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
keepalive_timeout 10;
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://localhost:3000;
}
}
소스를 분석해보자.
* 전체 개요
나의 경우 http 로 접근을 하든, https 로 접근을 하든, 80포트에서 3000번 포트로
포트포워딩을 해줘야하는 상황이었다.
그래서 1차적으로 80포트로 접근했을 때 아래와 같은 443포트로 이동시켰고,
443포트 내에서 리버스프록시로 서버내의 3000포트로 이동시켰다.
* SSL 설정
이부분은 구글링을 하다보니 옵션이 매우 상세해서, 공식문서를 참고하셔도 좋으나
필요없는 부분도 있기에 내가 설정한 것만 사용해도 좋을 것 같다.

SSL 설정 부분
다른부분은 복사해서 붙여넣어도 상관없으나,
ssl_certificate 와 ssl_certificate_key 부분은 각자 도메인 및 경로에 맞는 것으로 설정을 해주자.
옵션별로 자세한 해설은 나중에 다뤄보겠다.
6. Nginx 재시작

HTTPS 적용한 모습
성공 !
* 오류
1. 쿠키 문제
나의 경우 다른사람의 글대로 적은 데로 세팅을 해도 안됐다.
그런데 알고보니 개발환경에서 특정 URL 로 너무 리다이렉트되서
접근이 안되던 것이었다.
그럴 경우에는 쿠키를 삭제해주면 된다.
2. 도메인 문제
서버 내에서 등록된 도메인으로 적을 경우 리다이렉트 안되는 문제가
발생하여 localhost로 바꾸니 정상 적용된다.
'서버 > 리눅스' 카테고리의 다른 글
[리눅스] 포트를 찾아 종료하기 (2) | 2025.02.11 |
---|---|
[리눅스] 터미널 세션 종료 후 프로그램 실행 (0) | 2025.02.11 |
[NginX] HTTPS를 적용해보자-01 (Feat.Reverse Proxy) (0) | 2025.02.11 |
[리눅스] DDoS 공격 방어 (0) | 2025.02.11 |
[Nginx] 악성봇 & 스팸봇 차단 (0) | 2025.02.11 |