SW/리눅스

Linux : Debian 10 : Let's Encrypt로 Apache 보호 방법, 예제, 명령어

얇은생각 2022. 6. 3. 07:30
반응형

암호화는 ISRG(Internet Security Research Group)에서 만든 인증 기관입니다. 인증서 수동 생성, 검증, 설치 및 갱신을 제거하도록 설계된 완전 자동화된 프로세스를 통해 무료 SSL 인증서를 제공합니다.

Let's Encrypt로 발급된 인증서는 발급일로부터 90일 동안 유효하며 오늘날 모든 주요 브라우저에서 신뢰할 수 있습니다.

Apache를 웹 서버로 실행하는 Debian 10, Buster에 무료 암호화 SSL 인증서를 설치하는 방법을 보여 줍니다. 또한 SSL 인증서를 사용하고 HTTP/2를 사용하도록 Apache를 구성하는 방법도 설명합니다.

 

 

 

필수 구성 요소

가이드를 진행하기 전에 다음 사전 요구 사항이 충족되는지 확인하십시오.

- 루트 또는 sudo 권한이 있는 사용자로 로그인

- SSL 인증서를 가져오려는 도메인이 공용 서버 IP를 가리켜야 합니다. example.com을 이용하겠습니다.

- Apache가 설치

 

 

 

Certbot을 설치

인증서봇 도구를 사용하여 인증서를 획득하고 갱신합니다.

Certbot은 SSL 인증서를 가져오고 갱신하며 인증서를 사용하도록 웹 서버를 구성하는 작업을 자동화하는 모든 기능의 사용하기 쉬운 도구입니다. 

certbot 패키지는 기본 Debian 리포지토리에 포함되어 있습니다. 다음 명령을 실행하여 certbot을 설치합니다.

sudo apt update
sudo apt install certbot

 

 

 

강한 DH(Diffie-Hellman) 그룹을 생성

DH(Diffie-Hellman 키 교환)는 보안되지 않은 통신 채널을 통해 안전하게 암호화 키를 교환하는 방법입니다.

다음 명령을 실행하여 새 2048비트 DH 키를 생성합니다.

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

 

 

원하는 경우 최대 4096비트까지 크기를 변경할 수 있지만 시스템 엔트로피에 따라 생성에 30분 이상 걸릴 수 있습니다.

 

 

 

SSL 인증서를 암호화

도메인에 대한 SSL 인증서를 가져오려면 ${webroot-path}/well-known/acme-challenge 디렉토리에서 요청된 도메인을 검증하기 위한 임시 파일을 생성하여 작동하는 Webroot 플러그인을 사용하려고 합니다. Let's Encrypt 서버는 임시 파일에 HTTP 요청을 작성하여 요청된 도메인이 certbot이 실행되는 서버로 확인되는지 확인합니다.

보다 간단하게 하기 위해 .well-known/acme-challenge에 대한 모든 HTTP 요청을 /var/lib/letcrypt라는 단일 디렉토리에 매핑하겠습니다.

다음 명령을 실행하여 디렉터리를 생성하고 Apache 서버에 쓸 수 있도록 합니다.

sudo mkdir -p /var/lib/letsencrypt/.well-known
sudo chgrp www-data /var/lib/letsencrypt
sudo chmod g+s /var/lib/letsencrypt

 

 

코드 중복을 방지하려면 다음 두 구성 스니펫을 만듭니다.

# /etc/apache2/conf-available/letsencrypt.conf

Alias /.well-known/acme-challenge/ "/var/lib/letsencrypt/.well-known/acme-challenge/"
<Directory "/var/lib/letsencrypt/">
    AllowOverride None
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
    Require method GET POST OPTIONS
</Directory>

 

# /etc/apache2/conf-available/ssl-params.conf

SSLProtocol             all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite          ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder     off
SSLSessionTickets       off

SSLUseStapling On
SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"

Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set X-Frame-Options SAMEORIGIN
Header always set X-Content-Type-Options nosniff

SSLOpenSSLConfCmd DHParameters "/etc/ssl/certs/dhparam.pem"

 

 

