현재 SSL 크기 중에 안전하면서도 가벼운 (속도 빠른) 크기는 다음과 같다.
- ECC : 256 bit
- RSA : 2048 bit
이 크기보다 더 큰 경우에는 속도가 느리다는 단점이 있다. 물론 PC에서는 체감하기 힘들겠지만, 서버에도 부담 될 뿐더러 모바일 사용자에게는 좋은 경험이 되지 못 한다.
이 크기보다 작은 경우ECC는 secp256r1 이상부터 인증서로 쓰기 때문에 최소가 256bit 이다. 속도가 매우 빠르지만 일반 컴퓨터로도 해독당할 수 있다.
그러므로 ECC 256bit 혹은 RSA 2048bit 로도 충분하게 보안과 속도를 잡을 수 있다.
SSL/TLS 버전에 대한 차이는 다음과 같다.
- SSLv2 (0x0200) : 아주 고전적인 옛날 버전이다. 더 이상 쓰이지 않는다.
- SSLv3 (0x0300) : IE 6 이하 버전에서 쓰이는 버전이다. 더 이상 쓰이지 않는다.
- TLSv1 (0x0301) : SSLv3 의 POODLE 취약점 등을 보완한 버전이다. PCI DSS 3.1 기준 2018년 6월 30일부터 사용이 금지되었다. SHA256 알고리즘이 일부 운영체제에서 지원된다.
- TLSv1.1 (0x0302) : 암호 블록 체인에 대한 방어가 지원된다.
- TLSv1.2 (0x0303) : SHA256 인증서 해시만 사용할 수 있다.
- TLSv1.3 (0x0304) : RFC 8446 을 할당받은 최신 버전. RC4 등의 위험 Cipher 가 제거되었고, RTT 가 개선되었다.
한국 특성상 높은 버전만 사용하는 것은 많은 사람들이 접속하지 못 할 가능성이 있다.
실제 서버에서 TLSv1 과 TLSv1.1 비활성화 후 서버 로그에 version too low 라는 오류가 많이 쌓였다.
따라서 TLSv1 (deprecated 되었지만) 및 TLSv1.1 은 한국에서는 어쩔 수 없이 활성화를 할 수 밖에 없다.
물론 대부분의 브라우저들은 TLS_FALLBACK_SCSV 를 지원하기 때문에 Downgrade attack 은 먹히지 않는다. 그러므로 활성화 해도 무난하다.
안전하면서도 속도가 빠른 Cipher 목록은 다음과 같다. AES 하드웨어 가속AES-NI 등이 지원되는 경우는 AES 를 사용하는 것이 가장 안전하다.
- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 (0xc02b)
- TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 (0xc02c)
- TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 (0xcca9)
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)
- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (0xc030)
- TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (0xcca8)
- TLS_AES_128_GCM_SHA256 (0x1301)
- TLS_AES_256_GCM_SHA384 (0x1302)
- TLS_CHACHA20_POLY1305_SHA256 (0x1303)
ECDHE 가 붙은 Cipher 는 TLS 1.2 에서 지원되며, 나머지는 TLS 1.3 전용 Cipher 이다.
AES 하드웨어 가속AES-NI 등이 지원되는 경우는 AES 를 사용하는 것이 좋지만, 모바일의 경우 일부 CPU 가 가속이 지원되지 않으므로, 더 빠른 CHACHA20 을 사용하도록 하는 것이 좋다.
대부분의 브라우저들은 AES 하드웨어 가속이 있다면 우선순위를 AES 로 두지만, 아닌 경우엔 CHACHA20 이 우선순위가 된다.
OpenSSL 1.1.0 이상이라면 대부분 AES 와 CHACHA20 에 대한 우선순위 설정이 지원된다. 아닌 경우에는 AES 만 설정하면 된다.
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+ECDSA+AESGCM+AES128:EECDH+ECDSA+CHACHA20:EECDH+ECDSA+AESGCM+AES256:EECDH+ECDSA+AES128+SHA256:EECDH+ECDSA+AES256+SHA384:EECDH+ECDSA+AES128+SHA:EECDH+ECDSA+AES256+SHA:EECDH+aRSA+AESGCM+AES128:EECDH+aRSA+CHACHA20:EECDH+aRSA+AESGCM+AES256:EECDH+aRSA+AES128+SHA256:EECDH+aRSA+AES256+SHA384:EECDH+aRSA+AES128+SHA:EECDH+aRSA+AES256+SHA:RSA+AES128+SHA:RSA+AES256+SHA:RSA+3DES;
ssl_session_timeout 1d;
ssl_session_tickets on;
ssl_session_cache shared:SSL:10m; # 메모리에 맞게 조절
resolver 1.1.1.1 1.0.0.1 9.9.9.9 valid=86400s ipv6=off;
resolver_timeout 15s;
ssl_stapling on;
ssl_stapling_verify on;
더 작성 중..
👉 👌 👍