업데이트: NGINX에서 무료 Let’s Encrypt SSL/TLS 인증서 사용하기

NGINX | 2021년 1월 28일

편집자 주 – Let’s Encrypt를 NGINX와 함께 사용하는 기존 절차를 자세히 설명한 블로그 게시물(2016년 2월 작성)은 이 페이지로 리디렉션됩니다. 해당 게시물의 지침은 더 이상 사용되지 않습니다.

이 게시물은 더 이상 다음에 의존하지 않도록 업데이트되었습니다. certbot‑auto는 전자 프런티어 재단(EFF)이 Debian 및 Ubuntu의 경우 Certbot 1.10.0에서, 그 밖의 모든 운영 체제의 경우 Certbot 1.11.0에서 지원을 중단한 도구입니다. 자세한 내용과 다른 설치 방법은 EFF의 이 게시물을 참조하세요.

또한 Electronic Frontier Foundation의 Peter Eckersley와 Yan Zhu가 당시 새롭게 등장한 Let’s Encrypt 인증 기관을 소개한 nginx.conf 2015 블로그 게시물도 참조하세요.

웹사이트에 SSL/TLS 암호화를 적용하면 검색 순위가 높아지고 사용자에게 더 나은 보안을 제공할 수 있다는 사실은 잘 알려져 있습니다. 하지만 웹사이트 소유자가 SSL을 도입하는 데에는 여러 가지 장벽이 있습니다.

가장 큰 장벽 중 두 가지는 인증서 발급에 드는 비용과 수동 절차였습니다. 하지만 이제 Let’s Encrypt 덕분에 더 이상 걱정할 필요가 없습니다. Let’s Encrypt는 누구나 SSL/TLS 암호화를 무료로 사용할 수 있게 해줍니다.

Let’s Encrypt는 무료로 이용할 수 있는 자동화된 개방형 인증 기관(CA)입니다. 맞습니다. SSL/TLS 인증서를 무료로 제공합니다. Let’s Encrypt에서 발급한 인증서는 현재 대부분의 브라우저에서 신뢰되며, Windows XP SP3의 Internet Explorer와 같은 구형 브라우저도 포함됩니다. 또한 Let’s Encrypt는 인증서 발급과 갱신을 모두 완전히 자동화합니다.

이 블로그 게시물에서는 Let’s Encrypt 클라이언트를 사용하여 인증서를 생성하는 방법과 NGINX Open Source 및 NGINX Plus에서 해당 인증서를 사용하도록 자동으로 구성하는 방법을 설명합니다.

Let’s Encrypt의 작동 방식

인증서를 발급하기 전에 Let’s Encrypt는 도메인 소유권을 확인합니다. 호스트에서 실행되는 Let’s Encrypt 클라이언트는 필요한 정보가 담긴 임시 파일(토큰)을 생성합니다. 그런 다음 Let’s Encrypt 검증 서버가 HTTP 요청을 통해 해당 파일을 가져와 토큰을 검증합니다. 이를 통해 도메인의 DNS 레코드가 Let’s Encrypt 클라이언트가 실행 중인 서버를 가리키는지 확인합니다.

사전 요구 사항

Let’s Encrypt를 시작하기 전에 다음 사항을 준비해야 합니다:

  • Have NGINX 또는 NGINX Plus가 설치되어 있어야 합니다.
  • 인증서에 사용할 등록된 도메인 이름을 소유하거나 관리해야 합니다. 등록된 도메인 이름이 없다면 GoDaddy 또는 dnsexit 같은 도메인 등록 대행업체를 이용할 수 있습니다.
  • 도메인 이름과 서버의 공용 IP 주소를 연결하는 DNS 레코드를 생성합니다.

이제 NGINX Open Source 또는 NGINX Plus에서 Let’s Encrypt를 손쉽게 설정할 수 있습니다(읽기 쉽도록 지금부터는 간단히 NGINX라고 하겠습니다).

참고: 이 블로그 게시물에 설명된 절차는 Ubuntu 16.04(Xenial)에서 테스트했습니다.

