본문 바로가기

리눅스

[draft] NGINX의 SSL/TLS 프로토콜 및 암호화 스위트를 안전하게 구성하는 방법

728x90

NGINX의 SSL/TLS 프로토콜 및 암호화 스위트를 안전하게 구성하는 방법

HTTP 요청을 HTTPS로 리다이렉트

server {
    listen 80 default_server;
    server_name _;

    # 모든 HTTP 요청을 HTTPS로 리다이렉트
    return 301 https://$host$request_uri;
}

HTTPS 요청을 특정 사이트로 리다이렉트

server {
    listen 443 ssl default_server;
    server_name _;

    # SSL 인증서와 키 파일 경로 설정
    ssl_certificate /path/to/your/certificate.crt;
    ssl_certificate_key /path/to/your/private.key;

    # 모든 HTTPS 요청을 특정 사이트로 리다이렉트
    return 301 https://www.example.com$request_uri;
}

전체 구성 파일 예제

server {
    listen 80 default_server;
    server_name _;

    # 모든 HTTP 요청을 HTTPS로 리다이렉트
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl default_server;
    server_name _;

    # SSL 인증서와 키 파일 경로 설정
    ssl_certificate /path/to/your/certificate.crt;
    ssl_certificate_key /path/to/your/private.key;

    # 모든 HTTPS 요청을 특정 사이트로 리다이렉트
    return 301 https://www.example.com$request_uri;
}
728x90

SSL/TLS 프로토콜 및 암호화 스위트를 안전하게 설정하기

SSL/TLS 프로토콜 설정

  • TLS 1.2 및 1.3만 사용하도록 설정합니다.
ssl_protocols TLSv1.2 TLSv1.3;

암호화 스위트 설정

  • 안전한 암호화 스위트만 사용하도록 설정합니다.
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';

키 교환 및 인증 설정

ssl_prefer_server_ciphers on;

세션 설정

  • 세션 재사용 및 타임아웃 설정을 통해 성능과 보안을 향상시킵니다.
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;

ECDH 커브 설정

  • Elliptic Curve Diffie-Hellman (ECDH) 커브 설정
ssl_ecdh_curve secp384r1;

OCSP Stapling 설정

  • OCSP Stapling을 사용하여 인증서 상태를 확인하고 성능을 향상시킵니다.
ssl_stapling on;
ssl_stapling_verify on;

resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;

강력한 DH 파라미터 사용

  • strong DH parameters 파일을 생성하여 보안을 강화합니다.
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 4096
  • NGINX 설정에 추가
ssl_dhparam /etc/nginx/ssl/dhparam.pem;

전체 SSL/TLS 설정 예제

#default_redirect

server {
    listen 80 default_server;
    server_name _;

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

server {
    listen 443 ssl http2 default_server;
    server_name _;

    ssl_certificate /path/to/your/certificate.crt;
    ssl_certificate_key /path/to/your/private.key;

    ssl_protocols TLSv1.2 TLSv1.3;
    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';
    
    ssl_prefer_server_ciphers on;

    ssl_session_timeout 10m;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;
    
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;

    ssl_ecdh_curve secp384r1;
    
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";

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

이 설정을 적용한 후 NGINX 설정을 테스트하고 문제가 없다면 NGINX를 재시작 또는 재로드합니다.

sudo nginx -t
sudo systemctl reload nginx

 

참고URL

- Nginx 공식 문서 : Configuring HTTPS servers

- Mozilla wiki : Security/Server Side TLS

 

728x90