소개
Let’s Encrypt는 인증 기관(CA)로, 무료 TLS/SSL 인증서를 획득하고 설치할 수 있는 접근성 있는 방법을 제공하여 웹 서버에서 암호화된 HTTPS를 가능하게 합니다. 이는 소프트웨어 클라이언트인 Certbot을 제공하여 프로세스를 간소화하며 대부분 또는 모든 필요한 단계를 자동화하려고 시도합니다. 현재 인증서 획득 및 설치 전체 프로세스가 Apache 및 Nginx에서 완전히 자동화되어 있습니다.
이 튜토리얼에서는 Certbot을 사용하여 Rocky Linux 9의 Nginx에 대한 무료 SSL 인증서를 획득하고 인증서를 자동으로 갱신하는 방법을 알아볼 것입니다.
이 튜토리얼은 기본 파일 대신 별도의 Nginx 서버 구성 파일을 사용할 것입니다. 각 도메인에 대해 새로운 Nginx 서버 블록 파일을 생성해야 합니다. 이렇게 하면 일반적인 실수를 피하고 기본 파일을 대체 구성으로 유지할 수 있습니다.
전제 조건
이 튜토리얼을 따르려면 다음이 필요합니다:
-
이 튜토리얼을 따라 설정된 Rocky Linux 9 서버 하나, sudo가 활성화된 비-루트 사용자 및 방화벽을 포함하여.
-
등록된 도메인 이름. 이 튜토리얼에서는
example.com
을 사용할 것입니다. Namecheap에서 도메인 이름을 구매하거나, Freenom에서 무료로 얻거나, 선택한 도메인 등록기에서 사용할 수 있습니다. -
서버에 대한 다음 DNS 레코드가 설정되어 있어야 합니다. DigitalOcean을 사용하는 경우, 추가 방법에 대한 자세한 내용은 DNS 문서를 참조하십시오.
example.com
을 서버의 공인 IP 주소로 가리키는 A 레코드입니다.www.example.com
을 서버의 공인 IP 주소로 가리키는 A 레코드입니다.
-
Nginx는 Rocky Linux 9에 Nginx 설치 방법을 따라 설치되었습니다. 도메인에 대한 서버 블록이 있는지 확인하세요. 이 튜토리얼에서는
/etc/nginx/sites-available/example.com
을 예시로 사용합니다.
단계 1 — Certbot 설치
먼저, certbot
소프트웨어 패키지를 설치해야 합니다. 비 루트 사용자로 Rocky Linux 8 머신에 로그인하세요:
- ssh sammy@your_server_ip
certbot
패키지는 기본적으로 패키지 관리자를 통해 사용할 수 없습니다. Certbot을 설치하려면 EPEL 저장소를 활성화해야 합니다.
Rocky Linux 9 EPEL 저장소를 추가하려면 다음 명령을 실행하세요:
- sudo dnf install epel-release
설치를 확인하라는 메시지가 나오면 y
를 입력하고 엔터 키를 누르세요.
이제 추가 저장소에 액세스할 수 있으므로 필요한 모든 패키지를 설치하세요:
- 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
또는 선호하는 텍스트 편집기를 사용하여 도메인의 구성 파일을 엽니다:
- sudo nano /etc/nginx/conf.d/example.com
기존의 server_name
라인을 찾습니다. 다음과 같이 보일 것입니다:
...
server_name example.com www.example.com;
...
이 경우 편집기를 종료하고 다음 단계로 이동하세요.
그렇지 않으면 일치하도록 업데이트하십시오. 그런 다음 파일을 저장하고 편집기를 종료한 후 구성 편집의 구문을 확인하세요.
- sudo nginx -t
에러가 발생하면 서버 블록 파일을 다시 열어 오타나 누락된 문자를 확인하십시오. 구성 파일의 구문이 올바르면 Nginx를 다시로드하여 새 구성을로드하십시오:
- sudo systemctl reload nginx
Certbot은 이제 올바른 server
블록을 찾아 자동으로 업데이트할 수 있습니다.
다음으로 방화벽을 업데이트하여 HTTPS 트래픽을 허용하겠습니다.
단계 3 — 방화벽 규칙 업데이트
설정 요구 사항이 이미 firewalld
를 활성화했다면 외부 연결을 허용하도록 방화벽 설정을 조정해야 합니다.
이미 활성화된 서비스를 확인하려면 다음 명령을 실행하십시오:
- sudo firewall-cmd --permanent --list-all
다음과 같은 출력을 받게 될 것입니다:
Outputpublic
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
이 표시되지 않는 경우 다음 명령을 실행하여 활성화하십시오:
- sudo firewall-cmd --permanent --add-service=http
https
트래픽을 허용하려면 다음 명령을 실행하십시오:
- sudo firewall-cmd --permanent --add-service=https
변경 사항을 적용하려면 방화벽 서비스를 다시로드해야 합니다:
- sudo firewall-cmd --reload
이제 서버를 https 트래픽으로 열었으므로 Certbot을 실행하고 인증서를 가져올 준비가 되었습니다.
단계 4 — SSL 인증서 획득
Certbot는 플러그인을 통해 SSL 인증서를 획득하는 여러 가지 방법을 제공합니다. Nginx 플러그인은 필요할 때마다 Nginx를 재구성하고 구성을 다시로드하는 작업을 처리합니다. 이 플러그인을 사용하려면 다음을 입력하세요:
- sudo certbot --nginx -d example.com -d www.example.com
이 명령을 실행하면 --nginx
플러그인을 사용하여 -d
를 사용하여 인증서가 유효해야 하는 도메인 이름을 지정하여 certbot
이 실행됩니다.
명령을 실행할 때 이메일 주소를 입력하고 서비스 약관에 동의하라는 메시지가 나타납니다. 그런 다음 프로세스가 성공적으로 완료되었음을 알리는 메시지가 표시되고 인증서가 저장된 위치가 표시됩니다:
OutputSuccessfully 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 Server Test를 사용하여 서버를 테스트하면 A 등급을 받게됩니다.
이제 갱신 프로세스를 테스트하여 마무리하겠습니다.
단계 5 — Certbot 자동 갱신 확인
Let’s Encrypt 인증서는 90일 동안 유효하지만, 인증서를 갱신하는 것이 권장되며, 특히 만료일로부터 30일 이내에는 자동으로 갱신되도록 Certbot Let’s Encrypt 클라이언트의 renew
명령을 사용하는 것이 좋습니다.
다음 명령을 실행하여 인증서의 자동 갱신을 테스트할 수 있습니다:
- sudo certbot renew --dry-run
출력은 다음과 유사합니다:
OutputSaving 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)
...
다만 여러 도메인을 포함한 번들화된 인증서를 만들었다면, 출력에는 기본 도메인만 표시되지만 갱신은 이 인증서에 포함된 모든 도메인에 대해 작동합니다.
A practical way to ensure your certificates will not get outdated is to create a cron
job that will periodically execute the automatic renewal command for you. Since the renewal first checks for the expiration date and only executes the renewal if the certificate is less than 30 days away from expiration, it is safe to create a cron job that runs every week, or even every day.
크론탭을 편집하여 하루에 두 번 갱신을 실행하는 새로운 작업을 만들려면 다음 명령을 실행하세요:
- sudo crontab -e
이 명령을 실행하면 기본 크론탭이 비어있는 텍스트 파일이 열리게 됩니다. i
를 눌러 삽입 모드로 전환하고 다음 라인을 추가하세요:
0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew --quiet
작업을 마치면 삽입 모드를 떠나기 위해 ESC
를 누르고, 그 후 :wq
및 ENTER
를 눌러 파일을 저장하고 종료합니다. Vi 및 Vim 텍스트 편집기에 대한 자세한 내용은 클라우드 서버에 Vim 텍스트 편집기 설치 및 사용 튜토리얼을 참조하세요.
이로써 매일 정오와 자정에 실행되는 새로운 크론 작업이 생성됩니다. python -c 'import random; import time; time.sleep(random.random() * 3600)'
는 갱신 작업을 위해 해당 시간 내에서 무작위 분을 선택합니다.
`renew
` 명령은 Certbot에서 시스템에 설치된 모든 인증서를 확인하고, 만료되기 30일 이내인 것들을 업데이트합니다. `--quiet
` 옵션은 Certbot이 정보를 출력하지 않거나 사용자 입력을 기다리지 않도록 합니다.
갱신에 관한 더 자세한 정보는 Certbot 문서에서 찾을 수 있습니다.
결론
이 가이드에서는 Let’s Encrypt 클라이언트 Certbot을 설치하고 도메인용 SSL 인증서를 다운로드하며 자동으로 인증서를 갱신하는 방법을 설명했습니다. Certbot 사용에 관한 질문이 있으면 공식 Certbot 문서를 확인할 수 있습니다.
또한 중요한 업데이트를 확인하려면 공식 Let’s Encrypt 블로그를 확인할 수 있습니다.