1. Let’s Encrypt 클라이언트 다운로드

먼저 Let’s Encrypt 클라이언트인 certbot을 다운로드합니다.

바로 위에서 언급했듯이, 이 지침은 Ubuntu 16.04에서 테스트했으며 해당 플랫폼에서는 다음 명령어를 사용하면 됩니다:

$ apt-get update$ sudo apt-get install certbot
$ apt-get install python-certbot-nginx

Ubuntu 18.04 이상에서는 Python 3 버전으로 대체하세요:

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

2. NGINX 설정

certbot은 SSL/TLS를 사용하도록 NGINX를 자동으로 구성할 수 있습니다. 인증서를 요청하는 도메인 이름이 server_name 지시문에 지정된 NGINX 구성의 server 블록을 찾아 수정합니다. 이 예시에서 도메인은 www.example.com입니다.

  1. NGINX를 새로 설치한 상태에서 시작한다고 가정하고, 텍스트 편집기를 사용하여 /etc/nginx/conf.d 디렉터리에 domain‑name.conf라는 이름의 파일을 만듭니다(이 예에서는 www.example.com.conf입니다).
  2. 도메인 이름(및 변형이 있는 경우)을 server_name 지시어로 지정합니다:
server {    listen 80 default_server;
    listen [::]:80 default_server;
    root /var/www/html;
    server_name example.com www.example.com;
}
  1. 파일을 저장한 다음, 다음 명령을 실행하여 구성의 구문을 확인하고 NGINX를 다시 시작합니다:
$ nginx -t && nginx -s reload

3. SSL/TLS 인증서 발급

The NGINX plug‑in for certbot용 NGINX 플러그인은 필요할 때마다 NGINX를 재구성하고 설정을 다시 로드합니다.

  1. 다음 명령을 실행하여 NGINX 플러그인으로 인증서를 생성합니다:
$ sudo certbot --nginx -d example.com -d www.example.com
  1. Respond to prompts from certbot의 안내에 따라 이메일 주소를 입력하고 Let’s Encrypt 서비스 약관에 동의하여 HTTPS 설정을 구성합니다.

인증서 생성이 완료되면 NGINX가 새 설정으로 다시 로드됩니다. certbot은 인증서가 성공적으로 생성되었다는 메시지와 함께 서버에서 인증서가 저장된 위치를 표시합니다.

Congratulations! You have successfully enabled https://example.com and https://www.example.com 
-------------------------------------------------------------------------------------
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 2017-12-12.

참고: Let’s Encrypt 인증서는 90일 후에 만료됩니다(예시에서는 2017-12-12). 인증서를 자동으로 갱신하는 방법에 대한 자세한 내용은 아래의 Let’s Encrypt 인증서 자동 갱신을 참조하세요.

If you look at domain‑name.conf 파일을 살펴보면 certbot이 이 파일을 수정한 것을 확인할 수 있습니다:

server {    listen 80 default_server;
    listen [::]:80 default_server;
    root /var/www/html;
    server_name  example.com www.example.com;

    listen 443 ssl; # managed by Certbot

    # RSA certificate
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot

    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot

    # Redirect non-https traffic to https
    if ($scheme != "https") {
        return 301 https://$host$request_uri;
    } # managed by Certbot
}

4. Let’s Encrypt 인증서 자동 갱신

Let’s Encrypt 인증서는 90일 후에 만료됩니다. 인증서가 자동으로 갱신되도록 설정하는 것이 좋습니다. 여기서는 기존 cron 작업을 crontab 파일에 추가하여 자동 갱신을 설정합니다.

  1. Open the crontab 파일을 엽니다.
$ crontab -e
  1. 매일 실행되도록 certbot 명령을 추가합니다. 이 예시에서는 매일 정오에 명령을 실행합니다. 이 명령은 서버의 인증서가 향후 30일 이내에 만료되는지 확인하고, 만료될 예정이면 갱신합니다. --quiet 지시어는 certbot이 출력을 생성하지 않도록 합니다.
