본문 바로가기
IT이야기

Certbot을 사용하여 Ubuntu에서 Nginx로 HTTPS 활성화하기

by ◖♪♩♫◗ 2023. 3. 17.
반응형

Ubuntu 22.04.2 버전에서 작업한 내용입니다.

NGINX 웹 서버와 함께 오픈 소스 Certbot 유틸리티를 사용하는 방법에 대해서 쓰도록 하겠습니다. Certbot은 HTTPS로 웹사이트를 보호하는 비용을 크게 줄입니다. 무료 Let's Encrypt 인증 기관과 직접 협력하여 인증서를 요청(또는 갱신)하고, 도메인 소유권을 증명하고, NGINX(또는 Apache)에 인증서를 설치합니다.

 

시작하기 전에 원하는 도메인을 발급 받아 HTTP를 통해 액세스 할 수 있는 웹 사이트가 필요합니다.

 

1. HTTPS, TLS, Let's Encrypt 및 Certbot 이해

HTTPS는 원래의 HTTP( Hypertext Transfer Protocol ) 표준을 기반으로 구축되어 보다 안전한 브라우징 경험을 제공합니다. 이전의 SSL( Secure Sockets Layer ) 기술을 대체하는 TLS( Transport Layer Security ) 프로토콜을 사용하여 네트워크 트래픽을 암호화합니다. HTTPS는 전송 중인 모든 데이터의 개인정보 및 무결성을 보호하고 최종 사용자를 위해 웹사이트를 인증합니다. 이러한 이유로 데이터를 처리하는 웹사이트에서는 HTTPS를 구현해야 합니다. 그러나 모든 도메인에서 HTTPS를 활성화할 것을 강력히 권장하며 현재 대부분의 모든 사이트에서 HTTPS를 사용하고 있습니다.

 

2. HTTP 암호화

웹 서버는 HTTPS 요청을 수락하기 전에 신뢰할 수 있는 인증 기관의 서명된 공개 키 인증서를 소유해야 합니다. Let's Encrypt는 이러한 기관 중 가장 널리 사용되는 기관 중 하나입니다. 웹 사이트에 기본 SSL/TLS 인증서를 배포하는 무료 자동화 서비스를 관리합니다. Let's Encrypt는 자동 인증서 관리 환경(ACME) 프로토콜을 활용하여 챌린지-응답 기술을 통해 인증서 부여 프로세스를 자동화합니다. Let 's Encrypt 사이트는 도메인 유효성 검사에 대한 보다 포괄적인 기술 세부 정보를 제공합니다.

 

3. Certbot 이란?

Certbot은 HTTPS를 활성화하여 웹 보안을 개선한다는 최종 목표로 EFF( Electronic Frontier Foundation ) 에서 개발했습니다. 대부분의 운영 체제는 물론 Apache 및 NGINX와 같은 가장 널리 사용되는 웹 서버 소프트웨어와 호환됩니다. Certbot은 Let's Encrypt와 통신하여 인증서를 요청하고, 필요한 ACME 챌린지를 수행하고, 인증서를 설치하고, 웹 서버를 구성하는 일을 합니다. 또한 인증서 갱신 프로세스를 자동으로 처리할 수도 있습니다.

 

4. Ubuntu에서 Ngnix 웹 서버로 Https 구성하기

4-1. UFW 방화벽 구성

서버에 구성된 모든 방화벽은 HTTPS를 통한 연결을 허용해야 합니다. UFW(uncomplicatedfirewall) 활성화 및 구성에 대해 설명합니다 . UFW는 Ubuntu의 기본 방화벽 관리 도구이며 Debian 및 Fedora에서도 사용할 수 있습니다. iptables의 사용하기 쉬운 프런트 엔드로 작동합니다.

다른 방화벽을 사용 중이거나 방화벽 규칙을 이미 구성했거나 방화벽을 사용하지 않으려는 경우 UFW는 넘어가도 됩니다.

4-2. UFW(UncomplicatedFirewall) 설치

$sudo apt update

$sudo apt install ufw

 

4-3. 방화벽 규칙 추가 : ssh(포트 22)와 http(포트 80) 및 https(포트 443) 트래픽 허용

  • 아래 명령으로 필요한 포트 방화벽 허용 설정
$sudo ufw allow ssh

$sudo ufw allow http

$sudo ufw allow https

 

  • UFW 사용 설정
$sudo ufw enable  => ufw 사용