위 스니펫의 코드는 Mozilla에서 권장하는 chipper를 사용하여 OCSP Stapling, HSTS(HTTP Straffic Transport Security)를 활성화하고 보안에 초점을 맞춘 HTTP 헤더를 거의 적용하지 않습니다.

mod_ssl 및 mod_headers가 모두 로드되었는지 확인합니다.

sudo a2enmod ssl
sudo a2enmod headers

 

 

HTTP/2 모듈을 사용하면 다음과 같이 사이트를 더 빠르고 강력하게 만들 수 있습니다.

sudo a2enmod http2

 

 

SSL 구성 파일을 사용합니다.

sudo a2enconf letsencrypt
sudo a2enconf ssl-params

 

 

Apache 구성을 다시 로드하여 변경 내용을 적용합니다.

sudo systemctl reload apache2

 

 

SSL 인증서 파일을 가져오려면 certbot 도구를 webroot 플러그인과 함께 사용합니다.

SSL 인증서를 성공적으로 얻은 경우 certbot은 다음 메시지를 출력합니다.

sudo certbot certonly --agree-tos --email admin@example.com --webroot -w /var/lib/letsencrypt/ -d example.com -d 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 2020-04-02. To obtain a new or tweaked
#    version of this certificate in the future, simply run certbot
#    again. 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

 

 

이제 인증서 파일이 있으므로 도메인 가상 호스트 구성을 다음과 같이 편집합니다.

# /etc/apache2/sites-available/example.com.conf

<VirtualHost *:80> 
  ServerName example.com
  ServerAlias www.example.com

  Redirect permanent / https://example.com/
</VirtualHost>

<VirtualHost *:443>
  ServerName example.com
  ServerAlias www.example.com

  Protocols h2 http/1.1

  <If "%{HTTP_HOST} == 'www.example.com'">
    Redirect permanent / https://example.com/
  </If>

  DocumentRoot /var/www/example.com/public_html
  ErrorLog ${APACHE_LOG_DIR}/example.com-error.log
  CustomLog ${APACHE_LOG_DIR}/example.com-access.log combined

  SSLEngine On
  SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem

  # Other Apache Configuration

</VirtualHost>

 

 

위의 구성에서는 HTTPS를 적용하고 www에서 non-ww 버전으로 리디렉션합니다. 필요에 따라 구성을 자유롭게 조정할 수 있습니다.

Apache 서비스를 다시 로드하여 변경 내용을 적용합니다.

sudo systemctl reload apache2

 

 

https://를 사용하여 웹 사이트를 열면 녹색 잠금 아이콘이 나타납니다.

SSL Labs Server Test를 사용하여 도메인을 테스트하는 경우 아래와 같이 A+ 등급을 받습니다.

Linux : Debian 10 : Let's Encrypt로 Apache 보호 방법, 예제, 명령어

 

 

 

SSL 인증서를 자동 갱신

Let's Encrypt의 인증서는 90일간 유효합니다. 인증서가 만료되기 전에 자동으로 갱신하기 위해 certbot 패키지는 하루에 두 번 실행되는 cronjob을 생성하고 만료 30일 전에 인증서를 자동으로 갱신합니다.

인증서가 갱신되면 Apache 서비스도 다시 로드해야 합니다. /etc/cron.d/certbot 파일에 --renew-hook "systemctl reload apache2"를 다음과 같이 추가합니다.

# /etc/cron.d/certbot

0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 's

 

 

갱신 프로세스를 테스트하려면 certbot --dry-run 스위치를 사용합니다.

sudo certbot renew --dry-run

 

 

오류가 없다면 갱신 절차가 성공적이었다는 의미입니다.

Debian에서 Let's Encrypt 클라이언트 certbot을 사용하여 도메인에 대한 SSL 인증서를 얻는 방법에 대해 설명했습니다. 또한 인증서를 사용하도록 Apache를 구성하고 인증서 자동 갱신을 위해 cronjob을 설정하는 방법을 보여드렸습니다.

반응형