Skip to content

Instantly share code, notes, and snippets.

@hakasenyang
Last active May 26, 2019 07:48
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hakasenyang/ab785323cb5d832ef1ed3d4ac4c13aaa to your computer and use it in GitHub Desktop.
Save hakasenyang/ab785323cb5d832ef1ed3d4ac4c13aaa to your computer and use it in GitHub Desktop.
안전한 SSL/TLS 를 설정하는 방법

안전한 SSL/TLS 를 설정하는 방법

SSL/TLS 인증서 크기

현재 SSL 크기 중에 안전하면서도 가벼운 (속도 빠른) 크기는 다음과 같다.

  • ECC : 256 bit
  • RSA : 2048 bit

이 크기보다 더 큰 경우에는 속도가 느리다는 단점이 있다. 물론 PC에서는 체감하기 힘들겠지만, 서버에도 부담 될 뿐더러 모바일 사용자에게는 좋은 경험이 되지 못 한다.

이 크기보다 작은 경우ECC는 secp256r1 이상부터 인증서로 쓰기 때문에 최소가 256bit 이다. 속도가 매우 빠르지만 일반 컴퓨터로도 해독당할 수 있다.

그러므로 ECC 256bit 혹은 RSA 2048bit 로도 충분하게 보안과 속도를 잡을 수 있다.

SSL/TLS 버전

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 은 먹히지 않는다. 그러므로 활성화 해도 무난하다.

SSL/TLS Cipher

안전하면서도 속도가 빠른 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 만 설정하면 된다.

OpenSSL 1.1.0 이상 (TLS 1.3 Cipher 설정은 현재 설정방법이 지원되지 않는다.)

nginx

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;

더 작성 중..

@claudianus
Copy link

👉 👌 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment