Let’s Encrypt SSL 인증서 발급 방법 3가지

| Updated

여기에서는 우분투 20.04운영체제에서 웹서로로 NGINX를 사용 시 무료 SSL 인증서로 인기있는 Let’s Encrypt SSL 인증서 발급 방법 전반에 대해서 살펴보도록 하겠습니다.

Let’s Encrypt SSL 인증서는 아래와 같은 장점들이 있어 사용이 확대되고 있습니다.

  • 인증 절차가 단순(서버에서 필요한 프로그앰들이 설치되어 있다면) 단 한줄 명령어로 발급
  • 발급 대기 시간 없이 바로 발급(이메일 입력 등을 포함해 1분 이내)
  • Nginx나 아파치와 같은 웹서버에 맞추어 자동 옵션 설정되도록 설치 가능
  • 인증 유효기간은 90일이지만 이증을 자동화 가능
  • 무료

근래 새롭게 사이트를 구축하하면서 Let’s Encrypt SSL 인증서 발급 과정에서 기존에 알고 있던 방법들이 대부분 작용하지 않는 것을 확인했습니다. 그것은

  • Let’s Encrypt SSL 인증서에서 여러가지 보안 이슈들이 발견되면서 발급 방법에 대한 보완이 진행되었고,
  • 발급에 필요한 패키지들도 업그레이드 되었고,
  • 운영체제 업그레이드, DB 업그레이드

위와 같은 요인들로 인해서 기존에 알고 있던 방법들이 이를 제대로 반영하지 못하는 것으로 보입니다.

이제 Let’s Encrypt SSL 인증서 발급 방법에 대해서 알아 보시죠.

인증서 설치를 위한 Certbot 설치

Let’s Encrypt SSL 인증서 발급은 Certbot이라는 프로그램을 이용합니다. Certbot는 웹서비스와 운영체제에 따라 사용 방법이 다릅니다. 여기에서는 우분투 20.04를 설명하도록 하겠습니다.

우선 우분투에서 Certbot 설치는 아래 명령을 사용합니다. nginx 사용 기준

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

만약 Apache를 사용한다면 python3-certbot-nginx 명령은 아파치를 지원하도록 python3-certbot-apache 명령으로 대체되겠죠.

sudo apt install certbot python3-certbot-apache

그리고 과거 자료들을 보면 python-certbot-nginx 명령을 사용하는데 파이썬3으로 업그레이드되면서 파이썬3를 사용하라는 권고를 받습니다.

Let’s Encrypt SSL 인증서 발급 방법 3가지

Let’s Encrypt SSL 인증서 발급 방법은 webroot와 Standalone, DNS의 3가지 방식이 있습니다. 인증서 발급은 사이트에서 인증기관인 Let’s Encrypt에 접속해 이 사이트의 유효성을 검증하는 과정을 거치며 이 과정을 아래 3가지 방법 중 하나를 선택해 진행할 수 있습니다.

  1. webroot : 사이트 디렉토리 내에 인증서 유효성을 확인할 수 있는 파일을 업로드하여 인증서를 발급하는 방법입니다.
    이 방법은 인증 명령에 하나의 도메인 인증서만 발급 가능합니다.
  2. Standalone : 사이트 작동을 멈추고 이 사이트의 네크워킹을 이용해 사이트 유효성을 확인해 Let’s Encrypt SSL 인증서를 발급하는 방식입니다.
    이 방법은 여러 도메인을 동시에 발급 받을 수 있지만 인증서 발급 과정에는 사이트 서비스는 중단됩니다.
  3. DNS : 도메인을 쿼리해 확인되는 TXT 레코드로 사이트 유효성을 확인하는 방법입니다.
    이 방법은 당연하게도 서버 관리자가 도메인 DNS를 관리/수정할 수 있어야 합니다.

webroot SSL 인증서 발급

이 방법에 대해서는 Let’s Encrypt 설치 및 SSL 인증서 발급, NGINX 설정 방법nginx 서버에 HTTPS사용을 위한 SSL 인증서 발급받기 (Let’s Encrypt)등을 참조했습니다.

솔직히 이 방법은 번거롭기도하고 나중에 설명하겠지만 한계도 있는 방법입니다.

well-known이 있는 곳을 지정

위에서 설명한 것처럼 이 방법은 사이트 디렉토리 내에 인증서 유효성을 확인할 수 있는 파일을 업로드하여 인증서를 발급하는 방법으로 서버 내에 .well-known이 있는 곳을 지정해 줍니다.

