nginx에서 Qualys SSL Server Test 전체 항목 100점(TLSv1.2+TLSv1.3)

9196 단어 SSLnginxTLS

소개



TLSv1.2+TLSv1.3에서 전체 항목 100점이 되었으므로 각서
ArchLinux + nginx1.19.9

ssl-labs : htps //w w.ぁbs. 이 m / sl st
참고 : Qualys SSL Server Test에서 A+ 평가 및 만점 얻기 (nginx)

목표



SSL Labs의 모든 항목을 100점으로
TLSv1.2 + TLSv1.3 대응

준비



증명서



Let's Encrypt



DNS 인증
www 있음도 발행
키 길이는 4096bit
sudo certbot certonly --manual \
--preferred-challenges dns \
--rsa-key-size 4096 \
-d example.com \
-d www.example.com \
-m [email protected]

DNS 레코드



DNS CAA


example.com. IN CAA 0 issue "letsencrypt.org"
example.com. IN CAA 0 issuewild ";"
example.com. IN CAA 0 iodef "mailto:[email protected]"

www의 A 레코드 설정도 잊지 않고 (CNAME이라도 좋을까?)

dhparam


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

nginx.conf



발전기를 사용합시다.



Mozilla SSL Configuration Generator

Mozilla Configuration은 우선 Intermediate에서

이를 바탕으로 설정



왜 Cipher Strength가 100이 되지 않는가?



Mozilla 표준 설정 (Intermediate)



nginx.conf
ECDHE-ECDSA-AES128-GCM-SHA256
ECDHE-RSA-AES128-GCM-SHA256
DHE-RSA-AES128-GCM-SHA256

등의 128bit의 암호가 지정되어 있기 때문에 평가가 내려간다

설정



주로 server 블록 설정

256bit 이상의 암호만 지정해 보았다







참고 기사 에서처럼 nginx에서 TLSv1.3의 암호화 스위트를 설정할 수 없습니다.

TLSv1.2만 사용해보기





openssl.cnf에서 설정?



nginx1.19.4에서 nginx 측에서 설정할 수있게 된 것 같습니다.

TLSv1.3의 암호화 스위트 설정



256bit 이상의 암호만 지정ECDHE-ECDSA-CHACHA20-POLY1305 를 남겨두면 TLSv1.3에 128bit 암호가 남는다ECDHE-RSA-CHACHA20-POLY1305 삭제하면 문제가되지 않습니다.

nginx.conf
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384;
ssl_conf_command Ciphersuites TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384;



Handshake Simulation이 외롭다면



nginx.conf
ssl_ciphers 'HIGH !aNULL !eNULL !kECDH !DSS !MD5 !EXP !PSK !SRP !CAMELLIA !SEED !RSA !AES128 !ARIA128';

Key Exchange 100



nginx.conf
ssl_ecdh_curve secp521r1:secp384r1;

결과





WEAK로 표시되지만 평가에는 영향을 미치지 않습니다.



nginx.conf
# generated 2021-04-13, Mozilla Guideline v5.6, nginx 1.19.9, OpenSSL 1.1.1d, intermediate configuration
# https://ssl-config.mozilla.org/#server=nginx&version=1.19.9&config=intermediate&openssl=1.1.1d&guideline=5.6

# http -> https & www付きにリダイレクト
server {
    listen 80 default_server;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

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

    # www付きにリダイレクト
    if ($host !~* ^www\.(.+)) {
        return 301 https://www.example.com$request_uri;
    }

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
    ssl_session_tickets off;

    ssl_dhparam /etc/nginx/dhparam.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    # ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384;
    ssl_ciphers 'HIGH !aNULL !eNULL !kECDH !DSS !MD5 !EXP !PSK !SRP !CAMELLIA !SEED !RSA !AES128 !ARIA128';
    ssl_conf_command Ciphersuites TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384;
    ssl_ecdh_curve secp521r1:secp384r1;
    ssl_prefer_server_ciphers off;

    add_header Strict-Transport-Security "max-age=63072000" always;

    ssl_stapling on;
    ssl_stapling_verify on;

    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;

    resolver 127.0.0.1;
}

좋은 웹페이지 즐겨찾기