본문 바로가기
Linux

Nginx SSL(HTTPS) 적용 - Certbot(Let's encrypt)

by lucas_owner 2025. 3. 26.

Nginx SSL(HTTPS) 적용 - Certbot(Let's encrypt)

기존에 사용하던 도메인이 저번달부로 만료되어, 새로운 도메인을 구입했다. 

새로운 도메인 연결할겸 ,,, 미뤄왔던 작업을 하려고 하던중 기록해둘겸 포스팅한다.. 

어떤 작업들을 계속 진행할건지는 추후 포스팅 작성후 링크를 걸어두도록 하겠다.

 

일단 제목대로 Oracle Cloud 서버에 기동중인 Nginx 에 SSL 을 적용하여 HTTPS 로 통신할 수 있도록 하겠다.

 

 

1. 개념 확인

우선 알고 넘어가면 좋은 개념들에 대해서 간략하게 설명 이후 진행하도록 하겠다.

 

굳이 왜 HTTPS 로 전환하려고 하는가?

필자의 경우는 Nginx 를 Reverse Proxy 로 사용중이다. 목적지는 홈서버이기에 중간에 공격자로부터 데이터를 보호하기 위해서다.
또한 웹사이트 무결성을 통하여 필자의 웹에 자체 리소스를 삽입하는등 보안취약점을 막기 위해서 SSL 적용을 하였다.

 

 

 

- Let's Encrypt

Let's Encrypt 는 공식홈페이지에서도 알 수 있듯이 TLS 인증서를 무료로 발급해주는 비영리 기관이다.

일반적으로 CA(인증기관) 에서 TLS 인증서를 발급받으려면 일정금액을 지불해야하는 방식이다. 

금액을 지불하고 인증서를 받는만큼 사이트에 대한 검증도 진행하고 보장을 해주는것이다.

 

한번 인증서를 발급 받게되면 90일동안 유효하게 되며, 만료 30전부터 재발급을 받을 수 있다.

 

하지만, 개인용으로 사용하는데 금액을 지불할 필요가 없어서 Let's Encrypt 인증서로 결정했다.

공식 사이트에서 제공하는 활성화된 도메인수만 봐도 꽤나 많다는것을 확인할 수 있다.

https://letsencrypt.org/ko/

 

 

- Certbot

Let's Encrypt 에서 추천하는 인증서 발급 프로그램이다. 

Certbot 을 사용하여 인증서를 발급 받는 방법은 4가지 정도가 존재한다. 

 

1. standalone: 웹사이트의 네트워크를 통해 사이트의 유효성을 판단

2. webroot: 웹서버에서 실행중인 사이트를 이용하여 발급(서버 디렉토리)

3. DNS: DNS 에 TXT 레코드를 생성해서 인증서를 발급받는 방식 (인증서 갱신 마다 TXT 레코드 수정필요)

4. 웹서버 인증 : Nginx, Tomcat 과 같은 WebServer 에서 직접 SSL 인증 후 설정 변경

 

Nginx 에서 사용할 경우 아주 간단하게 발급해줌과 동시에, 도메인에 대한 설정까지 알아서 진행해준다. (편리, 간단함)

 

 

 

2. 사전 확인

설치부터 순차적으로 하면 좋겠지만, 좀더 편리함과 마음의 편안함을 위해 사전 준비 작업부터 진행하도록 하겠다

 

1. apt-get update

2. crontab 없을시 설치

- apt-get install cron 
- service cron start
- systemctl enable cron.service

3. 방화벽 오픈 확인

- AWS 인바운드, Oracle 보안규칙 80,443 포트 오픈
- iptables 사용시 80,443 오픈 (iptables -A INPUT -p tcp --dport 80 -j ACCEPT) - 443 도 똑같이 작업
- ufw 사용시 (ufw allow 80, ufw allow 443, ufw allow "Nginx full",  ufw reload) - 총 3개

4. 서버의 TimeZone 변경 (Cron 작업을 위해 변경)

$ timedatectl -> 서버의 시간대 확인 (보통 UTC)
$ sudo timedatectl set-timezone Asia/Seoul

5. Nginx 설치,기동 및 Domain 연결

- 당연하게도 Nginx 설치 후 기동 확인 해야함. IP:80 으로 접속시 Nginx 페이지 확인!
- 가비아 같은 Domain 구입 사이트에서 도메인과 Server IP 연결 확인
필자의 경우는 메인도메인, 서브도메인 둘다 같은 IP 에 연결시켜두었음.

 

 

 

3. Certbot 설치 및 인증서 발급

$sudo apt install certbot python3-certbot-nginx -y

certbot 의 플러그인중 하나인 python3-certbot-nginx 를 설치하도록 하자. 

Nginx 의 설정을 자동으로 수정하여, SSL 발급, 적용을 좀더 쉽게 만들어준다.

 

 

3-1. 인증서 발급

기본적으로 아래의 커맨드로 인증서 발급 및 Nginx 설정 수정까지 자동으로 이루어진다.

$sudo certbot --nginx  -d <도메인 이름> # ex)example.com

 

 

 

하지만 필자처럼 다중 도메인을 사용하는 경우도 존재할거라고 생각한다.

그럴 경우 아래 커맨드처럼 계속 이어주면 된다. -d 이후 도메인명 으로 여러개의 도메인을 한번에 발급 받을 수 있다.

$sudo certbot --nginx  -d <domain1> -d <domain2>

 

2025.03.25 기준: 위의 커맨드처럼 여러개의 도메인을 한번에 발급받게 되면, 인증서는 1개가 발급되고 모든 도메인이 해당 인증서 하나로 인증된다. 또한 Nginx 의 설정파일의 경우 default 안에 한번에 설정이 적용되는것을 확인했다.

 

인증서 발급시 이메일 등록 및 선택지가 여러개 나오게 된다. 기본적으로 'Y' 선택해주면 된다.

 

 

 

발급 완료 이후 인증서 확인을 통해 Domain 들이 적용되었는지 확인해보자 .

$sudo certbot certificates

해당 명령어 사용 후 Domains, Path 를 확인해보도록 하자.

등록된 도메인과, 인증서가 설치된 경로를 확인할 수 있다.

 

Nginx 설정을 보기전에 잠깐 짚고 넘어가자면, 필자는 도메인, 서브도메인에 관한 server 설정을 /etc/nginx/sites-available/ 안에서

파일들을 분리하여 사용한다. 도메인 별로 파일을 만들어 설정 후 Symbolic Link 연결만으로 간단하게 사용가능하기 때문이다.

이외에도 conf.d 경로에 설정을 추가해도 무방하다.

 

 

 

3-2. Nginx 확인

Domain 을 1개만 발급받았다면 /etc/nginx/sites-available/default 파일을 확인하면 SSL 관련 설정들이 추가 된것이 보일것이다

server {
        root /var/www/html;
        index index.html index.htm index.nginx-debian.html;
        server_name {도메인}; # managed by Certbot

        location / {
                try_files $uri $uri/ =404;
        }

    listen [::]:443 ssl ; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/{도메인}/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/{도메인}/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
    if ($host = {도메인}) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


        listen 80 ;
        listen [::]:80 ;
    server_name {도메인};
    return 404; # managed by Certbot
}

# managed by certbot 부분이 certbot 이 자동으로 설정을 변경해준 부분이다. 

{도메인} 부분을 본인의 도메인이 맞는지 확인해보도록 하자.

 

 

만약 도메인을 2개이상 발급 받았다면 해당 파일아래에 붙어있을수도 있고, /sites-available 경로에 파일로 분리되어있을수도 있다.

여기서 사용자의 취향에 따라 그냥 사용해도 되고, 필자처럼 각 도메인별 파일 분리를 진행해도 된다.

# 파일 분리 방법

$vim {domain}

# default 파일에서 복사, 붙여넣기

$sudo ln -s /etc/nginx/sites-available/{domain} /etc/nginx/sites-enabled/

 

 

 

3-3. Nginx 문법 확인 및 반영(재실행)

$sudo nginx -t 
$sudo systemctl reload nginx

이후 도메인으로 요청을 보내 보도록 하자. http 로 요청을 보내도 https 로 redirect 까지 수행함을 확인할 수 있다.

또한 인증서 뷰어를 통해서 발급기관과 유효기간까지 확인할 수 있다.

 

 

 

 

4. SSL 인증서 자동 갱신

인증서 발급, 유효한 웹사이트 확인까지 마쳤다면 자동으로 인증서 갱신을 등록할 차례이다.

사전에 언급했듯 인증서의 유효기간은 90일이기에 그전에 자동으로 갱신해줘야 한다.

다만 30일 전부터 갱신이 가능하다

여기서 crontab 을 활용하여 갱신을 진행할것이다.

# 인증서 갱신 테스트
$sudo certbot renew --dry-run

# 인증서 유효기간 확인
$sudo certbot certificates

위의 커맨드는, 인증서 갱신 테스트, 인증서 유효기간 확인할 수 있는 커맨드이다.

 

이제 Crontab 을 등록하고, 확인하면 모든 작업이 끝난다.

$crontab -e

# 매일 새벽 3시에 갱신 + Nginx 재설정(꺼져있는경우 아무동작 안함)
0 3 1 * * certbot renew --quiet && systemctl reload nginx 


$crontab -l

이때 Crontab 은 서버의 시간기준으로 동작하므로, 사전준비의 서버시간을 바꾸지 않았다면 UTC 기준으로 동작한다.

 

 

 

5. ETC

혹시나 인증서 발급받는 도중 오류가 있어서, Nginx default 파일에 아무것도 수정이 되지 않았다면

$sudo certbot --nginx  -d <도메인 이름> # ex)example.com

명령어를 한번더 실행해 보자. 인증서가 발급되어 있는 경우 2가지의 옵션중 하나를 선택하라고 할것이다.

그중 2번 항목인 https 로 redirect 항목을 선택 후 default 파일과 sites-available 디렉토리를 확인해보도록 하자.

 

 

 

예전에 Traefik 이라는 Router 와 함께 사용했을때는 굉장히 복잡했었는데 Nginx 로 SSL 적용하는건 상대적으로 너무 쉬웠던것 같다.

다만 뭔가 안된다면 방화벽을 꼭 확인 하도록 하자.

반응형

댓글