Ubuntu 16.04에서 Let's Encrypt를 사용하여 Nginx 보호

Ubuntu 16.04에서 Let's Encrypt를 사용하여 Nginx 보호

2022-06-01 last update

16 minutes reading ssl nginx let's encrypt ubuntu certbot
Let's Encrypt는 인터넷 보안 연구팀(ISRG)이 개발한 무료 개방 인증서 발급 기관이다.이제 거의 모든 브라우저는 Let's Encrypt에서 발급한 인증서를 신뢰합니다.이 강좌에서 우리는 Ubuntu 16.04의certbot 도구를 사용하여 Nginx를 암호화하는 방법을 점차적으로 소개할 것이다.

선결 조건

본 강좌를 계속하기 전에 다음 선결 조건을 충족해야 합니다.
  • 공공 서버 IP를 가리키는 도메인 이름이 있습니다.이 강좌에서 우리는 사용할 것이다 example.com.
  • 다음과 같이 NginxHow To Install Nginx on Ubuntu 16.04를 설치했습니다.
    .
  • Certbot 설치

    Certbot은python으로 작성된 실용 프로그램으로 SSL 인증서를 가져오고 업데이트하며 웹 서버를 설정하는 작업을 자동으로 수행할 수 있습니다.우선 software-properties-common 패키지를 설치합니다. 이 패키지는 추가 PPA 추가에 필요한 add-apt-repository 도구를 제공합니다.패키지 인덱스 업데이트 및 설치software-properties-common:
    sudo apt updatesudo apt install software-properties-common
    설치 완료 후certbotPPA repository 추가
    다음 명령을 사용하여 시스템에 보냅니다.
    sudo add-apt-repository ppa:certbot/certbot
    패키지 목록을 업데이트하고certbot 패키지를 설치합니다.
    sudo apt updatesudo apt 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 www-data /var/lib/letsencryptsudo chmod g+s /var/lib/letsencrypt
    코드의 중복을 피하기 위해 다음 두 개의 코드 세그먼트를 만듭니다. 우리는 모든 Nginx server block에 이 두 개의 코드 세그먼트를 포함할 것입니다
    파일/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/sitesavailable/example.일반 도메인 이름 형식입니다.conf
    server {
      listen 80;
      server_name example.com www.example.com;
    
      include snippets/letsencrypt.conf;
    }
    sites-available부터 sites-enabled까지의 기호 링크를 만들어서 서버 블록을 활성화합니다.
    sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/example.com.conf
    변경 사항을 적용하기 위해 Nginx 설정을 다시 불러옵니다.
    sudo systemctl reload nginx
    webroot 플러그인으로certbot 스크립트를 실행하고 SSL 인증서 파일을 가져옵니다.
    sudo certbot certonly --agree-tos --email [email protected] --webroot -w /var/lib/letsencrypt/ -d example.com -d www.example.com
    SSL 인증서를 가져오면certbot은 다음 메시지를 인쇄합니다. (adsbygoogle=window.adsbygoogle | []).푸시({});
    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-04-23. 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
    
    현재 인증서 파일이 있습니다. 도메인 서버 블록을 다음과 같이 편집하십시오./etc/nginx/sitesavailable/example.일반 도메인 이름 형식입니다.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 버전을 non www 버전으로 재정의합니다.Reload the Nginx service
    변경 사항을 적용하려면:
    sudo systemctl reload nginx

    SSL 인증서 자동 갱신

    암호화된 인증서의 유효기간은 90일입니다.인증서가 만료되기 전에 인증서를 자동으로 갱신하려면certbot 패키지creates a cronjob를 사용하십시오
    그것은 매일 두 번 실행되며, 인증서가 만료되기 30일 전에 자동으로 인증서를 갱신합니다.인증서 갱신 후certbot 웹root 플러그인을 사용하기 때문에nginx 서비스를 다시 불러와야 합니다.이를 위해 --renew-hook "systemctl reload nginx" 파일을 /etc/cron.d/certbot 파일에 추가하여/etc/cron처럼 보입니다.d/certbot
    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
    이것은 매우 좋은 출발점이다.