SSL 인증서 발급 및 갱신(with Let's Encrypt)

cdwde·2022년 10월 15일
3
post-thumbnail

예전에 했던 프로젝트에서 1년이 지나 인증서 만료로 갱신해야 한다고 하는데 다른 분이 하셔서 잘 모른다😭
이참에 아예 확실하게 알아두자..

Ubuntu 20.04 운영체제에서 웹서버로 Nginx 사용 시 무료 SSL 인증서로 있는 Let's Encrypt SSL 인증서 발급 및 갱신하는 방법에 대해 알아보자.

  • 찾아보니 운영중인 사이트에서는 letsencrypt를 사용하지 말라는 글(Let’s Encrypt SSL 사용 멈춰! (인증서 오류해결))을 봤다!! 오래된 기기에서는 Let's Encrypt 미지원이 될 수도 있다고 한다. 그래서 다른 상용 SSL을 알아보는게 중요하다고 한다.

그래서 두 번째로 AWS에서 ACM 발급 후 적용 방법에 대해 알아보자.
이건 다른 글에서..

✅ Let's Encrypt?

인증서 발급 기관, CA(Certificate Authority) 업체 중 하나이다. 아래와 같은 장점을 가지고 있다.

  • 인증 절차가 단순해 단 한 줄 명령어로 발급 가능
  • 발급 대기 시간 없이 바로 발급
  • Nginx나 아파치와 같은 웹서버에 맞추어 자동 옵션 설정되도록 설치 가능
  • 인증 유효기간은 90일이지만 인증을 자동화 가능
  • 무료!!!

✅ Let's Encrypt SSL 인증서 발급

인증서 설치 위한 Certbot tool 설치

Let's Encrypt SSL 인증서 발급은 Cerbot을 이용한다. Certbot은 ubuntu 20.04를 설치 후 letsencrypt를 설치했다면 그 안에 포함되어 있기 때문에 별도로 Cerbot을 설치할 필요는 없다.

sudo apt update
sudo apt-get install letsencrypt -y

인증서 발급 방법 4가지

Let's Encrypt SSL 인증서 발급 방법은 webroot, 웹서버, Standalone, DNS 방식이 있다. 인증서 발급은 사이트 인증기관인 Let's Encrypt에 접속해 이 사이트의 유효성을 검증하는 과정을 거친다.

  • webroot: 사이트 디렉토리 내에 인증서 유효성을 확인할 수 있는 파일을 업로드하여 인증서를 발급하는 방법이다. nginx를 중단시킬 필요가 없지만, 인증 명령에 하나의 도메인 인증서만 발급 가능하다는게 단점이다.
  • 웹서버: 웹서버에서 직접 SSL 인증을 실히사고 웹서버에 맞는 SSL 세팅 값을 부여하는 방법이다. 발급이나 갱신을 위해 웹서버를 중단시킬 필요가 없고 갱신 시 상황에 맞게 세팅을 자동으로 업데이트한다.
  • Standalone: 사이트 작동을 멈추고 이 사이트 네트워킹을 이용해 사이트 유효성을 확인해 Let's Encrypt SSL 인증서를 발급하는 방법이다. 80포트로 가상 standalone 웹서버를 띄워 인증서를 발급하며 동시에 여러 도메인을 발급 받을 수 있다.
  • DNS: 도메인을 쿼리해 확인되는 TXT 레코드로 사이트 유효성을 확인하는 방법이다.

그 중 웹서버를 통한 SSL 인증서 발급을 알아봅시다.

웹서버(nginx)를 통한 SSL 인증서 발급

서버에서 SSL 인증서를 설치할 웹서버용 인증서 설치 툴인 Certbot을 설치한다.
(위에서 letsencrypt 설치하면 별도로 필요 없다고 했는데 필요한건지..?)

$sudo apt install certbot python3-certbot-nginx

nginx 설정 확인

nginx 설정에서 도메인이 제대로 설정되어 있는지 확인한다.
nginx 설정 파일은 웹서버 설치 방식에 따라 달라지지만 nginx 기본 설치 방식으로는 설치 시 /etc/nginx/conf.d에 있고, 우분투에서 권장하는 방식으로 설치 시 /etc/nginx/sites-avaliable/에 존재한다.

나는 후자로 설치했기에 /etc/nginx/sites-avaliable/<도메인_이름.conf>라는 파일을 만들어 설정 내용을 넣었다. 여기에서 server_name이 등록되어 있는지만 확인하면 된다.

server_name example.com dev.example.com

SSL 인증 시작 전 nginx가 제대로 작동하는지 확인을 위해 테스트를 해본다.

$sudo nginx -t

문제가 없다면 nginx를 restart 시켜준다.

$sudo service nginx restart

방화벽에서 HTTPS를 허용

아마 기본적으로 설정이 되어있겠지만 80포트와 443포트를 허용해주고 있는지 확인한다.

$sudo ufw status

ubuntu 20.04라면 기본 방화벽으로 ufw를 사용하고 있을 것이다. Nginx Full옵션을 사용한다.

$sudo ufw allow ssh
$sudo ufw allow 'Nginx Full'

그냥 iptables를 사용한다면 이렇게 사용해도 된다.

$sudo iptables -A INPUT -p tcp -dport 80 -j ACCEPT
$sudo iptables -A INPUT -p tcp -dport 443 -j ACCEPT

SSL 인증서 발급

$sudo certbot --nginx -d example.com -d dev.example.com

제대로 발급 되었다면 요렇게 나올 예정이다.

Output
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/example.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/example.com/privkey.pem
   Your cert will expire on 2020-08-18. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

nginx 설정

server {
  listen[::]:443 ssl;
  listen 443 ssl default_server;
  root /home/ubuntu;
  index index.html index.htm index.nginx-debian.html;
  server_name example.com;	#지정한 서버인증서에 포함된 도메인
  ssl_certificate /<경로>/fullchain.pem;	#인증서 파일 경로
  ssl_certificate_key /<경로>/privatekey.key;	#개인키 파일 지정
  ssl_prefer_server_ciphers on; #SSL-TLS 협상 과정에서 서버에 설정한 암호 알고리즘을 우선으로 하며 off의 경우 알고리즘을 악화시켜서 공격할 수 있기에 on으로 설정
  
  ...
}

server {
  listen[::]:443 ssl;
  liten 443;
  server_name dev.example.com;
  root /home/ubuntu/dev;
  index index.html index.htm index.nginx-debian.html;
  server_name dev.example.com;
  ssl_certificate /<경로>/fullchain.com.pem;	#인증서 파일 경로
  ssl_certificate_key /<경로>/privatekey.com.key;	#개인키 파일 지정
  ssl_prefer_server_ciphers on; #SSL-TLS 협상 과정에서 서버에 설정한 암호 알고리즘을 우선으로 하며 off의 경우 알고리즘을 악화시켜서 공격할 수 있기에 on으로 설정
  
  ...
}

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

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

자동 갱신

자동 갱신은 크론에서 다음 명령어를 적용해 가능하도록 만들 수 있다.

$sudo certbot renew --dry-run

참고
최신 Let’s Encrypt SSL 인증서 발급 방법 4가지 정리
How To Secure Nginx with Let's Encrypt on Ubuntu 20.04

0개의 댓글