$sudo ufw status   => ufw 상태 확인

 

4-4. Snap 설치

소프트웨어는 snap으로 패키징되며, snap 도구는 패키지를 관리하는 애플리케이션입니다.

certbot은 스냅으로 패키징 되므로 certbot을 설치하기 전에 snap을 설치해야 합니다.

$sudo apt update

$sudo apt install snapd

$sudo snap install core

$sudo snap refresh core

 

4-5. Certbot 설치

snap 패키지와 충돌을 방지하기 위해 이전에 설치된 certbot 패키지 제거

  • certbot 삭제
$sudo apt remove certbot

 

  • certbot 설치
$sudo snap install --classic certbot
  • certbot 디렉터리에 대한 심볼릭 링크 생성
$sudo ln -s /snap/bin/certbot /usr/bin/certbot

 

  • certbot을 사용하여 SSL 인증서 요청
$sudo certbot certonly --nginx

 

처음 실행하게 되면 이메일 주소와 도메인 이름 등 몇 가지 정보를 묻는 메시지나 나옵니다.

이메일 주소를 입력하고(웹서버 관리자 이메일 주소), 서비스 약관에 동의(Agree) 하면 A 입력, N을 입력하면 인증서 발급 종료.

선택적으로 메일링 리스트에 가입할 건지 물어보는데, 필요에 따라 응답하면 됩니다. 그다음 도메인 이름을 입력하면 되고, 인증할 도메인이 여러 개 이면, 주소와 주소 사이를 공백을 주면 됩니다.(http와 https는 입력하지 않습니다.)

 

정상적으로 발급이 되면, 발급 메시지에 /etc/letsencrypt/live/{도메인주소}fullchain.pem(success)와 privkey.pem 두 개의 키가 생성이 됩니다. 이 주소를 복사하고, /etc/nginx/sites-available/{도메인주소}.conf 내용에 두개의 키를 입력해 줍니다.

 

다음은 {도메인주소}.conf 샘플 자료이니 참고해서, 자신의 환경에 맞게 수정해서 사용하기 바랍니다.

 

아래의 샘플 conf 파일 설명: 80번 포트에 대한 설정과, 443 포트에 대한 설정이고, 마지막 항목이 redirect 하는 설정입니다. 예를 들어 mydomain.comwww.mydomain.com에 대  설정인 경우

 

#Server http://www.mydomain.com
server {
listen 80;
listen [::]:80;
server_name mydomain.com www.mydomain.com;

include /etc/nginx/snippets/letsencrypt.conf;

location / {
return 301 https://www.mydomain.com$request_uri; 
}
}

## Server https://www.mydomain.com
server {
server_name www.mydomain.com;
listen 443 ssl http2;
listen [::]:443 ssl http2;

ssl_certificate /etc/letsencrypt/live/www.mydomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.mydomain.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/www.mydomain.com/fullchain.pem;
include /etc/nginx/snippets/ssl.conf;

root /var/www/mydomain;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}

# https://mydomain.com redirects to https://www.mydomain.com
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name mydomain.com;

ssl_certificate /etc/letsencrypt/live/www.mydomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.mydomain.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/www.mydomain.com/fullchain.pem;
include /etc/nginx/snippets/ssl.conf;

location / {
return 301 https://www.mydomain.com$request_uri; 
}
}

 

환경설정이 모두 끝나면, Nginx를 다시 로드합니다.

$sudo systemctl reload nginx

 

https:// 주소가 활성화되었습니다.

 

5. CRON을 사용한 인증서 자동 갱신

Certbot으로 인정한 인증서는 3개월만 유지가 됩니다. 이후 다시 인증서를 발급받아야 하는데요.

자동 갱신하는 cron을 만들도록 하겠습니다.

 

  • 다음 명령으로 dry-run이 제대로 작동하는지 테스트.
$sudo certbot renew  --dry-run

 

  • $sudo vi /root/letsencrypt.sh 파일을 생성합니다.
#!/bin/bash
systemctl reload nginx

 

  • 실행가능하도록 권한 설정
$sudo chmod +x /root/letsencrypt.sh

 

  • Cron 편집
$sudo crontab -e
  • 아래 라인 추가
20 3 * * * certbot renw --noninteractive --renew-hook /root/letsencrypt.sh

 

이상으로 certbot을 사용하여 Ubuntu에서 Ngnix로 https 활성화하는 방법에 대해서 알아보았습니다.

반응형

댓글