웹사이트 검색

Lets encrypt로 Nginx를 설치하고 SSLLabs 테스트에서 A+ 받기


이 페이지에서

  1. 전제 조건
  2. 무엇을 할 것인가?\n
  3. 1단계 - Nginx 웹 서버 설치
    1. Ubuntu 18.04에서.
    2. CentOS 7.5에서.

    1. Ubuntu 18.04에서 - UFW 방화벽\n
    2. CentOS 7.5 - 방화벽\n

    1. Ubuntu 18.04에서
    2. CentOS 7.5에서
    3. Ubuntu 18.04에서
    4. CentOS 7.5에서
    5. Ubuntu 18.04에서
    6. CentOS 7.5에서

    1. Ubuntu 18.04에서
    2. CentOS 7.5에서

    1. Ubuntu 18.04에서
    2. CentOS 7.5에서
    3. Ubuntu 시스템에서만

    이 튜토리얼에서는 Letsencrypt 인증서를 사용하여 Nginx 웹 서버를 설치하고 구성하는 방법을 단계별로 보여줍니다. 이 가이드는 Nginx 웹 서버 설치, lets encrypt 도구 설치, SSL 인증서 생성, SSL로 nginx 가상 호스트 구성, SSL 테스트 SSL Labs에서 A+를 받기 위한 추가 SSL 구성 생성에 대해 설명합니다.

    전제 조건

    • Linux 서버 - Ubuntu 18.04 또는 CentOS 7.5
    • 루트 권한\n

    우리는 무엇을 할 것입니까?

    1. Nginx 웹 서버 설치
    2. 방화벽 UFW/방화벽 구성\n
    3. 설치하면 SSL 인증서를 암호화하고 생성할 수 있습니다.\n
    4. 보안 SSL 구성
    5. SSL로 Nginx 가상 호스트 구성\n
    6. 테스트

    1단계 - Nginx 웹 서버 설치

    이 튜토리얼에서는 Linux 서버(Ubuntu 18.04 및 CentOS 7.5)에서 Letsencrypt를 사용하여 Nginx 웹 서버를 설치하고 구성하는 방법을 안내합니다.

    우분투 18.04에서.

    리포지토리를 업데이트한 다음 아래의 apt 명령을 사용하여 nginx를 설치합니다.

    sudo apt update
    sudo apt install nginx -y

    CentOS 7.5에서.

    EPEL 리포지토리를 CentOS 시스템에 설치하고 yum 명령을 사용하여 Nginx를 설치합니다.

    sudo yum install epel-release -y
    sudo yum install nginx -y

    설치가 완료되면 Nginx 서비스를 시작하고 시스템 부팅 시마다 실행되도록 활성화합니다.

    systemctl start nginx
    systemctl enable nginx

    이제 Nginx 웹 서버가 설치되었으며 기본 HTTP 포트 80에서 실행됩니다. 아래 netstat 명령을 사용하여 확인하십시오.

    netstat -plntu

    2단계 - 방화벽 UFW 구성 - Firewalld

    서버에서 방화벽을 켜고 필요에 따라 특정 포트를 여는 것이 좋습니다. 이 단계에서는 UFW 방화벽을 사용하는 Ubuntu 18.04 Linux 서버와 CentOS 7.5 시스템의 Firewalld에서 SSH, HTTP 및 HTTPS 포트를 여는 방법을 보여줍니다.

    Ubuntu 18.04에서 - UFW 방화벽

    Ubuntu 시스템에서 UFW 방화벽을 활성화하기 전에 목록 방화벽 구성에서 SSH 포트가 활성화되어 있는지 확인하십시오.

    ufw 명령을 사용하여 방화벽 구성에 SSH 서비스 포트를 추가한 다음 UFW 방화벽 서비스를 활성화합니다.

    ufw allow ssh
    ufw enable

    이제 HTTP 및 HTTPS 서비스를 추가하십시오.

    ufw allow http
    ufw allow https

    SSH, HTTP 및 HTTPS 서비스 포트가 UFW 방화벽 서비스 목록에 추가되었습니다. 아래 명령을 사용하여 확인하십시오.

    ufw status

    CentOS 7.5 - 방화벽

    firewelld에 포트와 서비스를 추가하기 전에 firewalld 서비스가 실행 중인지 확인하십시오.

    firewalld 서비스를 시작하고 시스템 부팅 시마다 실행되도록 활성화합니다.

    systemctl start firewalld
    systemctl enable firewalld

    메모:

    • SSH 서비스는 Firewald 서비스 목록에서 기본적으로 활성화됩니다.\n

    이제 아래의 firewall-cmd 명령을 사용하여 HTTP 및 HTTPS 서비스를 추가하십시오.

    firewall-cmd --add-service=http --permanent
    firewall-cmd --add-service=https --permanent

    firewalld 구성을 다시 로드하고 서비스 목록을 확인하십시오.

    firewall-cmd --reload
    firewall-cmd --list-services

    그러면 목록에 SSH, HTTP 및 HTTPS 서비스가 표시됩니다.

    3단계 - Letsencrypt 설치 및 인증서 생성

    이 단계에서는 letsencrypt 도구를 설치하고 cerbot 명령을 사용하여 강력한 SSL 인증서 Letsencrypt를 생성합니다.

    우분투 18.04에서

    아래의 apt 명령을 사용하여 letsencrypt 패키지를 설치합니다.

    sudo apt install letsencrypt -y

    CentOS 7.5에서

    이제 아래 yum 명령을 사용하여 CentOS 7에 letsencrypt 패키지를 설치합니다.

    sudo yum install certbot -y

    설치가 완료되면 SSL 인증서 파일을 생성하는 데 사용할 새 구성을 만듭니다.

    우분투 18.04에서

    /etc/nginx 구성 디렉토리로 이동하여 스니펫 디렉토리 아래에 새 구성 파일 cerbot.conf를 만듭니다.

    cd /etc/nginx/
    vim snippets/certbot.conf

    다음 구성을 거기에 붙여넣으십시오.

        location /.well-known {
            alias /var/www/html/.well-known;
        }

    저장 및 종료.

    이제 기본 Nginx 가상 호스트 파일을 편집합니다.

    vim sites-available/default

    server {..} 블록 아래에 다음 구성을 추가합니다.

        include snippets/certbot.conf;

    저장 및 종료.

    CentOS 7.5에서

    /etc/nginx 구성 디렉토리로 이동하여 default.d 디렉토리 아래에 새 구성 파일 certbot.conf를 만듭니다.

    cd /etc/nginx/
    vim default.d/certbot.conf

    아래에 구성을 붙여넣습니다.

        location /.well-known {
            alias /usr/share/nginx/html/.well-known;
        }

    저장 및 종료.

    이제 nginx 구성을 테스트하고 오류가 없는지 확인한 다음 nginx 서비스를 다시 시작하십시오.

    nginx -t
    systemctl restart nginx

    다음으로 certbot 명령을 사용하여 SSL letsencrypt 인증서를 생성합니다.

    우분투 18.04에서

    certbot certonly --rsa-key-size 4096 --webroot --agree-tos --no-eff-email --email  -w /var/www/html -d hakase-labs.io

    CentOS 7.5에서

    certbot certonly --rsa-key-size 4096 --webroot --agree-tos --no-eff-email --email  -w /usr/share/nginx/html -d hakase-labs.io

    메모:

    • 도메인의 RSA 키 크기를 4096으로 지정하고 인증 방법을 Ubuntu 시스템의 기본 웹 루트 디렉토리인 /var/www/html 및 /usr/share/nginx/html 디렉토리로 정의합니다. CentOS 7 시스템.

    완료되면 /etc/letsencrypt/live 디렉토리의 도메인 이름에 대한 모든 SSL 인증서 파일을 얻게 됩니다.

    추가 보안을 위해 아래와 같이 OpenSSL 명령을 사용하여 DHPARAM 키 4096을 생성합니다.

    openssl dhparam -out /etc/nginx/dhparam.pem 4096

    DHPARAM 키가 /etc/nginx 디렉토리에 생성되었습니다.

    4단계 - SSL 구성

    이 단계에서는 Nginx 웹 서버에 대한 SSL 구성을 정의합니다. Nginx 웹 서버에 초점을 맞춘 조정된 SSL 구성 보안을 포함하는 새 구성 ssl.conf를 생성합니다.

    우분투 18.04에서

    /etc/nginx/ 구성 디렉토리로 이동하여 snippets 디렉토리 아래에 새 SSL 구성 ssl.conf를 만듭니다.

    cd /etc/nginx/
    vim snippets/ssl.conf

    CentOS 7.5에서

    /etc/nginx/ 구성 디렉토리로 이동하여 default.d 디렉토리 아래에 새 SSL 구성 ssl/conf를 만듭니다.

    cd /etc/nginx/
    vim default.d/ssl.conf

    다음 SSL 구성을 거기에 붙여넣으십시오.

    # Specify the TLS versions
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    
    # Ciphersuites recommendation from the chiper.li
    # Use this chipersuites to get 100 points of the SSLabs test
    # Some device will not support
    #ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384";
    
    # Mozilla Ciphersuits Recommendation
    # Use this for all devices supports
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
    
    # Use the DHPARAM key and ECDH curve >= 256bit
    ssl_ecdh_curve secp384r1;
    ssl_dhparam /etc/nginx/dhparam.pem;
    
    server_tokens off;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;
    
    # Enable HTTP Strict-Transport-Security
    # If you have a subdomain of your site,
    # be carefull to use the 'includeSubdomains' options
    add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
    
    # Enable OSCP Stapling for Nginx web server
    # If you're using the SSL from Letsencrypt,
    # use the 'chain.pem' certificate
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/hakase-labs.io/chain.pem;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;
    
    # XSS Protection for Nginx web server
    add_header X-Frame-Options DENY;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options nosniff;
    add_header X-Robots-Tag none;

    저장 및 종료.

    메모:

    • 사이트의 TLS 버전을 지정하고 TLSv1 TLSv1.1 TLSv1.2만 수락합니다.\n
    • SSL ciphersuite를 지정하고 모든 장치 호환성을 얻으려면 Mozilla 제안의 SSL ciphersuite를 사용하는 것이 좋습니다.\n
    • HSTS, OSCP 스테이플링을 활성화하고 XSS 보호를 추가합니다.\n

    5단계 - SSL로 Nginx 가상 호스트 구성

    이 단계에서는 도메인 이름에 대한 가상 호스트 파일을 만듭니다. 새로운 가상 호스트, hakase-labs.io라는 도메인을 만들고 해당 웹 루트 디렉토리는 /var/www/site01 디렉토리에 위치합니다.

    새 디렉토리 /var/www/site01을 생성하고 내부에 index.html 파일을 생성합니다.

    mkdir -p /var/www/site01
    echo '<h1><center>Nginx - Letsencrypt - A+</center></h1>' > /var/www/site01/index.html

    이제 /etc/nginx 구성 디렉토리로 이동하여 우분투용 hakase-labs.io 및 CentOS 7 시스템용 hakase-labs.conf라는 새 가상 호스트 파일을 만듭니다.

    우분투 18.04에서

    cd /etc/nginx/
    vim sites-available/hakase-labs.io

    CentOS 7.5에서

    cd /etc/nginx/
    vim conf.d/hakase-labs.conf

    다음 샘플 Nginx 가상 호스트 구성을 여기에 붙여넣습니다.

    server {
        listen 80;
        listen [::]:80;
        server_name hakase-labs.io;
    
        return 301 https://$host$request_uri;
    }
    
    server {
            listen 443 ssl http2;
            listen [::]:443 ssl http2;
    
            root   /var/www/site01;
            index index.html index.php index.htm;
    
            server_name  hakase-labs.io;
            error_log /var/log/nginx/hakase-error.log warn;
    
            ssl_certificate /etc/letsencrypt/live/hakase-labs.io/fullchain.pem;
            ssl_certificate_key /etc/letsencrypt/live/hakase-labs.io/privkey.pem;
    
            #SSL Configuration
            include snippets/ssl.conf;
    
            location ~ /.well-known {
                    allow all;
            }
    
    
            location / {
                try_files $uri $uri/ =404;
            }
    
    
            location = /favicon.ico {
                    log_not_found off;
                    access_log off;
            }
    
            location = /robots.txt {
                    allow all;
                    log_not_found off;
                    access_log off;
            }
    
            location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
                    expires max;
                    log_not_found off;
            }
    
    }

    저장 및 종료.

    메모:

    • include snippets/ssl.conf를 변경합니다. 선. Ubuntu를 사용하는 경우 기본값으로 두십시오. CentOS를 사용하는 경우 디렉터리를 default.d/ssl.conf로 변경합니다.\n

    우분투 시스템에서만

    새 가상 호스트 파일을 활성화하고 구성을 테스트하여 오류가 없는지 확인하십시오.

    ln -s /etc/nginx/sites-available/hakase-labs.io /etc/nginx/sites-enabled/
    nginx -t

    이제 nginx 서비스를 다시 시작하십시오.

    systemctl restart nginx

    HTTPS가 활성화되고 추가 SSL 구성이 있는 새 가상 호스트가 생성되었습니다.

    netstat 명령을 사용하여 확인하면 목록에 HTTPS 포트 443이 표시됩니다.

    netstat -plntu

    6단계 - 테스트

    웹 브라우저를 열고 도메인 이름을 입력하십시오. 내 이름은 http://hakase-labs.io입니다.

    그러면 HTTPS 연결로 리디렉션됩니다.

    이제 SSL 테스트 사이트 https://www.ssllabs.com/ssltest/로 이동하여 자신의 도메인 이름을 입력한 다음 결과를 기다리십시오.

    다음은 Mozilla Ciphersuite Recommendation을 사용한 결과입니다.

    다음은 Cipher.li Ciphersuite Recommendation을 사용한 결과입니다.

    모든 결과에 A+ 결과가 표시되며 Mozilla 권장 사항과 Cipherli.st 권장 사항의 암호 강도만 다릅니다.

    서버의 OSCP Stapling 및 HSTS를 확인하려면 테스트 결과 페이지를 스크롤하면 아래와 같은 결과를 얻을 수 있습니다.

    명령줄에서 OSCP Stapling을 확인하려면 다음 명령을 사용하여 확인합니다.

    echo QUIT | openssl s_client -connect hakase-labs.io:443 -status 2> /dev/null | grep -A 17 'OCSP response:' | grep -B 17 'Next Update'

    HSTS 테스트는 아래의 curl 명령어를 사용하여 확인합니다.

    curl -s -D- https://hakase-labs.io | grep -i Strict

    SSL Letsencrypt를 사용한 Nginx 웹 서버 설치 및 구성은 물론 SSLabs 테스트에서 A+를 성공적으로 완료했습니다.

    참조

    • https://cipherli.st/