인프라

[Nginx] SSL/TLS 인증서 설정하기

하루이2222 2025. 5. 23. 02:27

Nginx에 Certbot을 이용한 HTTPS/SSL 설정 가이드

이 문서는 Nginx 웹 서버에 Let's Encrypt의 SSL 인증서를 발급받아 HTTPS 프로토콜을 적용하는 전체 과정을 기술함. 인증서 발급 자동화 도구인 Certbot을 사용하여 설치부터 자동 갱신 설정까지 다룸.


1. Certbot 설치 및 SSL 인증서 발급

가장 먼저 SSL 인증서의 발급과 관리를 자동화하는 Certbot을 설치해야 함. Certbot은 Let's Encrypt 인증서를 간단한 명령어로 발급받고, 웹 서버 설정까지 자동으로 처리하는 효율적인 도구임.

1.1. Certbot 설치

Ubuntu 운영체제를 기준으로, 패키지 목록을 최신화하고 certbot과 Nginx 연동 플러그인을 함께 설치했음.

sudo apt update
sudo apt install certbot python3-certbot-nginx

1.2. SSL 인증서 발급

Nginx 플러그인을 사용하여 SSL 인증서를 발급받음. -d 옵션으로 인증서를 적용할 도메인 이름을 지정했으며, www 서브도메인과 루트 도메인을 모두 포함하는 것이 일반적임.

sudo certbot --nginx -d ohmolli.com -d www.ohmolli.com

Certbot 실행 과정에서 이메일 주소 입력, 서비스 약관 동의 등을 진행함. 성공적으로 완료되면, 인증서 파일(fullchain.pem)과 개인 키 파일(privkey.pem)이 /etc/letsencrypt/live/ohmolli.com/ 경로에 저장됨. 또한, Certbot은 인증서 자동 갱신을 위한 시스템 설정을 추가함.

※ Certbot의 -d 옵션과 도메인 인증 원리

Certbot이 -d 옵션으로 지정된 도메인의 소유권을 확인하는 과정은 ACME(Automated Certificate Management Environment) 프로토콜을 따름. certbot --nginx 명령어는 주로 HTTP-01 인증 방식을 사용하며, 그 원리는 다음과 같음.

  1. 인증 요청: Certbot 클라이언트가 Let's Encrypt 서버에 ohmolli.com 도메인의 인증서 발급을 요청함.
  2. 챌린지(Challenge) 부여: Let's Encrypt 서버는 "정말로 ohmolli.com을 제어하는지 증명하라"는 의미로, 특정 토큰 값을 제시하며 "이 토큰을 http://ohmolli.com/.well-known/acme-challenge/<토큰 파일명> 경로에 임시로 게시하라"고 요구함.
  3. 임시 검증 환경 구성: certbot --nginx 플러그인은 Nginx 설정을 일시적으로 수정하여, 위 경로로 들어오는 요청에 대해 Let's Encrypt가 부여한 토큰 값을 응답하도록 웹 서버를 설정함.
  4. 소유권 검증: Let's Encrypt 서버는 실제로 해당 URL에 HTTP 요청을 보내, 약속된 토큰 값이 올바르게 응답되는지 확인함.
  5. 인증서 발급: 검증에 성공하면 Let's Encrypt는 해당 도메인에 대한 SSL 인증서를 발급함. Certbot은 발급받은 인증서를 서버에 저장하고, Nginx 설정에 영구적으로 적용한 뒤 임시 변경사항을 정리함.

이 모든 과정이 자동으로 처리되므로 사용자는 간단한 명령만으로 도메인 소유권을 증명하고 인증서를 발급받을 수 있음.


2. Nginx에 SSL 설정 적용

발급된 인증서를 Nginx가 사용해 HTTPS 요청을 처리하도록 설정 파일을 수정함.

2.1. SSL 인증서 및 키 경로 설정

Nginx 설정 파일(예: /etc/nginx/sites-available/default)을 열고, HTTPS 요청을 처리할 server 블록 내에 인증서와 키 파일 경로를 지정했음.

server {
    # ... 기타 설정 ...

    listen 443 ssl; # HTTPS 기본 포트
    server_name ohmolli.com www.ohmolli.com;

    # SSL 인증서 경로 설정
    ssl_certificate /etc/letsencrypt/live/ohmolli.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ohmolli.com/privkey.pem;

    # ... 이하 설정 ...
}

2.2. 보안 강화: SSL 프로토콜과 암호화 방식 설정

오래된 프로토콜(SSLv3, TLSv1.0, TLSv1.1)의 취약점을 피하기 위해, 보안성이 높은 TLSv1.2TLSv1.3만 사용하도록 프로토콜을 제한하고, 안전한 암호화 방식(Cipher)을 설정했음.

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;

2.3. HTTP에서 HTTPS로 자동 리디렉션

HTTP(80번 포트)로 접속하는 모든 사용자를 보안 연결인 HTTPS로 자동 전환시키기 위해 리디렉션 설정을 추가함.

server {
    listen 80;
    server_name ohmolli.com www.ohmolli.com;

    # $host 변수를 사용하여 현재 요청된 도메인으로 리디렉션
    return 301 https://$host$request_uri;
}

2.4. 리버스 프록시 환경에서 SSL 설정

Nginx를 리버스 프록시로 사용하는 경우, 각 내부 서비스로 요청을 전달하는 server 블록에도 동일하게 SSL 설정을 적용함.

예시: 프론트엔드 서버 (5173 포트)

server {
    listen 5173 ssl;
    listen [::]:5173 ssl ipv6only=on;

    server_name ohmolli.com www.ohmolli.com;

    # SSL 인증서 및 보안 설정
    ssl_certificate /etc/letsencrypt/live/ohmolli.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ohmolli.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    location / {
        # 내부 프론트엔드 서버로 요청 전달
        proxy_pass http://mind_in_canvas;
        proxy_set_header Host $host;
        # ... 기타 프록시 헤더 설정 ...
    }
}

예시: 백엔드 서버 (9100 포트)

server {
    listen 9100 ssl;
    listen [::]:9100 ssl ipv6only=on;

    server_name ohmolli.com www.ohmolli.com;

    # SSL 인증서 및 보안 설정
    ssl_certificate /etc/letsencrypt/live/ohmolli.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ohmolli.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    location / {
        # 내부 백엔드 서버로 요청 전달
        proxy_pass http://ohmolli_backend;
        proxy_set_header Host $host;
        # ... 기타 프록시 헤더 설정 ...
    }
}

3. SSL 인증서 자동 갱신 설정 확인

Let's Encrypt 인증서의 유효 기간은 90일이므로 주기적인 갱신이 필수적임. Certbot은 설치 시 시스템의 Cron(etc/cron.d/certbot)을 통해 이 과정을 자동으로 처리하도록 설정함.

자동 갱신이 정상적으로 동작하는지 아래 명령어로 시뮬레이션(dry-run)하여 테스트했음.

sudo certbot renew --dry-run

"Congratulations, all renewals for this simulated run succeeded."와 같은 메시지가 출력되면 자동 갱신 설정이 정상적으로 완료된 것임.


4. Nginx 재시작하여 설정 적용

모든 설정을 완료한 후, 변경된 내용을 시스템에 반영하기 위해 Nginx 서비스를 재시작했음.

sudo systemctl restart nginx

이후 https://ohmolli.com으로 접속 시, 브라우저 주소창에 자물쇠 아이콘이 표시되며 암호화된 통신이 정상적으로 이루어지는 것을 확인.