Let's Encrypt 인증서 발급 완벽 가이드: 무료로 HTTPS 적용하기

인터넷 보안이 점점 더 중요해지는 요즘, 웹사이트에 HTTPS를 적용하는 것은 선택이 아닌 필수가 되었습니다. Let's Encrypt는 무료로 SSL/TLS 인증서를 발급받을 수 있는 인증 기관으로, 누구나 쉽게 자신의 웹사이트에 보안을 적용할 수 있게 해줍니다. 이 글에서는 Let's Encrypt 인증서 발급부터 적용, 자동 갱신까지 상세하게 알아보겠습니다.

Let's Encrypt란?

Let's Encrypt는 2016년부터 운영된 비영리 인증 기관(Certificate Authority, CA)으로, 웹사이트의 HTTPS 암호화를 위한 TLS/SSL 인증서를 무료로 제공합니다. 이 프로젝트는 인터넷 보안 연구 그룹(ISRG)에서 주도하고 있으며, Mozilla, Cisco, Akamai, Chrome, IdenTrust 등 주요 기술 기업들이 후원하고 있습니다.

Let's Encrypt의 주요 특징

  • 무료: 모든 인증서가 무료로 제공됩니다.
  • 자동화: 인증서 발급, 설치, 갱신 과정을 자동화할 수 있습니다.
  • 개방성: 오픈 표준을 기반으로 하며 소스 코드가 공개되어 있습니다.
  • 보안: 웹 PKI(Public Key Infrastructure) 보안 모범 사례를 준수합니다.
  • 투명성: 모든 인증서가 공개적으로 기록되고 검증 가능합니다.
  • 유효기간: 발급된 인증서는 90일간 유효하며, 만료 전 갱신이 필요합니다.

사전 준비 사항

Let's Encrypt 인증서를 발급받기 전에 다음 사항들을 확인해주세요:

  1. 도메인 소유: 인증서를 발급받을 도메인의 소유권이 있어야 합니다.
  2. 웹 서버 접근 권한: 웹 서버의 설정을 변경할 수 있는 권한이 필요합니다.
  3. 서버 환경: SSH 접속이 가능한 Linux/Unix 환경의 서버가 이상적입니다.
  4. 포트 접근성: 80번(HTTP) 또는 443번(HTTPS) 포트가 외부에서 접근 가능해야 합니다.

Certbot 설치하기

Certbot은 Let's Encrypt 인증서를 자동으로 발급받고 갱신할 수 있게 도와주는 클라이언트 도구입니다. 다양한 운영체제와 웹 서버에 맞는 설치 방법을 알아보겠습니다.

Ubuntu/Debian 시스템

# 저장소 업데이트
sudo apt-get update

# Certbot 설치
sudo apt-get install certbot

# 웹 서버별 추가 플러그인 설치 (선택사항)
# Apache 사용 시
sudo apt-get install python3-certbot-apache

# Nginx 사용 시
sudo apt-get install python3-certbot-nginx

CentOS/RHEL 시스템

# EPEL 저장소 설치 (없는 경우)
sudo yum install epel-release

# Certbot 설치
sudo yum install certbot

# 웹 서버별 추가 플러그인 설치 (선택사항)
# Apache 사용 시
sudo yum install python3-certbot-apache

# Nginx 사용 시
sudo yum install python3-certbot-nginx

macOS

# Homebrew를 통한 설치
brew install certbot

Windows

Windows의 경우, 직접적인 Certbot 설치 방법은 제한적입니다. 대신 다음 방법을 사용할 수 있습니다:

  1. Certify The Web - 윈도우용 GUI 클라이언트
  2. Win-ACME - 윈도우용 명령줄 클라이언트
  3. WSL(Windows Subsystem for Linux)을 통한 Linux 환경에서 Certbot 사용

인증서 발급 방법

Certbot을 사용한 인증서 발급 방법은 크게 세 가지로 나눌 수 있습니다.

1. 웹 서버 플러그인 사용 (자동 설정)

이 방법은 가장 쉬운 방법으로, Certbot이 웹 서버 설정까지 자동으로 처리해줍니다.

Apache 웹 서버

sudo certbot --apache -d example.com -d www.example.com

Nginx 웹 서버

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

2. Standalone 모드 사용

웹 서버가 없거나 특정 웹 서버 플러그인을 사용할 수 없는 경우, Certbot은 임시 웹 서버를 생성하여 인증 과정을 진행할 수 있습니다.

# 80번 포트 사용 (다른 웹 서버가 실행 중이면 임시로 중지해야 함)
sudo certbot certonly --standalone -d example.com -d www.example.com

3. Webroot 모드 사용

이미 실행 중인 웹 서버의 웹 루트 디렉토리를 사용하여 인증합니다. 웹 서버를 중지하지 않고도 인증서를 발급받을 수 있습니다.

sudo certbot certonly --webroot -w /var/www/html -d example.com -d www.example.com