0 12 * * * /usr/bin/certbot renew --quiet
  1. 파일을 저장하고 닫습니다. 설치된 모든 인증서가 자동으로 갱신되고 다시 로드됩니다.

요약

등록된 도메인 이름에 대한 SSL/TLS 인증서를 생성하기 위해 Let’s Encrypt 에이전트를 설치했습니다. NGINX에서 해당 인증서를 사용하도록 구성하고 인증서가 자동으로 갱신되도록 설정했습니다. NGINX 및 NGINX Plus용 Let’s Encrypt 인증서를 사용하면 몇 분 안에 간단하고 안전한 웹사이트를 구축하여 운영할 수 있습니다.

NGINX Plus에서 Let’s Encrypt를 직접 사용해 보려면 지금 30일 무료 평가판을 시작하거나 사용 사례에 대해 논의하려면 문의해 주세요.

관련 문서

업스트림 서버로의 HTTP 트래픽 보안 설정
업스트림 서버로의 TCP 트래픽 보안 설정
NGINX SSL 종료


공유

작성자 소개

관련 블로그 게시물

시청하기: KubeCon North America 2023에서의 NGINX Gateway Fabric
NGINX | 2023. 11. 30.

시청하기: KubeCon North America 2023에서의 NGINX Gateway Fabric

이 영상에서는 KubeCon의 NGINX 부스를 찾아가, 저희가 공개한 Kubernetes Gateway API 구현을 살펴봅니다.

F5 NGINX로 대규모 WAF 플릿을 확인하고 관리하는 2가지 방법
NGINX | 2023. 03. 23.

F5 NGINX로 대규모 WAF 플릿을 확인하고 관리하는 2가지 방법

앱 보안을 강화하는 두 가지 방법을 소개합니다. NGINX Management Suite를 통해 WAF 운영에 대한 가시성을 높이고, NGINX App Protect WAF를 활용해 코드형 보안을 구현하는 것입니다.

Ingress 컨트롤러 선택 가이드, 4부: NGINX Ingress Controller 옵션
NGINX | 2021. 09. 27.

Ingress 컨트롤러 선택 가이드, 4부: NGINX Ingress Controller 옵션

개발 주체, 개발 철학, 프로덕션 환경 준비도, 보안 및 지원을 기준으로 어떤 NGINX Ingress 컨트롤러가 가장 적합한지 알아보세요.

진화하는 공격 환경에 NGINX App Protect Denial of Service가 적응하는 방법
NGINX | 2021. 07. 06.

진화하는 공격 환경에 NGINX App Protect Denial of Service가 적응하는 방법

NGINX App Protect Denial of Service(DoS)가 계층 7 DoS 공격을 방어하기 위해 완화 방법을 실시간으로 조정하는 방식을 설명합니다. 정상적인 사용자 행동과 서버 상태에 대한 모델을 생성하여 공격을 나타내는 이상 징후를 감지하고 맞춤형 완화 시그니처를 적용할 수 있습니다.

NGINX Instance Manager를 활용한 대규모 구성 업데이트 및 인증서 관리
NGINX | 2021. 06. 30.

NGINX Instance Manager를 활용한 대규모 구성 업데이트 및 인증서 관리

NGINX Instance Manager 버전 1.0에는 두 가지 새로운 기능이 도입되었습니다. NGINX 인스턴스에 태그와 사용자 역할을 지정하면 전체 그룹에 구성을 한 번에 적용할 수 있습니다. 인증서 검사는 만료 예정인 인증서를 감지하여 서비스 중단을 방지할 수 있도록 인증서를 교체할 수 있게 해줍니다.

Netflix가 자사 CDN의 핵심으로 NGINX를 선택한 이유
NGINX | 2015. 03. 25.

Netflix가 자사 CDN의 핵심으로 NGINX를 선택한 이유

Netflix가 글로벌 콘텐츠 전송 네트워크인 Open Connect의 스트리밍 미디어 기술로 NGINX를 선택한 이유를 NGINX 개발자 Gleb Smirnoff에게서 알아보세요.