AWS

Let's Encrypt를 사용한 AWS 인스턴스에 HTTPS 적용 및 설정 방법

JohnnyDeveloper 2024. 8. 8. 23:21

Let's Encrypt를 사용하여 AWS 인스턴스에 HTTPS를 설정하고 보안을 강화하는 방법에대해 설명합니다.

Let's Encrypt를 사용한 AWS 인스턴스에 HTTPS 적용 및 설정 방법

AWS(아마존 웹 서비스)에서 보안성을 강화하기 위해 HTTPS를 적용하는 것은 매우 중요합니다. HTTPS는 데이터를 암호화하여 전송하며, 이를 통해 중간에 데이터가 탈취되거나 변조되는 것을 방지할 수 있습니다. 이번 포스트에서는 무료 SSL/TLS 인증서를 제공하는 Let's Encrypt를 사용하여 AWS 인스턴스에 HTTPS를 적용하는 방법에 대해 단계별로 설명합니다.

1. HTTPS의 중요성

HTTPS는 웹사이트와 사용자 간의 통신을 암호화하여 보안을 강화합니다. 이를 통해 다음과 같은 이점을 얻을 수 있습니다:

  • 데이터 보안: 전송되는 데이터가 암호화되어 중간에서 탈취되더라도 내용을 해독할 수 없습니다.
  • 사용자 신뢰: HTTPS를 사용하면 사용자는 웹사이트의 신뢰성을 높게 평가합니다.
  • SEO 향상: 구글 등 검색 엔진은 HTTPS를 사용하는 사이트에 대해 더 높은 평가를 부여합니다.

2. Let's Encrypt 소개

Let's Encrypt는 무료로 SSL/TLS 인증서를 발급해주는 비영리 인증 기관입니다. Let's Encrypt 인증서는 자동으로 갱신되며, 보안성을 유지하는 데 매우 유용합니다. Mozilla, Akamai, Cisco 등의 스폰서가 참여하여 HTTPS 확산을 지원하고 있습니다.

3. AWS에서 Let's Encrypt를 사용한 HTTPS 설정을 위한 준비

AWS 인스턴스에 Let's Encrypt를 사용하여 HTTPS를 적용하기 위해 다음과 같은 준비가 필요합니다:

  • 도메인 이름: HTTPS를 적용할 도메인 이름이 필요합니다.
  • 서버 소프트웨어: Nginx 또는 Apache 웹 서버를 설치해야 합니다.
  • Certbot 설치: Let's Encrypt 인증서를 쉽게 발급받고 갱신할 수 있는 도구입니다.

4. Let's Encrypt 인증서 발급 및 설정

4.1. Certbot 설치

Certbot은 Let's Encrypt 인증서를 발급받고 관리하는 데 사용되는 도구입니다. 아래의 명령어를 사용하여 Certbot을 설치합니다:

Ubuntu/Debian

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

CentOS/RHEL

sudo yum install epel-release
sudo yum install certbot python-certbot-nginx

4.2. standalone 모드를 사용한 인증서 발급

standalone 모드는 웹 서버를 중지한 상태에서 Certbot이 자체 웹 서버를 실행하여 인증을 수행하는 방식입니다.

sudo systemctl stop nginx
sudo certbot certonly --standalone -d example.com -d www.example.com
sudo systemctl start nginx

 

인증서 발급 후, Nginx 설정 파일을 수정하여 HTTPS를 적용합니다:

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

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_ciphers HIGH:!aNULL:!MD5;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

 

설정을 저장한 후, Nginx를 다시 시작합니다:

sudo nginx -t
sudo systemctl restart nginx

4.3. Webroot 방식을 사용한 인증서 발급

Webroot 방식은 기존 웹 서버를 중단하지 않고 인증서를 발급받을 수 있는 방법입니다.

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

 

인증서 발급 후, Nginx 설정 파일을 수정하여 HTTPS를 적용합니다: (위와 동일)

설정을 저장한 후, Nginx를 다시 시작합니다:

4.4. DNS 인증을 통한 인증서 발급

DNS 인증은 도메인의 DNS 설정에 TXT 레코드를 추가하여 인증을 수행하는 방식입니다. 이 방법은 와일드카드 인증서를 발급할 때 유용합니다.

DNS 인증을 통한 인증서 발급

Certbot을 사용하여 DNS 인증을 수행합니다:

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

 

명령어를 실행하면 Certbot이 DNS TXT 레코드를 생성하라는 메시지를 표시합니다. 도메인 등록기관에서 DNS TXT 레코드를 추가하고 인증을 완료합니다.

Nginx 설정 업데이트

DNS 인증을 통해 발급된 인증서를 Nginx 설정에 추가합니다:

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

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_ciphers HIGH:!aNULL:!MD5;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

 

설정을 저장한 후, Nginx를 다시 시작합니다: (위와 동일)


5. 인증서 자동 갱신 설정

Let's Encrypt 인증서는 90일 동안 유효하므로, 인증서를 자동으로 갱신하도록 설정해야 합니다. Certbot은 이를 자동으로 처리할 수 있습니다.

5.1. Crontab에 갱신 작업 추가

Crontab을 사용하여 Certbot 갱신 작업을 추가합니다:

sudo crontab -e

 

다음 줄을 추가하여 매일 두 번 Certbot이 인증서를 갱신하도록 설정합니다:

0 0,12 * * * /usr/bin/certbot renew --quiet

6. Route 53을 사용한 DNS 설정

Route 53을 사용하여 도메인 이름을 설정한 후, HTTPS 트래픽을 AWS 인스턴스로 라우팅합니다.

6.1. Route 53에서 호스팅 영역 생성

  1. Route 53 콘솔로 이동하여 호스팅 영역을 생성합니다.
  2. 도메인 이름을 입력하고, 호스팅 영역을 생성합니다.

6 .2. 레코드 설정

  1. "레코드 생성"을 클릭합니다.
  2. 레코드 이름, 유형(A 또는 CNAME), 트래픽 라우팅 정책을 설정합니다.
  3. EC2 인스턴스를 트래픽 라우팅 대상으로 선택합니다.

 

AWS 인스턴스에 Let's Encrypt를 사용하여 HTTPS를 적용하는 것은 웹사이트의 보안을 강화하고 사용자 신뢰를 높이는 중요한 작업입니다. 본 포스트에서는 Certbot을 통해 SSL/TLS 인증서를 발급받고 Nginx를 설정하여 HTTPS를 적용하는 방법에 대해 설명하였습니다. standalone 모드, webroot 방식, DNS 인증 방식을 모두 필요에 따라 적절한 방법을 선택하여 적용할 수 있습니다.