웹사이트 검색

Rocky Linux 9에서 Let's Encrypt로 Nginx를 보호하는 방법


소개

Let’s Encrypt는 무료 TLS/SSL 인증서를 얻고 설치하여 웹 서버에서 암호화된 HTTPS를 활성화할 수 있는 액세스 가능한 방법을 제공하는 인증 기관(CA)입니다. 필요한 단계의 대부분(전부는 아님)을 자동화하려고 시도하는 소프트웨어 클라이언트인 Certbot을 제공하여 프로세스를 단순화합니다. 현재 인증서를 얻고 설치하는 전체 프로세스는 Apache와 Nginx 모두에서 완전히 자동화되어 있습니다.

이 튜토리얼에서는 Certbot을 사용하여 Rocky Linux 9에서 Nginx용 무료 SSL 인증서를 얻고 인증서가 자동으로 갱신되도록 설정합니다.

이 튜토리얼에서는 기본 파일 대신 별도의 Nginx 서버 구성 파일을 사용합니다. 일반적인 실수를 방지하고 기본 파일을 대체 구성으로 유지하는 데 도움이 되므로 각 도메인에 대해 새 Nginx 서버 블록 파일을 생성해야 합니다.

전제 조건

이 자습서를 따르려면 다음이 필요합니다.

  • Rocky Linux 9 자습서에 대한 초기 서버 설정에 따라 하나의 Rocky Linux 9 서버를 설정합니다. 여기에는 sudo를 사용하는 루트가 아닌 사용자와 방화벽이 포함됩니다.\n
  • 등록된 도메인 이름입니다. 이 자습서에서는 전체적으로 example.com을 사용합니다. Freenom에서 도메인 이름을 구입하거나 선택한 도메인 등록 기관을 사용할 수 있습니다.\n
  • 다음 DNS 레코드는 모두 서버에 대해 설정됩니다. DigitalOcean을 사용하는 경우 추가 방법에 대한 자세한 내용은 DNS 설명서를 참조하십시오.\n
    • 서버의 공용 IP 주소를 가리키는 example.com이 있는 A 레코드
    • 서버의 공용 IP 주소를 가리키는 www.example.com이 있는 A 레코드

    Rocky Linux 9에 Nginx를 설치하는 방법에 따라 Nginx를 설치했습니다. 도메인에 대한 서버 블록이 있는지 확인하십시오. 이 튜토리얼에서는 /etc/nginx/sites-available/example.com을 예로 사용합니다.

    1단계 - Certbot 설치

    먼저 certbot 소프트웨어 패키지를 설치해야 합니다. 루트가 아닌 사용자로 Rocky Linux 8 시스템에 로그인합니다.

    1. ssh sammy@your_server_ip

    certbot 패키지는 기본적으로 패키지 관리자를 통해 사용할 수 없습니다. Certbot을 설치하려면 EPEL 저장소를 활성화해야 합니다.

    Rocky Linux 9 EPEL 리포지토리를 추가하려면 다음 명령을 실행합니다.

    1. sudo dnf install epel-release

    설치를 확인하라는 메시지가 표시되면 y를 입력하고 입력합니다.

    이제 추가 리포지토리에 액세스할 수 있으므로 필요한 모든 패키지를 설치합니다.

    1. sudo dnf install certbot python3-certbot-nginx

    이렇게 하면 프로그램을 실행하는 데 필요한 Certbot 자체와 Certbot용 Nginx 플러그인이 설치됩니다.

    설치 프로세스에서 GPG 키 가져오기에 대해 묻습니다. 설치를 완료할 수 있도록 확인하십시오.

    이제 Certbot을 설치했으므로 실행하여 인증서를 가져오겠습니다.

    2단계 - Nginx 구성 확인

    Certbot은 SSL을 자동으로 구성할 수 있도록 Nginx 구성에서 올바른 server 블록을 찾을 수 있어야 합니다. 특히 인증서를 요청한 도메인과 일치하는 server_name 지시문을 찾아 이를 수행합니다.

    Nginx 설치 튜토리얼의 서버 블록 설정 단계를 따랐다면 /etc/nginx/conf.d/example.com 에 도메인용 서버 블록이 있어야 합니다. server_name 지시문이 이미 적절하게 설정되어 있습니다.

    확인하려면 nano 또는 자주 사용하는 텍스트 편집기를 사용하여 도메인의 구성 파일을 엽니다.

    1. sudo nano /etc/nginx/conf.d/example.com

    기존 server_name 줄을 찾습니다. 다음과 같아야 합니다.

    ...
    server_name example.com www.example.com;
    ...
    

    그렇다면 편집기를 종료하고 다음 단계로 이동하십시오.

    그렇지 않은 경우 일치하도록 업데이트하십시오. 그런 다음 파일을 저장하고 편집기를 종료하고 구성 편집 구문을 확인합니다.

    1. sudo nginx -t

    오류가 발생하면 서버 블록 파일을 다시 열고 오타나 누락된 문자가 있는지 확인하십시오. 구성 파일의 구문이 정확하면 Nginx를 다시 로드하여 새 구성을 로드합니다.

    1. sudo systemctl reload nginx

    Certbot은 이제 올바른 server 블록을 찾아 자동으로 업데이트할 수 있습니다.

    다음으로 HTTPS 트래픽을 허용하도록 방화벽을 업데이트하겠습니다.

    3단계 - 방화벽 규칙 업데이트

    전제 조건 설정이 firewalld를 활성화하므로 Nginx 웹 서버에서 외부 연결을 허용하려면 방화벽 설정을 조정해야 합니다.

    이미 활성화된 서비스를 확인하려면 다음 명령을 실행합니다.

    1. sudo firewall-cmd --permanent --list-all

    다음과 같은 출력을 받게 됩니다.

    Output
    public target: default icmp-block-inversion: no interfaces: sources: services: cockpit dhcpv6-client http ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:

    서비스 목록에 http가 표시되지 않으면 다음을 실행하여 활성화하십시오.

    1. sudo firewall-cmd --permanent --add-service=http

    https 트래픽을 허용하려면 다음 명령을 실행합니다.

    1. sudo firewall-cmd --permanent --add-service=https

    변경 사항을 적용하려면 방화벽 서비스를 다시 로드해야 합니다.

    1. sudo firewall-cmd --reload

    이제 https 트래픽에 대해 서버를 열었으므로 Certbot을 실행하고 인증서를 가져올 준비가 되었습니다.

    4단계 - SSL 인증서 받기

    Certbot은 플러그인을 통해 SSL 인증서를 얻는 다양한 방법을 제공합니다. Nginx 플러그인은 필요할 때마다 Nginx를 재구성하고 구성을 다시 로드합니다. 이 플러그인을 사용하려면 다음을 입력하십시오.

    1. sudo certbot --nginx -d example.com -d www.example.com

    이것은 --nginx 플러그인과 함께 certbot을 실행하고, -d를 사용하여 유효한 인증서가 필요한 도메인 이름을 지정합니다.

    명령을 실행할 때 이메일 주소를 입력하고 서비스 약관에 동의하라는 메시지가 표시됩니다. 이렇게 하면 프로세스가 성공했으며 인증서가 저장된 위치를 알려주는 메시지가 표시됩니다.

    Output
    Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/your_domain/fullchain.pem Key is saved at: /etc/letsencrypt/live/your_domain/privkey.pem This certificate expires on 2022-12-15. These files will be updated when the certificate renews. Certbot has set up a scheduled task to automatically renew this certificate in the background. Deploying certificate Successfully deployed certificate for your_domain to /etc/nginx/conf.d/your_domain.conf Successfully deployed certificate for www.your_domain to /etc/nginx/conf.d/your_domain.conf Congratulations! You have successfully enabled HTTPS on https://your_domain and https://www.your_domain

    인증서가 다운로드, 설치 및 로드되었으며 이제 Nginx 구성이 자동으로 모든 웹 요청을 https://로 리디렉션합니다. 웹사이트를 새로고침하고 브라우저의 보안 표시기를 확인하세요. 일반적으로 자물쇠 아이콘과 함께 사이트가 적절하게 보안되어 있음을 나타내야 합니다. SSL Labs 서버 테스트를 사용하여 서버를 테스트하면 A 등급을 받습니다.

    갱신 프로세스를 테스트하여 마치겠습니다.

    5단계 - Certbot 자동 갱신 확인

    Let’s Encrypt 인증서는 90일 동안 유효하지만 오차 범위를 감안하여 60일마다 인증서를 갱신하는 것이 좋습니다. Certbot Let’s Encrypt 클라이언트에는 현재 설치된 인증서를 자동으로 확인하고 만료 날짜가 30일 미만인 경우 갱신을 시도하는 갱신 명령이 있습니다.

    다음 명령을 실행하여 인증서 자동 갱신을 테스트할 수 있습니다.

    1. sudo certbot renew --dry-run

    출력은 다음과 유사합니다.

    Output
    Saving debug log to /var/log/letsencrypt/letsencrypt.log - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Processing /etc/letsencrypt/renewal/your_domain.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cert not due for renewal, but simulating renewal for dry run Plugins selected: Authenticator nginx, Installer nginx Renewing an existing certificate Performing the following challenges: http-01 challenge for monitoring.pp.ua Waiting for verification... Cleaning up challenges - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - new certificate deployed with reload of nginx server; fullchain is /etc/letsencrypt/live/your_domain/fullchain.pem - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ** DRY RUN: simulating 'certbot renew' close to cert expiry ** (The test certificates below have not been saved.) Congratulations, all renewals succeeded. The following certs have been renewed: /etc/letsencrypt/live/your_domain/fullchain.pem (success) ...

    여러 도메인이 포함된 번들 인증서를 만든 경우 기본 도메인 이름만 출력에 표시되지만 갱신은 이 인증서에 포함된 모든 도메인에 대해 작동합니다.

    인증서가 오래되지 않도록 하는 실용적인 방법은 자동 갱신 명령을 주기적으로 실행하는 cron 작업을 만드는 것입니다. 갱신은 먼저 만료 날짜를 확인하고 인증서 만료가 30일 미만인 경우에만 갱신을 실행하므로 매주 또는 매일 실행되는 크론 작업을 생성하는 것이 안전합니다.

    갱신을 하루에 두 번 실행할 새 작업을 생성하도록 crontab을 편집합니다. 루트 사용자의 crontab을 편집하려면 다음을 실행하십시오.

    1. sudo crontab -e

    텍스트 편집기는 현재 빈 텍스트 파일인 기본 crontab을 엽니다. i를 눌러 삽입 모드로 들어가 다음 줄에 추가합니다.

    0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew --quiet
    

    완료되면 ESC를 눌러 삽입 모드를 종료한 다음 :wqENTER를 눌러 파일을 저장하고 종료합니다. 텍스트 편집기 Vi 및 후속 Vim에 대해 자세히 알아보려면 클라우드 서버에서 Vim 텍스트 편집기 설치 및 사용 자습서를 확인하세요.

    이렇게 하면 매일 정오와 자정에 실행되는 새로운 크론 작업이 생성됩니다. python -c import random; 수입 시간; time.sleep(random.random() * 3600)은 갱신 작업을 위해 시간 내 임의의 분을 선택합니다.

    Certbot의 갱신 명령은 시스템에 설치된 모든 인증서를 확인하고 30일 이내에 만료되도록 설정된 인증서를 업데이트합니다. --quiet는 Certbot이 정보를 출력하지 않거나 사용자 입력을 기다리지 않도록 지시합니다.

    갱신에 대한 자세한 정보는 Certbot 문서에서 찾을 수 있습니다.

    결론

    이 가이드에서는 Let’s Encrypt 클라이언트 Certbot을 설치하고, 도메인용 SSL 인증서를 다운로드하고, 자동 인증서 갱신을 설정했습니다. Certbot 사용에 대한 질문이 있는 경우 공식 Certbot 문서를 확인할 수 있습니다.

    공식 Let’s Encrypt 블로그에서 수시로 중요한 업데이트를 확인할 수도 있습니다.