이는 엄청 번거롭지만 1) 특정 폴더를 만들고 2) 이 특정 폴더에서 letsencrypt.conf 파일을 만들고 3) 이를 Nginx 설정 파일에서 이 파일을 읽어오도록 합니다.

먼저 특정 폴더를 만들고 mkdir -p 명령 옵션을 사용해 존재하지 않는 폴더를 만들어 줍니다.

mkdir -p /var/www/letsencrypt/.well-known/acme-challenge

다음으로는 webroot 경로를 알려주는 letsencrypt.conf 파일을 만듭니다. 이 파일 위치는 일반적으로 /etc/nginx/snippets/에 만드네요. 뭐 nano 편집기를 이용해서 아래와 같이 새로 만들 파일을 엽니다.

nano /etc/nginx/snippets/letsencrypt.conf

이 파일에 아래와 같은 내용을 추가합니다.

location ^~ /.well-known/acme-challenge/ { default_type "text/plain"; root /var/www/letsencrypt; }

다음으로는 Nginx 설정 파일 중 server 영역에서 아래 파일을 참조하도록 합니다.

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

이렇게 설정이 끝나면 Nginx를 다시 시작해 주어야겠죠.

sudo service nginx restart

예를 들면 아래와 같습니다.

server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; server_name fashionseoul.com www.fashionseoul.com; include /etc/nginx/ssl/letsencrypt.conf; location / { return 301 https://www.fashionseoul.com$request_uri; expires epoch; # return 301 아래에 expires epoch; 을 붙여주는 것은 301 리다이렉트가 캐싱되지 않도록 하기 위함 } }

SSL 인증서 발급

SSH command line에서 아래 명령을 입력합니다.

certbot certonly --webroot --webroot-path=/var/www/letsencrypt -d 사이트명.com -d www.사이트명.com

여기서 webroot-path는 사이트 루트를 말하는 것이 아니라 .well-known 폴더가 있는 곳을 말합니다.

웹서버를 통한 Let’s Encrypt SSL 인증서 발급

앞에서 설명했듯이 Apache나 Nginx와 같은 웹서버 옵션을 이용해서 Let’s Encrypt SSL 인증서 발급받을 수 있습니다.

이 방법의 좋은 점은 발급 받을 시 사이트 서비스를 중단하지 않아도 된다는 점이고, 웹서버가 알아서 적절한 SSL 옵션을 제안해 적용해 준다는 점입니다.

sudo certbot --nginx -d 사이트명.com -d www.사이트명.com

그러면 /etc/etsencrypt 폴더에 자동으로 SSL 적용 옵션을 제안해 줍니다. 사용자는 이 옵션을 그대로 사용할 수도 있고, 독자적인 옵션을 적용할 수도 있습니다.

그러나 별도 옵션을 적용하면 nginx가 제안하는 사항들이 제대로 업데이트가 안된다는 경고도 나오긴 합니다.

standalone 옵션

여기 소개하는 standalone 옵션은 사이트 서비스를 중단하고 사이트의 네트워킹을 이용해 인증서버와 접속하는 방식을 사용합니다.

이러한 방식은 단점이면서도 장점을 가지는데요. 단점은 이 인증을 진행하는 동안 사이트 서비스를 중단해야 한다는 점이구요. 장점은 간편하고 빠르고 더우기 안정성도 높습니다.

아래와 같은 명령어를 사용합니다.

cd /root/certbot service nginx stop certbot certonly --standalone -d 사이트명.com -d www.사이트명.com service nginx restart

이 standalone 옵션은 또한 한꺼번에 여러 개의 사이트를 인증 받을 수 있는데요. 아래와 같은 명령을 사용할 수 있습니다. 이는 연속해서 사이트명을 나열해주면 가능합니다.

certbot certonly --standalone -d 사이트명.com -d www.사이트명.com -d 사이트명2.com -d www.사이트명2.com -d 사이트명3.com -d www.사이트명3.com service nginx restart

단 이렇게 여러개 사이트를 인증 받을 시 인증서 존재 위치가 맨앞 사이트명으로 통일되게 됩니다. 나중에 사이트를 없앨 때 난감할 수도 있습니다.

따라서 조금 귀찮드라로도 사이트 하나 하나 명령어를 입력하는 것이 관리엔 더 좋습니다.