SW/리눅스

Linux : CentOS 8 : Let's Encrypt로 Nginx 보호 방법, 예제, 명령어

얇은생각 2022. 5. 17. 07:30
반응형

암호화는 ISRG(Internet Security Research Group)에서 개발한 무료 자동화 개방형 인증 기관으로 무료 SSL 인증서를 제공합니다.

Let's Encrypt에서 발급한 인증서는 모든 주요 브라우저에서 신뢰되며 발급일로부터 90일 동안 유효합니다.

Nginx를 웹 서버로 실행하는 CentOS 8에 무료 SSL 인증서를 암호화하는 방법에 대한 단계별 지침을 제공합니다. 또한 Nginx가 SSL 인증서를 사용하고 HTTP/2를 사용하도록 구성하는 방법을 보여 줍니다.

 

 

 

필수 조건

계속하기 전에 다음 필수 조건을 충족했는지 확인하십시오.

공용 IP를 가리키는 도메인 이름이 있습니다. example.com을 이용하겠습니다.

CentOS 8에 Nginx가 설치되어 있습니다.

방화벽이 포트 80 및 443의 연결을 허용하도록 구성되어 있습니다.

 

 

 

Certbot을 설치

Certbot은 서버에서 SSL 인증서를 암호화하고 HTTPS를 자동으로 사용하도록 설정하는 프로세스를 단순화하는 무료 명령줄 도구입니다.

Certbot 패키지가 표준 CentOS 8 리포지토리이지만 공급업체 웹 사이트에서 다운로드할 수 있습니다.

루트 또는 sudo 사용자로 다음 wget 명령을 실행하여 certbot 스크립트를 /usr/local/bin 디렉토리에 다운로드합니다.

sudo wget -P /usr/local/bin https://dl.eff.org/certbot-auto

 

 

다운로드가 완료되면 파일을 다음과 같이 실행합니다.

sudo chmod +x /usr/local/bin/certbot-auto

 

 

 

강력한 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 요청을 하여 요청된 도메인이 인증서봇이 실행되는 서버로 확인되는지 확인합니다.

보다 쉽게 하기 위해 .잘 알려진/acme 문제에 대한 모든 HTTP 요청을 /var/lib/lets 암호화라는 단일 디렉토리에 매핑할 것입니다.

다음 명령은 디렉토리를 생성하고 Nginx 서버에 쓰기 가능하도록 합니다.

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

 

 

코드 중복을 방지하려면 모든 Nginx 서버 블록 파일에 포함될 다음 두 개의 조각을 만드십시오.

sudo mkdir /etc/nginx/snippets

 

# /etc/nginx/snippets/letsencrypt.conf

location ^~ /.well-known/acme-challenge/ {
  allow all;
  root /var/lib/letsencrypt/;
  default_type "text/plain";
  try_files $uri =404;
}

 

# /etc/nginx/snippets/ssl.conf

ssl_dhparam /etc/ssl/certs/dhparam.pem;

ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 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;
ssl_prefer_server_ciphers off;

ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 30s;

add_header Strict-Transport-Security "max-age=63072000" always;
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;

 

 

위의 코드 조각에는 Mozilla에서 권장하는 키퍼가 포함되어 있으며, OCSP 스테이플링, HTTP 엄격한 전송 보안(HSTS)을 사용하도록 설정하고 보안에 중점을 둔 HTTP 헤더를 거의 적용하지 않습니다.

스니펫이 만들어지면 도메인 서버 블록을 열고 아래와 같이 letsencypt.conf 스니펫을 포함합니다.

# /etc/nginx/conf.d/example.com.conf

server {
  listen 80;
  server_name example.com www.example.com;

  include snippets/letsencrypt.conf;
}

 

 

변경 내용을 적용하려면 Nginx 구성을 다시 로드합니다.

sudo systemctl reload nginx

 

 

webroot 플러그인과 함께 certbot 도구를 실행하여 도메인의 SSL 인증서 파일을 가져옵니다.

sudo /usr/local/bin/certbot-auto 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-03-12. To obtain a new or tweaked
#    version of this certificate in the future, simply run certbot-auto
#    again. To non-interactively renew *all* of your certificates, run
#    "certbot-auto 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

 

 

이 경우 처음으로 certbot을 호출하면 도구가 누락된 종속성을 설치합니다.

SSL 인증서를 성공적으로 얻으면 certbot이 다음 메시지를 인쇄합니다.

인증서 파일을 확보했으므로 다음과 같이 도메인 서버 블록을 편집할 수 있습니다.

# /etc/nginx/conf.d/example.com.conf

server {
    listen 80;
    server_name www.example.com example.com;

    include snippets/letsencrypt.conf;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name www.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
    include snippets/ssl.conf;
    include snippets/letsencrypt.conf;

    return 301 https://example.com$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
    include snippets/ssl.conf;
    include snippets/letsencrypt.conf;

    # . . . other code
}

 

 

위의 구성을 통해 HTTPS를 강제 적용하고 www를 비 www 버전으로 리디렉션합니다.

마지막으로 Nginx 서비스를 다시 로드하여 변경 내용을 적용합니다.

sudo systemctl reload nginx

 

 

이제 https://를 사용하여 웹 사이트를 열면 녹색 잠금 아이콘이 표시됩니다.

SSL Labs Server 테스트를 사용하여 도메인을 테스트하는 경우 아래 이미지에 표시된 대로 A+ 등급을 받게 됩니다.

Linux : CentOS 8 : Let's Encrypt로 Nginx 보호 방법, 예제, 명령어

 

 

 

SSL 인증서를 암호화하도록 자동 갱신

암호화의 인증서는 90일 동안 유효합니다. 인증서가 만료되기 전에 자동으로 갱신하려면 하루에 두 번 실행되는 크론 작업을 생성하고 만료 30일 전에 인증서를 자동으로 갱신하십시오.

crontab 명령을 사용하여 새 크론잡(cronjob)을 생성합니다.

sudo crontab -e

 

 

다음 줄을 붙여 넣습니다.

0 */12 * * * root test -x /usr/local/bin/certbot-auto -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && /usr/local/bin/certbot-auto -q renew --renew-hook "systemctl reload nginx"

 

 

 

파일을 저장한 후 닫습니다.

갱신 프로세스를 테스트하려면 certbot 명령과 --dry-run 스위치를 차례로 사용하면 됩니다.

sudo ./certbot-auto renew --dry-run

 

 

오류가 없으면 테스트 갱신 프로세스가 성공했음을 의미합니다.

암호화 클라이언트, 인증서봇을 사용하여 도메인에 대한 SSL 인증서를 다운로드하는 방법을 보여 주었습니다. 또한 코드 중복을 방지하기 위해 Nginx 스니펫을 만들고 인증서를 사용하도록 Nginx를 구성했습니다. 인증서 자동 갱신을 위한 크론 작업을 설정합니다.

 Certbot에 대한 자세한 내용은 해당 설명서 페이지를 참조하십시오.

반응형