CentOS 7의 Let's Encrypt를 사용하여 Nginx 보호

CentOS 7의 Let's Encrypt를 사용하여 Nginx 보호

2022-05-17 last update

17 minutes reading ssl centos nginx let's encrypt certbot
Let's Encrypt는 인터넷 보안 연구팀(ISRG)이 개발한 자유롭고 개방적인 인증서 발급 기구이다.이제 거의 모든 브라우저가 Let's Encrypt에서 발급한 인증서를 신뢰합니다.이 자습서에서는 CentOS 7에 있는 certbot 도구를 사용하여 Nginx를 암호화하는 방법을 단계적으로 설명합니다.

선결 조건

이 강좌를 계속하기 전에 다음과 같은 선결 조건을 만족하는지 확인하십시오.
  • 공공 서버 IP를 가리키는 도메인 이름이 있습니다.본 강좌에서 우리는 example.com을 사용할 것이다.
  • 활성화EPEL repository
    NginxHow To Install Nginx on CentOS 7를 다음과 같이 설치합니다.
  • Certbot 설치

    Certbot은 쉽게 사용할 수 있는 도구로 SSL 인증서를 획득하고 업데이트하며 웹 서버를 설정하는 작업을 자동으로 완성할 수 있다.EPEL 저장소에서certbot 패키지를 설치하려면
    sudo yum install certbot

    강력한 Dh(Diffie Hellman) 팀 생성

    Diffie-Hellman 키 교환(DH)은 안전하지 않은 통신 채널을 통해 암호화 키를 안전하게 교환하는 방법입니다.다음 명령을 입력하여 새 2048비트 DH 매개변수 세트를 생성합니다.
    sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
    원하는 경우 크기를 4096비트로 변경할 수 있지만 이 경우 시스템 엔트로피에 따라 30분 이상 걸릴 수 있습니다.

    Let's Encrypt SSL 인증서 가져오기

    도메인의 SSL 인증서를 얻기 위해 Webroot 플러그인을 사용합니다. 이 플러그인은 ${webroot-path}/.well-known/acme-challenge 디렉터리에 임시 파일을 만들어서 요청한 도메인을 검증합니다.Let's Encrypt 서버는 요청한 도메인이certbot에서 실행되는 서버로 해석되는지 확인하기 위해 임시 파일에 HTTP 요청을 보냅니다.보다 간단하게 .well-known/acme-challenge 의 모든 HTTP 요청을 디렉터리 /var/lib/letsencrypt 에 비추겠습니다.다음 명령은 디렉토리를 생성하여 Nginx 서버에서 쓸 수 있도록 합니다.
    sudo mkdir -p /var/lib/letsencrypt/.well-knownsudo chgrp nginx /var/lib/letsencryptsudo 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:50m;
    ssl_session_tickets off;
    
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
    ssl_prefer_server_ciphers on;
    
    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=15768000; includeSubdomains; preload";
    add_header X-Frame-Options SAMEORIGIN;
    add_header X-Content-Type-Options nosniff;
    
    상기 부분 포함Mozilla 추천 스크레이퍼
    , OCSP 바인딩을 활성화하고 HTTP는 보안(HSTS)을 엄격히 전송하며 보안 중심의 HTTP 헤더를 거의 실행하지 않습니다.코드 세그먼트를 만든 후, 필드 서버 블록을 열고 letsencrypt.conf 코드 세그먼트를 포함합니다. 아래와 같습니다:/etc/nginx/conf.d/example.일반 도메인 이름 형식.conf
    server {
      listen 80;
      server_name example.com www.example.com;
    
      include snippets/letsencrypt.conf;
    }
    변경 사항을 적용하기 위해 Nginx 설정을 다시 불러옵니다:
    sudo systemctl reload nginx
    웹 루트 플러그인으로 Certbot을 실행하고 다음 명령을 보내서 도메인의 SSL 인증서 파일을 가져올 수 있습니다:
    sudo certbot certonly --agree-tos --email [email protected] --webroot -w /var/lib/letsencrypt/ -d example.com -d www.example.com
    SSL 인증서를 성공적으로 얻으면 다음과 같은 메시지를 출력합니다:
    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 2018-06-11. 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"
     - 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
    
    인증서 파일이 있으면 편집할 수 있습니다 domain server block
    다음과 같습니다./etc/nginx/conf.d/example.일반 도메인 이름 형식.구성
    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
    }
    
    및 위 구성forcing HTTPS
    그리고 www를 비 ww버전으로 리셋합니다.마지막으로reload the Nginx service
    변경 사항을 적용하려면:
    sudo systemctl reload nginx

    SSL 인증서 암호화를 위한 자동 갱신

    암호화된 인증서의 유효기간은 90일입니다.인증서가 만료되기 전에 인증서를 자동으로 갱신하려면create a cronjob
    그것은 매일 두 번 실행되며 인증서가 만료되기 30일 전에 자동으로 모든 인증서를 갱신합니다.crontab 명령을 실행하여 새로운cronjob을 만듭니다.
    sudo crontab -e
    다음 줄을 붙여넣습니다.
    0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew --renew-hook "systemctl reload nginx"
    
    파일을 저장하고 닫습니다.업데이트 과정을 테스트하려면certbot 명령을 사용하고 --dry-run 스위치를 사용하십시오:
    sudo certbot renew --dry-run
    오류가 없으면 테스트 업데이트 과정이 성공했음을 나타냅니다.

    결론

    이 강좌에서 Let's Encrypt 클라이언트 certbot을 사용하여 도메인에 대한 SSL 인증서를 다운로드합니다.또한 코드가 중복되지 않도록 Nginx 코드 세그먼트를 만들고 인증서를 사용하도록 구성했습니다.이 강좌가 끝났을 때, 자동 인증서 갱신을 위해cronjob을 설정했습니다.Certbot을 사용하는 방법에 대해 더 알고 싶으시다면their documentation
    이것은 아주 좋은 출발점이다.
    이 문장은 Install LEMP Stack on CentOS 7 시리즈의 일부분이다.이 시리즈의 추가 게시물: •
    How to Install Nginx on CentOS 72018년 3월 13일
    2018년 3월 13일 CentOS 7월 13일 Let's Encrypt를 통해 Nginx 보호
    Install MariaDB on CentOS 72018년 3월 14일
    Install PHP 7 on CentOS 72018년 3월 15일
    How to Set Up Nginx Server Blocks on CentOS 72018년 9월 24일