도메인 인증 방식

Let's Encrypt는 도메인 소유권을 확인하기 위해 ACME(Automated Certificate Management Environment) 프로토콜을 사용합니다. 주요 인증 방식은 다음과 같습니다:

1. HTTP-01 챌린지 (기본 방식)

웹 서버의 특정 URL에 임시 파일을 생성하여 도메인 제어 권한을 확인합니다. 80번 포트에 접근할 수 있어야 합니다.

2. DNS-01 챌린지

DNS TXT 레코드를 추가하여 도메인 제어 권한을 확인합니다. 와일드카드 인증서 발급이나 80/443 포트에 접근할 수 없는, 혹은 내부망에서만 접근 가능한 서버에 유용합니다.

sudo certbot certonly --manual --preferred-challenges dns -d example.com -d *.example.com

이 명령을 실행하면 Certbot은 생성해야 할 TXT 레코드 정보를 제공합니다. DNS 관리 페이지에서 해당 TXT 레코드를 추가한 후 계속 진행하면 인증서가 발급됩니다.

인증서 파일 위치 및 구성

성공적으로 인증서를 발급받으면 다음 파일들이 생성됩니다 (기본 위치: /etc/letsencrypt/live/도메인명/):

  • privkey.pem: 개인 키 (절대 공개되면 안 됨)
  • cert.pem: 도메인 인증서
  • chain.pem: 중간 인증서(들)
  • fullchain.pem: cert.pem과 chain.pem이 결합된 파일 (대부분의 웹 서버에서 사용)

웹 서버 설정하기

Apache 설정

Certbot의 Apache 플러그인을 사용했다면 자동으로 설정이 완료됩니다. 수동으로 설정하려면 다음과 같이 합니다:

    ServerName example.com
    ServerAlias www.example.com
    
    DocumentRoot /var/www/html
    
    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
    
    # 또는 한 번에:
    # SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
    # SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
    
    # 추가 설정...


# HTTP에서 HTTPS로 리다이렉션

    ServerName example.com
    ServerAlias www.example.com
    Redirect permanent / https://example.com/

설정 후 Apache를 재시작합니다:

sudo systemctl reload apache2
# 또는
sudo service apache2 reload

Nginx 설정

Certbot의 Nginx 플러그인을 사용했다면 자동으로 설정이 완료됩니다. 수동으로 설정하려면 다음과 같이 합니다:

server {
    listen 443 ssl;
    server_name example.com www.example.com;
    
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    
    # 강화된 보안 설정 (권장)
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    
    # 추가 설정...
    
    # 웹 루트 디렉토리
    root /var/www/html;
    index index.html;
}

# HTTP에서 HTTPS로 리다이렉션
server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

설정 후 Nginx를 재시작합니다:

sudo systemctl reload nginx
# 또는
sudo service nginx reload

인증서 자동 갱신 설정

Let's Encrypt 인증서는 90일마다 만료되므로 정기적인 갱신이 필요합니다. Certbot은 자동 갱신 기능을 제공합니다.

갱신 테스트

먼저 인증서 갱신이 정상적으로 작동하는지 테스트해보세요:

sudo certbot renew --dry-run

자동 갱신 설정 (cron)

대부분의 Linux 배포판에서는 Certbot 설치 시 자동으로 cron 작업이나 systemd 타이머가 설정됩니다. 수동으로 설정하려면 다음과 같이 합니다:

# crontab 편집
sudo crontab -e

다음 라인을 추가하여 매일 두 번 갱신을 시도하도록 설정합니다 (실제 만료되기 전에만 갱신됨):

0 3,15 * * * certbot renew --quiet --post-hook "systemctl reload nginx"

자동 갱신 설정 (systemd)

systemd를 사용하는 최신 Linux 배포판에서는 타이머를 사용할 수 있습니다:

# systemd 타이머 상태 확인
systemctl status certbot.timer

만약 타이머가 설정되어 있지 않다면, 다음과 같이 생성할 수 있습니다:

  1. /etc/systemd/system/certbot.service 파일 생성:
[Unit]
Description=Certbot renewal service

[Service]
Type=oneshot
ExecStart=/usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx"
  1. /etc/systemd/system/certbot.timer 파일 생성:
[Unit]
Description=Timer for Certbot renewal

[Timer]
OnCalendar=*-*-* 00,12:00:00
RandomizedDelaySec=43200
Persistent=true

[Install]
WantedBy=timers.target
  1. 타이머 활성화:
sudo systemctl daemon-reload
sudo systemctl enable --now certbot.timer

와일드카드 인증서 발급하기

와일드카드 인증서(*.example.com)는 모든 서브도메인에 대해 유효한 인증서로, DNS-01 챌린지 방식으로만 발급 가능합니다.

수동 방식

sudo certbot certonly --manual --preferred-challenges dns -d example.com -d *.example.com

