Nginx 웹 서버 Let’s Encrypt 무료 SSL 인증서 발급 및 자동 갱신 설정

[우분투 24.04 LTS] Nginx 웹 서버 Let’s Encrypt 무료 SSL 인증서 발급 및 자동 갱신 완벽 가이드

웹 서비스 운영에 있어 클라이언트와 서버 간의 데이터 통신 구간을 암호화하는 HTTPS 보안 프로토콜 적용은 선택이 아닌 필수 표준이다. 구글(Google)을 비롯한 주요 검색 엔진은 HTTPS가 적용되지 않은 HTTP 기반 웹사이트의 검색 노출 순위(SEO)를 페널티 처리하며, 최신 웹 브라우저는 접속자에게 ‘주의 요함’이라는 치명적인 보안 경고를 노출한다.

본 문서는 우분투(Ubuntu) 24.04 LTS 환경에서 구동되는 Nginx 웹 서버에 개방형 비영리 인증 기관인 Let’s Encrypt의 무료 SSL 인증서를 적용하고, 만료 전 자동으로 갱신되도록 시스템 스케줄링을 구축하는 실무 프로세스를 상세히 기술한다.

1. SSL/TLS 인증서 발급을 위한 인프라 사전 검증

인증서 발급 프로세스를 실행하기 전, 서버의 네트워크 인프라와 웹 서버 구성이 다음 세 가지 필수 요건을 충족하는지 엄격하게 검증해야 한다.

  1. 도메인 소유권 및 DNS 매핑: 서버의 공인 IP 주소와 연결된 유효한 도메인(Domain)을 소유하고 있어야 하며, DNS 관리자 설정에서 A 레코드가 해당 서버 IP를 정확하게 지시하고 있어야 한다.
  2. 네트워크 포트 완전 개방: 시스템 내부 방화벽(UFW)은 물론, 공유기 및 클라우드 서비스의 네트워크 보안 그룹에서 웹 통신을 위한 HTTP(80번 포트)와 HTTPS(443번 포트)가 외부로 완전히 개방되어 있어야 한다.
  3. Nginx 서버 블록 구성: Nginx 설정 파일(/etc/nginx/sites-available/ 내부)의 server_name 지시자에 발급받고자 하는 도메인 주소가 명시적으로 선언되어 구동 중이어야 한다.

2. Certbot 패키지 배포 및 플러그인 환경 구축

Let’s Encrypt SSL 인증서의 발급, 시스템 적용, 갱신 프로세스를 자동화하는 표준 클라이언트 소프트웨어가 바로 Certbot이다. 우분투 환경에서는 안정적인 의존성 관리를 위해 Snap 패키지 매니저를 활용하여 Certbot을 배포하는 것을 공식적으로 권장한다.

최고 관리자 권한(sudo)을 사용하여 시스템의 Snap 코어를 최신 상태로 갱신한 후, Certbot 패키지를 시스템에 격리 설치한다.

Bash

sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot

시스템 설치가 완료되면, 운영체제의 어느 경로에서든 certbot 명령어를 전역 변수로 즉각 호출할 수 있도록 시스템 바이너리 경로에 심볼릭 링크(Symbolic Link)를 생성한다.

Bash

sudo ln -s /snap/bin/certbot /usr/bin/certbot

3. Nginx 웹 서버 SSL 인증서 정식 발급 절차

Certbot은 Nginx 전용 플러그인을 기본적으로 내장하고 있으므로, 복잡한 인증 절차나 수동 설정 없이 단일 명령어로 SSL 발급과 웹 서버 환경 설정(HTTPS 리다이렉션 구성 등)을 동시에 수행할 수 있다.

다음 명령어를 실행하여 도메인 소유권 검증 및 암호화 키 교환 프로세스를 초기화한다.

Bash

sudo certbot --nginx

