웹사이트 검색

CentOS 7에서 Let's Encrypt로 Apache를 보호하는 방법


소개

Certbot.

이 자습서에서는 Certbot을 사용하여 Apache를 웹 서버로 실행하는 CentOS 7 서버에서 Let’s Encrypt의 TLS/SSL 인증서를 설정합니다. 또한 cron 작업을 사용하여 인증서 갱신 프로세스를 자동화합니다. 자세한 내용은 Cron을 사용하여 VPS에서 작업을 자동화하는 방법을 참조하십시오.

전제 조건

이 가이드를 완료하려면 다음이 필요합니다.

  • sudo 권한이 있는 루트가 아닌 사용자로 CentOS 7 초기 서버 설정 가이드에 따라 CentOS 7 서버 1개를 설정했습니다.
  • 새 CentOS 7 서버에 대한 추가 권장 단계 가이드에 따라 구성된 기본 방화벽.
  • 가상 호스트가 구성된 CentOS 7 서버에 설치된 Apache. 도메인에 대한 자습서 가상 호스트 파일을 따라 이를 설정하는 방법을 배울 수 있습니다. 이 자습서에서는 /etc/httpd/sites-available/example.com.conf를 예로 사용합니다.
  • 인증서를 사용하려는 등록된 도메인 이름을 소유하거나 제어해야 합니다. 아직 등록된 도메인 이름이 없는 경우 Freenom에서 구입하거나 원하는 도메인 등록 기관을 사용할 수 있습니다.
  • 도메인을 서버의 공개 IP 주소로 가리키는 DNS A 레코드. DigitalOcean 플랫폼에 DNS를 추가하는 방법에 대한 자세한 내용은 이 DigitalOcean DNS 소개를 참조하십시오. DNS A 레코드는 Let’s Encrypt가 인증서를 발급하는 도메인을 소유하고 있음을 확인하는 방법 때문에 필요합니다. 예를 들어 example.com에 대한 인증서를 얻으려면 유효성 검사 프로세스가 작동하려면 해당 도메인이 서버로 확인되어야 합니다. 설정에서는 example.comwww.example.com을 도메인 이름으로 사용하며 둘 다 유효한 DNS 레코드가 필요합니다.

이러한 필수 구성 요소가 모두 완료되면 Let’s Encrypt 클라이언트 소프트웨어 설치로 이동합니다.

1단계 - Certbot Let’s Encrypt 클라이언트 설치

Let’s Encrypt를 사용하여 SSL 인증서를 얻으려면 먼저 Certbot과 SSL v3 암호화를 지원하는 Apache 모듈인 mod_ssl을 설치해야 합니다.

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

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

  1. sudo yum install epel-release

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

  1. sudo yum install certbot python2-certbot-apache mod_ssl

설치 과정에서 GPG 키 가져오기에 대해 묻는 메시지가 표시됩니다. 이 키는 설치 중인 패키지의 신뢰성을 확인합니다. 설치를 완료하려면 y를 입력하고 메시지가 표시될 때 ENTER를 눌러 GPG 키를 수락하십시오.

이러한 서비스가 설치되면 이제 Certbot을 실행하고 인증서를 가져올 준비가 된 것입니다.

2단계 - 인증서 받기

이제 Certbot이 설치되었으므로 이를 사용하여 도메인에 대한 SSL 인증서를 요청할 수 있습니다.

certbot Let’s Encrypt 클라이언트를 사용하여 Apache용 SSL 인증서를 생성하면 프로세스의 많은 단계가 자동화됩니다. 클라이언트는 매개변수로 제공한 도메인에 유효한 새 SSL 인증서를 자동으로 가져와 설치합니다.

대화식 설치를 실행하고 단일 도메인에만 적용되는 인증서를 얻으려면 다음과 함께 certbot 명령을 실행하십시오.

  1. sudo certbot --apache -d example.com

이것은 --apache 플러그인으로 certbot을 실행하고 -d 플래그로 인증서를 구성할 도메인을 지정합니다.

여러 도메인 또는 하위 도메인에 유효한 단일 인증서를 설치하려는 경우 -d 플래그를 사용하여 각각의 새 도메인 또는 하위 도메인에 태그를 지정하여 명령에 추가 매개 변수로 전달할 수 있습니다. 매개변수 목록의 첫 번째 도메인 이름은 인증서를 생성하기 위해 Let’s Encrypt에서 사용하는 기본 도메인입니다. 이러한 이유로 기본 도메인 이름을 목록의 첫 번째로 전달하고 그 뒤에 추가 하위 도메인이나 별칭을 전달합니다.

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

이 예에서 기본 도메인은 example.com입니다.

certbot 유틸리티는 인증서 요청 절차 중에 도메인 정보를 묻는 메시지를 표시할 수도 있습니다. 이 기능을 사용하려면 도메인 없이 certbot을 호출하십시오.

  1. sudo certbot --apache

이 프로그램은 인증서 옵션을 사용자 지정하기 위한 단계별 가이드를 제공합니다. 분실 키 복구 및 알림을 위한 이메일 주소를 제공하도록 요청한 다음 서비스 약관에 동의하라는 메시지가 표시됩니다. 명령줄에서 도메인을 지정하지 않은 경우에도 지정하라는 메시지가 표시됩니다. 가상 호스트 파일이 ServerName 지시문을 사용하여 명시적으로 제공하는 도메인을 지정하지 않으면 가상 호스트 파일을 선택하라는 메시지가 표시됩니다. 대부분의 경우 기본 ssl.conf 파일이 작동합니다.

