웹사이트 검색

Ubuntu 20.04에서 Let's Encrypt로 Apache를 보호하는 방법


소개

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

이 가이드에서는 Certbot을 사용하여 Ubuntu 20.04에서 Apache용 무료 SSL 인증서를 얻고 이 인증서가 자동으로 갱신되도록 설정되었는지 확인합니다.

이 튜토리얼에서는 Let’s Encrypt로 보호될 웹 사이트를 설정하기 위해 Apache의 기본 구성 파일 대신 별도의 가상 호스트 파일을 사용합니다. 일반적인 실수를 방지하고 대체 설정으로 기본 구성 파일을 유지 관리하는 데 도움이 되므로 서버에서 호스팅되는 각 도메인에 대해 새 Apache 가상 호스트 파일을 생성하는 것이 좋습니다.

전제 조건

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

  • 루트가 아닌 sudo 사용자 및 방화벽을 포함하여 Ubuntu 20.04 자습서에 대한 초기 서버 설정에 따라 Ubuntu 20.04 서버 1개가 설정되었습니다.\n
  • 완전히 등록된 도메인 이름. 이 자습서에서는 전체적으로 your_domain을 예로 사용합니다. Freenom에서 도메인 이름을 구입하거나 선택한 도메인 등록 기관을 사용할 수 있습니다.\n
  • 다음 DNS 레코드는 모두 서버에 대해 설정됩니다. 추가 방법에 대한 자세한 내용은 이 DigitalOcean DNS 소개를 참조하세요.\n
    • 서버의 공용 IP 주소를 가리키는 your_domain이 있는 A 레코드
    • 서버의 공용 IP 주소를 가리키는 www.your_domain이 있는 A 레코드

    도메인의 가상 호스트 파일을 따라 Apache를 설치했습니다. 이 자습서에서는 /etc/apache2/sites-available/your_domain.conf를 예로 사용합니다.

    1단계 - Certbot 설치

    Let’s Encrypt로 SSL 인증서를 얻으려면 먼저 서버에 Certbot 소프트웨어를 설치해야 합니다. 이를 위해 기본 Ubuntu 패키지 리포지토리를 사용합니다.

    certbotpython3-certbot-apache의 두 가지 패키지가 필요합니다. 후자는 Certbot을 Apache와 통합하는 플러그인으로, 단일 명령으로 웹 서버 내에서 인증서 획득 및 HTTPS 구성을 자동화할 수 있습니다.

    1. sudo apt install certbot python3-certbot-apache

    Y를 누른 다음 ENTER를 눌러 설치를 확인하라는 메시지가 표시됩니다.

    이제 Certbot이 서버에 설치되었습니다. 다음 단계에서는 Apache의 구성을 확인하여 가상 호스트가 적절하게 설정되었는지 확인합니다. 이렇게 하면 certbot 클라이언트 스크립트가 도메인을 감지하고 새로 생성된 SSL 인증서를 자동으로 사용하도록 웹 서버를 재구성할 수 있습니다.

    2단계 - Apache 가상 호스트 구성 확인

    웹 서버에 대한 SSL을 자동으로 획득하고 구성할 수 있으려면 Certbot이 Apache 구성 파일 내에서 올바른 가상 호스트를 찾아야 합니다. 서버 도메인 이름은 VirtualHost 구성 블록 내에 정의된 ServerNameServerAlias 지시문에서 검색됩니다.

    Apache 설치 자습서의 가상 호스트 설정 단계를 따랐다면 /etc/apache2/sites-available/your_domain.conf에서 도메인에 대해 VirtualHost 블록을 설정해야 합니다. 를 ServerNameServerAlias 지시문이 이미 적절하게 설정되어 있습니다.

    이를 확인하려면 nano 또는 원하는 텍스트 편집기를 사용하여 도메인의 가상 호스트 파일을 엽니다.

    1. sudo nano /etc/apache2/sites-available/your_domain.conf

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

    ...
    ServerName your_domain
    ServerAlias www.your_domain
    ...
    

    ServerNameServerAlias가 이미 이와 같이 설정되어 있는 경우 텍스트 편집기를 종료하고 다음 단계로 이동할 수 있습니다. nano를 사용하는 경우 CTRL+X를 입력한 다음 YENTER를 입력하여 종료할 수 있습니다. .

    현재 가상 호스트 구성이 예제와 일치하지 않으면 그에 따라 업데이트하십시오. 완료되면 파일을 저장하고 편집기를 종료합니다. 그런 다음 다음 명령을 실행하여 변경 사항을 확인합니다.

    1. sudo apache2ctl configtest

    응답으로 Syntax OK를 받아야 합니다. 오류가 발생하면 가상 호스트 파일을 다시 열고 오타나 누락된 문자가 있는지 확인하십시오. 구성 파일의 구문이 정확하면 변경 사항이 적용되도록 Apache를 다시 로드합니다.

    1. sudo systemctl reload apache2

    이러한 변경으로 Certbot은 올바른 VirtualHost 블록을 찾아 업데이트할 수 있습니다.

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

    3단계 - 방화벽을 통한 HTTPS 허용

    전제 조건 가이드에서 권장하는 대로 UFW 방화벽을 활성화한 경우 HTTPS 트래픽을 허용하도록 설정을 조정해야 합니다. 설치 시 Apache는 몇 가지 다른 UFW 응용 프로그램 프로필을 등록합니다. Apache Full 프로필을 활용하여 서버에서 HTTP 및 HTTPS 트래픽을 모두 허용할 수 있습니다.

    현재 서버에서 어떤 종류의 트래픽이 허용되는지 확인하려면 다음을 사용할 수 있습니다.

    1. sudo ufw status

    Apache 설치 가이드 중 하나를 따랐다면 출력은 다음과 같아야 합니다. 즉, 포트 80의 HTTP 트래픽만 현재 허용됩니다.

    Output
    Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Apache ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Apache (v6) ALLOW Anywhere (v6)

    HTTPS 트래픽을 추가로 허용하려면 "Apache Full\ 프로필을 허용하고 중복 "Apache\ 프로필을 삭제하세요.

    1. sudo ufw allow 'Apache Full'
    2. sudo ufw delete allow 'Apache'

    이제 상태가 다음과 같이 표시됩니다.

    1. sudo ufw status
    Output
    Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Apache Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Apache Full (v6) ALLOW Anywhere (v6)

    이제 Certbot을 실행하고 인증서를 얻을 준비가 되었습니다.

    4단계 - SSL 인증서 받기

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

    1. sudo certbot --apache

    이 스크립트는 SSL 인증서를 구성하기 위해 일련의 질문에 답하라는 메시지를 표시합니다. 먼저 유효한 이메일 주소를 묻습니다. 이 이메일은 갱신 알림 및 보안 고지에 사용됩니다.

    Output
    Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator apache, Installer apache Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel): you@your_domain

    유효한 이메일 주소를 제공한 후 ENTER를 눌러 다음 단계로 진행하십시오. 그러면 Let’s Encrypt 서비스 약관에 동의하는지 확인하라는 메시지가 표시됩니다. A를 누른 다음 ENTER를 눌러 확인할 수 있습니다.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Please read the Terms of Service at
    https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
    agree in order to register with the ACME server at
    https://acme-v02.api.letsencrypt.org/directory
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    (A)gree/(C)ancel: A
    

    다음으로 전자 프론티어 재단과 이메일을 공유하여 뉴스 및 기타 정보를 받을 것인지 묻는 메시지가 표시됩니다. 콘텐츠를 구독하지 않으려면 N을 입력합니다. 그렇지 않으면 Y를 입력합니다. 그런 다음 ENTER를 눌러 다음 단계로 진행합니다.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Would you be willing to share your email address with the Electronic Frontier
    Foundation, a founding partner of the Let's Encrypt project and the non-profit
    organization that develops Certbot? We'd like to send you email about our work
    encrypting the web, EFF news, campaigns, and ways to support digital freedom.
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    (Y)es/(N)o: N
    

    다음 단계에서는 HTTPS를 활성화하려는 도메인을 Certbot에 알리라는 메시지가 표시됩니다. 나열된 도메인 이름은 Apache 가상 호스트 구성에서 자동으로 가져오므로 가상 호스트에 올바른 ServerNameServerAlias 설정이 구성되어 있는지 확인하는 것이 중요합니다. 나열된 모든 도메인 이름에 대해 HTTPS를 활성화하려면(권장) 프롬프트를 비워 두고 ENTER를 눌러 계속 진행할 수 있습니다. 그렇지 않으면 쉼표 및/또는 공백으로 구분된 각각의 해당 번호를 나열하여 HTTPS를 활성화하려는 도메인을 선택한 다음 ENTER를 누르십시오.

    Which names would you like to activate HTTPS for?
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    1: your_domain
    2: www.your_domain
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Select the appropriate numbers separated by commas and/or spaces, or leave input
    blank to select all options shown (Enter 'c' to cancel): 
    

    다음과 같은 출력이 표시됩니다.

    Obtaining a new certificate
    Performing the following challenges:
    http-01 challenge for your_domain
    http-01 challenge for www.your_domain
    Enabled Apache rewrite module
    Waiting for verification...
    Cleaning up challenges
    Created an SSL vhost at /etc/apache2/sites-available/your_domain-le-ssl.conf
    Enabled Apache socache_shmcb module
    Enabled Apache ssl module
    Deploying Certificate to VirtualHost /etc/apache2/sites-available/your_domain-le-ssl.conf
    Enabling available site: /etc/apache2/sites-available/your_domain-le-ssl.conf
    Deploying Certificate to VirtualHost /etc/apache2/sites-available/your_domain-le-ssl.conf
    

    다음으로 HTTP 트래픽을 HTTPS로 리디렉션할지 여부를 선택하라는 메시지가 표시됩니다. 실제로 누군가가 암호화되지 않은 채널(HTTP)을 통해 웹사이트를 방문하면 자동으로 웹사이트의 HTTPS 주소로 리디렉션됩니다. 리디렉션을 활성화하려면 2를 선택하고 웹 사이트에 액세스하는 별도의 방법으로 HTTP와 HTTPS를 모두 유지하려면 1을 선택하십시오.

    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
    
    

    이 단계 후에 Certbot의 구성이 완료되고 새 인증서에 대한 최종 설명, 생성된 파일의 위치 및 인증서의 신뢰성을 분석하는 외부 도구를 사용하여 구성을 테스트하는 방법이 표시됩니다.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Congratulations! You have successfully enabled https://your_domain and
    https://www.your_domain
    
    You should test your configuration at:
    https://www.ssllabs.com/ssltest/analyze.html?d=your_domain
    https://www.ssllabs.com/ssltest/analyze.html?d=www.your_domain
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    
    IMPORTANT NOTES:
     - Congratulations! Your certificate and chain have been saved at:
       /etc/letsencrypt/live/your_domain/fullchain.pem
       Your key file has been saved at:
       /etc/letsencrypt/live/your_domain/privkey.pem
       Your cert will expire on 2020-07-27. 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"
     - Your account credentials have been saved in your Certbot
       configuration directory at /etc/letsencrypt. You should make a
       secure backup of this folder now. This configuration directory will
       also contain certificates and private keys obtained by Certbot so
       making regular backups of this folder is ideal.
     - 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
    
    

    이제 인증서가 설치되어 Apache의 구성에 로드됩니다. https://를 사용하여 웹사이트를 새로고침하고 브라우저의 보안 표시기를 확인하세요. 일반적으로 주소 표시줄에 자물쇠 아이콘을 포함하여 사이트가 적절하게 보호되고 있음을 지적해야 합니다.

    SSL Labs 서버 테스트를 사용하여 외부 서비스 관점에서 인증서의 등급을 확인하고 자세한 정보를 얻을 수 있습니다.

    다음 및 마지막 단계에서는 인증서가 만료 날짜 전에 자동으로 갱신되도록 보장하는 Certbot의 자동 갱신 기능을 테스트합니다.

    5단계 - Certbot 자동 갱신 확인

    Let’s Encrypt의 인증서는 90일 동안만 유효합니다. 이는 사용자가 인증서 갱신 프로세스를 자동화하고 오용된 인증서나 도난 키가 조만간 만료되도록 하기 위함입니다.

    우리가 설치한 certbot 패키지는 systemctl 서비스에서 관리하는 /etc/cron.d에 대한 갱신 스크립트를 포함하여 갱신을 처리합니다. certbot.timer라고 합니다. 이 스크립트는 하루에 두 번 실행되며 만료 30일 이내의 모든 인증서를 자동으로 갱신합니다.

    이 서비스의 상태를 확인하고 활성화되어 실행 중인지 확인하려면 다음을 사용할 수 있습니다.

    1. sudo systemctl status certbot.timer

    다음과 유사한 출력이 표시됩니다.

    Output
    ● certbot.timer - Run certbot twice daily Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled) Active: active (waiting) since Tue 2020-04-28 17:57:48 UTC; 17h ago Trigger: Wed 2020-04-29 23:50:31 UTC; 12h left Triggers: ● certbot.service Apr 28 17:57:48 fine-turtle systemd[1]: Started Run certbot twice daily.

    갱신 프로세스를 테스트하려면 certbot을 사용하여 시험 실행을 할 수 있습니다.

    1. sudo certbot renew --dry-run

    오류가 표시되지 않으면 모든 설정이 완료된 것입니다. 필요한 경우 Certbot은 인증서를 갱신하고 Apache를 다시 로드하여 변경 사항을 적용합니다. 자동 갱신 프로세스가 실패하면 Let’s Encrypt는 지정한 이메일로 메시지를 보내 인증서가 만료될 때 경고합니다.

    결론

    이 자습서에서는 Let’s Encrypt 클라이언트 certbot을 설치하고 도메인에 대한 SSL 인증서를 구성 및 설치했으며 systemctl 내에서 Certbot의 자동 갱신 서비스가 활성화되어 있음을 확인했습니다. Certbot 사용에 대한 추가 질문이 있는 경우 해당 문서에서 시작하는 것이 좋습니다.