명령어 실행 시 터미널 화면에 출력되는 대화형 프롬프트 절차에 따라 다음 정보를 순차적으로 기입한다.

  1. 긴급 보안 공지 및 인증서 만료 알림을 수신할 시스템 관리자의 유효한 이메일 주소 입력
  2. Let’s Encrypt 서비스 이용 약관(Terms of Service) 동의 (Y 입력)
  3. 전자민주주의 재단(EFF)의 뉴스레터 수신 여부 선택 (선택 사항)
  4. Nginx 설정 파일에 정상적으로 등록된 도메인 목록이 출력되면, 인증서를 적용할 도메인의 지정 번호를 입력 (다중 도메인일 경우 공백으로 구분하거나 전체 적용 시 엔터)

모든 검증 과정을 통과하면 Certbot이 Let’s Encrypt 서버와 통신하여 챌린지 인증을 완료하고, Nginx 서버 블록을 자동으로 수정하여 HTTPS 암호화 환경을 시스템에 즉시 구축한다.

4. Nginx 설정 상태 검증 및 보안 프로토콜 최적화

Certbot에 의해 SSL 발급이 완료되면, 클라이언트가 기존의 비보안 프로토콜인 HTTP(80 포트)로 접속하더라도 자동으로 보안 채널인 HTTPS(443 포트)로 우회 연결(리다이렉션)되도록 Nginx 설정 파일이 재구성된다.

변경된 Nginx 설정 파일의 문법적 무결성을 검증하기 위해 시스템 자체 테스트 명령어를 실행한다.

Bash

sudo nginx -t

터미널 출력 결과에 syntax is oktest is successful 메시지가 정상 반환되면, Nginx 데몬을 재로드하여 변경된 SSL 암호화 설정을 시스템 트래픽에 정식으로 반영한다.

Bash

sudo systemctl reload nginx

이후 웹 브라우저 주소창에 https://본인도메인을 입력하여 웹 서버에 접속한 뒤, URL 입력창 좌측에 표시되는 자물쇠 아이콘을 클릭하여 Let’s Encrypt 인증서의 유효성을 최종 점검한다.

5. 인증서 영구 유지를 위한 자동 갱신(Auto-Renewal) 시스템 구축

Let’s Encrypt를 통해 발급된 무료 SSL 인증서의 유효 기간은 보안상의 이유로 90일로 제한되어 있다. 따라서 웹 서비스의 예기치 않은 중단을 방지하기 위해 인증서 만료일 30일 전부터 이를 자동으로 갱신하는 스케줄링 시스템 구축이 필수적이다.

우분투 시스템에 배포된 Certbot 패키지는 시스템 데몬(Systemd Timer)에 자동 갱신 스케줄러를 기본적으로 포함하여 동작한다. 자동 갱신 타이머 데몬이 시스템 백그라운드에서 정상적으로 가동 중인지 상태를 확인한다.

Bash

sudo systemctl status certbot.timer

시스템 타이머가 정상 동작 중임을 확인했다면, 실제 인증서 갱신 도래 시점에 통신 오류나 권한 문제가 발생하지 않는지 검증하기 위해 모의 실행(Dry Run) 테스트를 강제로 진행한다. 이는 실제 인증서를 조기 발급받지 않고 시스템의 논리적 오류 유무만을 판단하는 안전한 테스트 기법이다.

Bash

sudo certbot renew --dry-run

실행 후 터미널 출력 로그의 마지막 라인에 Congratulations, all simulated renewals succeeded라는 성공 메시지가 반환된다면, SSL 인증서 갱신 스케줄링 및 Nginx 데몬 재기동 자동화 프로세스가 완벽하게 인프라에 통합된 것이다.

마무리

이로써 웹 서버와 클라이언트 간의 송수신 패킷을 암호화하는 강력한 규격인 HTTPS 웹 환경 구축이 완료되었다. 방화벽 설정, 침입 차단 시스템(Fail2ban)에 이어 통신 암호화까지 적용함으로써 외부 트래픽에 대한 견고한 시스템 보호 체계를 갖추게 되었다.

다음 포스팅에서는 서버 내부 통제 인프라의 마침표를 찍는 [안전한 서버 관리를 위한 sudo 사용자 추가 및 Root 로그인 차단 방법]에 대해 상세히 다루어, 악의적인 권한 탈취 시도를 원천적으로 무력화하는 절차를 진행하겠다.

Similar Posts

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다