또한 httphttps 액세스를 모두 활성화하거나 모든 요청을 강제로 https로 리디렉션하도록 선택할 수 있습니다. 더 나은 보안을 위해 암호화되지 않은 연결을 허용할 특별한 필요가 없는 경우 2: 리디렉션 옵션을 선택하는 것이 좋습니다. 원하는 항목을 선택한 다음 ENTER를 누르십시오.

Output
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: No redirect - Make no further changes to the webserver configuration. 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select the appropriate number [1-2] then [enter] (press 'c' to cancel):2

설치가 성공적으로 완료되면 다음과 유사한 메시지가 표시됩니다.

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 2019-08-14. 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

생성된 인증서 파일은 /etc/letsencrypt/live 디렉터리의 기본 도메인 이름을 딴 하위 디렉터리에서 사용할 수 있습니다.

이제 인증서를 다운로드, 설치 및 로드했으므로 SSL 인증서 상태를 확인하여 모든 것이 작동하는지 확인할 수 있습니다.

3단계 - 인증서 상태 확인

이 시점에서 Qualys를 사용하여 Certbot이 SSL 인증서를 올바르게 생성했는지 확인할 수 있습니다.

원하는 웹 브라우저에서 다음 링크를 열고 example.com을 기본 도메인으로 바꿉니다.

https://www.ssllabs.com/ssltest/analyze.html?d=example.com

서버에 대한 SSL 연결 테스트를 즉시 시작하는 페이지가 나타납니다.

테스트 실행이 시작되면 완료하는 데 몇 분 정도 걸릴 수 있습니다. 테스트 상태가 브라우저에서 업데이트됩니다.

테스트가 완료되면 서버 구성의 보안 및 품질을 평가하는 문자 등급이 페이지에 표시됩니다. 이 글을 쓰는 시점에서 기본 설정은 A 등급을 부여합니다.

SSL Labs가 이러한 등급을 결정하는 방법에 대한 자세한 내용은 2018년 1월 등급 체계에 대한 업데이트를 자세히 설명하는 SSL Labs 등급 게시물을 확인하세요.

https://를 사용하여 웹사이트를 새로고침하고 브라우저의 보안 표시기를 확인하세요. 이제 일반적으로 녹색 자물쇠 아이콘으로 사이트가 제대로 보호되었음을 나타냅니다.

SSL 인증서를 설정하고 확인했으면 다음 단계는 인증서를 유효하게 유지하기 위해 인증서 자동 갱신을 설정하는 것입니다.

4단계 - 자동 갱신 설정

Let’s Encrypt 인증서는 90일 동안 유효하지만 오차 범위를 허용하기 위해 60일마다 인증서를 갱신하는 것이 좋습니다. 이 때문에 이 프로세스를 자동화하여 인증서를 주기적으로 확인하고 갱신하는 것이 가장 좋습니다.

먼저 인증서를 갱신하는 데 사용할 명령을 살펴보겠습니다. certbot Let’s Encrypt 클라이언트에는 현재 설치된 인증서를 자동으로 확인하고 만료 날짜가 30일 미만인 경우 갱신을 시도하는 갱신 명령이 있습니다. --dry-run 옵션을 사용하여 이 작업의 시뮬레이션을 실행하여 갱신 작동 방식을 테스트할 수 있습니다.

  1. sudo certbot renew --dry-run

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

Output
Saving debug log to /var/log/letsencrypt/letsencrypt.log - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Processing /etc/letsencrypt/renewal/example.com.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cert not due for renewal, but simulating renewal for dry run Plugins selected: Authenticator apache, Installer apache Starting new HTTPS connection (1): acme-staging-v02.api.letsencrypt.org Renewing an existing certificate Performing the following challenges: http-01 challenge for example.com http-01 challenge for www.example.com Waiting for verification... Cleaning up challenges Resetting dropped connection: acme-staging-v02.api.letsencrypt.org - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - new certificate deployed with reload of apache server; fullchain is /etc/letsencrypt/live/example.com/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/example.com/fullchain.pem (success) ...

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

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

공식 Certbot 문서에서는 cron을 하루에 두 번 실행할 것을 권장합니다. 이렇게 하면 Let's Encrypt가 인증서 폐기를 시작하는 경우 Certbot이 인증서를 갱신하기까지 반나절이 걸리지 않습니다.

crontab을 편집하여 갱신을 하루에 두 번 실행할 새 작업을 만듭니다. 루트 사용자의 crontab을 편집하려면 다음을 실행하십시오.

  1. sudo crontab -e

텍스트 편집기는 이 시점에서 빈 텍스트 파일인 기본 crontab을 엽니다. 이 튜토리얼에서는 vi 텍스트 편집기를 사용합니다. 이 텍스트 편집기와 후속 vim에 대해 자세히 알아보려면 클라우드 서버에서 Vim 텍스트 편집기 설치 및 사용 자습서를 확인하세요.

i를 눌러 삽입 모드로 들어가 다음 줄에 추가합니다.

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

완료되면 ESC를 눌러 삽입 모드를 종료한 다음 :wqENTER를 눌러 파일을 저장하고 종료합니다. 이렇게 하면 매일 정오와 자정에 실행되는 새로운 크론 작업이 생성됩니다. 크론 작업에 무작위 요소를 추가하면 시간별 작업이 모두 같은 분에 발생하지 않아 서버 스파이크가 발생하지 않습니다. python -c import random; 수입 시간; time.sleep(random.random() * 3600)은 갱신 작업을 위해 시간 내 임의의 분을 선택합니다.

cron 작업을 생성하고 예약하는 방법에 대한 자세한 내용은 Certbot 설명서를 참조하십시오.

결론

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