이 명령어를 실행하면, Certbot이 DNS TXT 레코드를 생성하라는 안내를 제공합니다. 도메인 DNS 관리 페이지에서 TXT 레코드를 추가한 후 계속 진행하면 인증서가 발급됩니다.

DNS 플러그인 사용 (자동화)

Certbot은 여러 DNS 제공업체에 대한 플러그인을 지원합니다:

# 예: Cloudflare DNS 플러그인 설치
sudo apt-get install python3-certbot-dns-cloudflare

# 와일드카드 인증서 발급
sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials ~/.secrets/certbot/cloudflare.ini -d example.com -d *.example.com

cloudflare.ini 파일은 다음과 같이 구성합니다:

# ~/.secrets/certbot/cloudflare.ini
dns_cloudflare_email = your-email@example.com
dns_cloudflare_api_key = your-api-key

보안을 위해 파일 권한을 제한합니다:

chmod 600 ~/.secrets/certbot/cloudflare.ini

주요 DNS 플러그인 목록

Certbot은 다음 주요 DNS 제공업체에 대한 플러그인을 제공합니다:

  • Cloudflare: python3-certbot-dns-cloudflare
  • Amazon Route 53: python3-certbot-dns-route53
  • Google Cloud DNS: python3-certbot-dns-google
  • DigitalOcean: python3-certbot-dns-digitalocean
  • Namecheap: python3-certbot-dns-namecheap
  • 그 외 다수

문제 해결 가이드

1. 인증 실패 - HTTP-01 챌린지

문제: .well-known/acme-challenge/ 경로에 접근할 수 없음

해결 방법:

  • 웹 서버가 실행 중인지 확인
  • 80번 포트가 열려 있는지 확인
  • 방화벽 설정 확인
  • .well-known 디렉토리에 대한 접근이 차단되지 않았는지 확인

2. 인증 실패 - DNS-01 챌린지

문제: DNS TXT 레코드가 적용되지 않음

해결 방법:

  • DNS 레코드 변경 후 충분한 시간(최대 1시간) 대기
  • 정확한 TXT 레코드 이름과 값이 설정되었는지 확인
  • dig 또는 nslookup 명령어로 DNS 전파 확인:
    dig _acme-challenge.example.com TXT
    

3. 권한 문제

문제: 인증서 파일에 접근할 수 없음

해결 방법:

  • /etc/letsencrypt/ 디렉토리의 권한 확인
  • 웹 서버가 인증서 파일에 접근할 수 있는지 확인
  • SELinux가 활성화된 경우, 컨텍스트 설정 확인

4. 갱신 실패

문제: 자동 갱신이 작동하지 않음

해결 방법:

  • cron 또는 systemd 타이머 설정 확인
  • 수동으로 갱신 테스트:
    sudo certbot renew --dry-run
    
  • Certbot 로그 확인:
    cat /var/log/letsencrypt/letsencrypt.log
    

고급 기능 및 팁

1. 여러 도메인에 대한 인증서 발급

하나의 인증서로 최대 100개의 도메인을 보호할 수 있습니다:

sudo certbot certonly --webroot -w /var/www/html \
  -d example.com -d www.example.com -d blog.example.com -d shop.example.com

2. 인증서 갱신 시 훅(Hook) 스크립트 실행

인증서 갱신 전/후에 특정 스크립트를 실행할 수 있습니다:

sudo certbot renew --pre-hook "service nginx stop" --post-hook "service nginx start"

3. Let's Debug 도구 사용

인증서 발급 문제를 진단하려면 Let's Debug 도구를 이용할 수 있습니다.

4. 속도 제한 및 스테이징 환경

Let's Encrypt는 오용 방지를 위해 속도 제한을 두고 있습니다. 테스트 목적으로는 스테이징 환경을 사용하세요:

sudo certbot --staging ...

스테이징 환경에서 발급한 인증서는 브라우저에서 신뢰하지 않지만, 실제 발급 과정을 테스트할 수 있습니다.

결론

Let's Encrypt는 무료로 SSL/TLS 인증서를 제공하여 웹사이트의 보안을 강화하는 훌륭한 도구입니다. Certbot을 사용하면 인증서 발급부터 갱신까지 모든 과정을 자동화할 수 있어 관리 부담이 크게 줄어듭니다.

이 가이드를 통해 Let's Encrypt 인증서 발급 과정을 성공적으로 완료하고, 웹사이트에 HTTPS를 적용하여 사용자들에게 더 안전한 환경을 제공하시기 바랍니다. 보안은 모든 웹사이트의 기본이며, Let's Encrypt는 그 첫걸음을 누구나 쉽게 시작할 수 있게 해줍니다.

#HTTPS #SSL #TLS #인증서 #웹보안 #LetsEncrypt #Certbot #무료인증서 #도메인인증 #와일드카드인증서 #웹서버설정 #자동갱신 #보안설정 #ACME

+ Recent posts