Gunicorn: --ssl-version ํ”Œ๋ž˜๊ทธ์— ๋ช…๋ช…๋œ ์ƒ์ˆ˜์— ๋Œ€ํ•œ ์ง€์› ์ถ”๊ฐ€

์— ๋งŒ๋“  2015๋…„ 09์›” 15์ผ  ยท  37์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: benoitc/gunicorn

SSL ์ธ์ฆ์„œ ๋ฐ ํ‚ค์™€ ํ•จ๊ป˜ gunicorn์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. TLS ์—ฐ๊ฒฐ 1.0์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. TLS 1.2๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก gunicorn์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

Improvement Documentation help wanted FeaturSSL - Mailing List -

๋ชจ๋“  37 ๋Œ“๊ธ€

@rrajaravi๋‹˜ , ์•ˆ๋…•ํ•˜์„ธ์š”, http://docs.gunicorn.org/en/latest/settings.html#ciphers๋ฅผ ์„ค์ •ํ•ด ๋ณด์…จ์Šต๋‹ˆ๊นŒ ?

์ถฉ๋Œ

์ž‘๋™ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ด ๋ฌธ์ œ๋ฅผ ๋‹ซ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

TL;DR
Gunicorn์€ ๋‹ค์Œ์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.
TLSv1
SSLv2

๋‹ค์Œ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
SSLv3
SSLv23
TLSv1_1
TLSv1_2

@berkerpeksag http://docs.gunicorn.org/en/latest/settings.html#ciphers ์˜ ๋ฌธ์„œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
ssl.py์—์„œ ํ”„๋กœํ† ์ฝœ์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. TLSv1 ๋ฐ SSLv2๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” Ubuntu 14.04 LTS, Python 3.5.1, OpenSSL 1.0.1f 2014๋…„ 1์›” 6์ผ์˜ ๋ช…๋ น์ค„ ์˜ต์…˜์—์„œ ์ œ๊ณต๋  ๋•Œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋จธ์ง€๋Š” ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.
[2016-03-22 08:51:49 +0000] [2924] [์˜ค๋ฅ˜] ์ž‘์—…์ž ํ”„๋กœ์„ธ์Šค์˜ ์˜ˆ์™ธ:
์—ญ์ถ”์ (๊ฐ€์žฅ ์ตœ๊ทผ ํ˜ธ์ถœ ๋งˆ์ง€๋ง‰):
ํŒŒ์ผ "/home/me/Envs/myproject/lib/python3.5/site-packages/gunicorn/workers/sync.py", 126ํ–‰, ํ•ธ๋“ค
self.cfg.ssl_options)wrap_socket์˜ ํŒŒ์ผ "/usr/local/lib/python3.5/ssl.py", ์ค„ 1064์•”ํ˜ธ = ์•”ํ˜ธ)ํŒŒ์ผ "/usr/local/lib/python3.5/ssl.py", ์ค„ 690, **์ดˆ๊ธฐํ™”
self._context.set_ciphers(์•”ํ˜ธ)
ssl.SSLError: ('์•”ํ˜ธ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.',)


/usr/local/lib/python3.5/ssl.py
๋‹ค์Œ ์ƒ์ˆ˜๋Š” ๋‹ค์–‘ํ•œ SSL ํ”„๋กœํ† ์ฝœ ๋ณ€ํ˜•์„ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.

PROTOCOL_SSLv2
PROTOCOL_SSLv3
PROTOCOL_SSLv23
PROTOCOL_TLSv1
PROTOCOL_TLSv1_1
PROTOCOL_TLSv1_2

๋ถ„๋ฅ˜ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. @edwardotis. ๋ฌธ์„œ๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด ์ด๊ฒƒ์„ ๋‹ค์‹œ ์—ด๊ฒ ์Šต๋‹ˆ๋‹ค.

@berkerpeksag ๋„ ์ข‹์€ ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

TLSv1 ๋Š” ์ด์ „ Python ๋ฒ„์ „์—์„œ๋Š” ๊ดœ์ฐฎ์•„ ๋ณด์ด์ง€๋งŒ ๊ธฐ๋ณธ๊ฐ’์„ SSLv23 ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์ตœ์ƒ์˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ”„๋กœํ† ์ฝœ(ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๋ชจ๋‘์— ๋Œ€ํ•ด)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ Gunicorn 20์—์„œ SSLv2 ๋˜๋Š” SSLv3 ๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(๋‹ค์Œ 19.x ๋ฆด๋ฆฌ์Šค์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค).

@berkerpeksag : +1:

๋ˆ„๊ตฌ๋“ ์ง€ ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๊ธฐํšŒ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ํ™๋ณด๋ฅผ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.. ์•”ํ˜ธ๋ฅผ > TLSv1.0์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์šฐ๋ฆฌ์—๊ฒŒ ์ค‘์š”ํ•˜๋ฉฐ ์šฐ๋ฆฌ๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์—์„œ ๋ณผ ๋•Œ 1๋ณด๋‹ค ํฐ TLS ๋ฒ„์ „์€ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. t be set.. ๊ทธ๋ƒฅ ๊ธฐ๋ณธ๊ฐ’์ด 1.0์œผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค(์šฐ๋ฆฌ๋Š” ๋ฌธ์„œ์— ๋‚˜์—ด๋œ ๊ฒƒ์„ ์‹œ๋„ํ–ˆ๊ณ  ์—ฌ๊ธฐ์— ๋‚˜์—ด๋œ ์ƒ์ˆ˜๋Š” ์•„๋ฌด ์†Œ์šฉ์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค) -- ๋‹จ์ง€ No cipher can be selected ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค

@AndrewJHart ๊ต‰์žฅํ• ๊ฑฐ์•ผ ! :) ๊ฐ์‚ฌ!

๋‹ค๋ฅธ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์ค„์—์„œ --ssl-version ์— ์ƒ์ˆ˜๋ฅผ ์ง€์ •ํ•˜๊ธฐ ssl stdlib ๋ชจ๋“ˆ์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

$ python -c "import ssl; print(ssl.PROTOCOL_SSLv23)"     
  2
$ python -c "import ssl; print(ssl.PROTOCOL_TLSv1_2)"
  5

--ssl-version 2 ๋˜๋Š” --ssl-version 5 ๋ฅผ ์ง€์ •ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด TLS 1.2 ์•”ํ˜ธ๋ฅผ ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@AndrewJHart SSL ๊ฐœ์„ ์— ๊ธฐ์—ฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด #1440์„ ์‚ดํŽด๋ณด์„ธ์š”. ์„œ๋ฒ„ ์•”ํ˜ธ ์ˆœ์„œ ๊ธฐ๋ณธ ์„ค์ •๊ณผ ๊ฐ™์ด ์ปจํ…์ŠคํŠธ๋ฅผ ๋” ์ž˜ ์ œ์–ดํ•˜๋ ค๋ฉด SSLContext๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ „ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋™๊ธฐํ™” ์ž‘์—…์ž์— ๋Œ€ํ•ด ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ์˜ˆ์™€ ํ•จ๊ป˜ ํ•ด๋‹น ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ฐจ์ด์ ์„ ์ž ์‹œ ๊ฒŒ์‹œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. SSL ์ง€์›์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ฃผ์‹œ๋ฉด ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ TLSv1 ๋Œ€์‹  SSLv23 ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก gunicorn/config.py์˜ ๊ธฐ๋ณธ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฐ„๋‹จํ•œ pull ์š”์ฒญ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. #1140์ด๋ผ๊ณ  ๋งํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

์™œ ์ด ๋ฌธ์ œ๊ฐ€ ๋‹ค์‹œ ์—ด๋ ธ๋Š”์ง€ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. --ssl-version 2 Gunicorn์„ ํ…Œ์ŠคํŠธํ–ˆ์œผ๋ฉฐ TLS 1.2 ์•”ํ˜ธ๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹ซ์„ ๊ฒƒ์ด์ง€๋งŒ, ๋‚ด๊ฐ€ ์ž˜๋ชปํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด ๋‹ค์‹œ ์—ด๊ณ  ์„ค๋ช…ํ•˜์‹ญ์‹œ์˜ค.

๊ธฐ๋ณธ๊ฐ’ ๋ณ€๊ฒฝ์„ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด #1249๋ฅผ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ๋‹ค์‹œ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค.

a) ์‚ฌ์šฉ์ž๋Š” 2 ๋˜๋Š” 5 ๋Œ€์‹  'SSLv23' ๋˜๋Š” 'TLSv1_2' ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
b) ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์˜ต์…˜์„ Python ๋ฌธ์„œ๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•˜๋Š” ๋Œ€์‹  ๋ฌธ์„œํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. https://docs.python.org/3.5/library/ssl.html ์€ stdlib์—์„œ ๊ฐ€์žฅ ๊ธด ๋ฌธ์„œ ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ ์‚ฌ์šฉ์ž๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์˜ต์…˜์„ ํ™•์ธํ•˜๋Š” ๋ฐ ๋„ˆ๋ฌด ๋งŽ์€ ์‹œ๊ฐ„์„ ํ• ์• ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

๋ฌธ์„œ ๋ ˆ์ด๋ธ”์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋‹ค์‹œ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค.

19.5 ๋ฆด๋ฆฌ์Šค ์ „์—(์ฆ‰, ๊ฒฐํ˜ผ ์ „) ๋‹ซ์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์—ฌ๊ธฐ์— ๋ฌด์—‡์ด ํ•„์š”ํ•œ์ง€ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค. :)

์ด๊ฒƒ์€ ๋ช…๋ช…๋œ ์ƒ์ˆ˜์— ๋Œ€ํ•œ ์ง€์›๋งŒ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ์ „ํžˆ ์—ด๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.
--ssl-๋ฒ„์ „ ํ”Œ๋ž˜๊ทธ.

2016๋…„ 5์›” 2์ผ ์›”์š”์ผ 05:43 Benoit Chesneau [email protected]์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

19.5 ๋ฆด๋ฆฌ์Šค ์ „์— ๋‹ซ์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์—ฌ๊ธฐ์— ๋ฌด์—‡์ด ํ•„์š”ํ•œ์ง€ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.
(์ฆ‰, ๊ฒฐํ˜ผ ์ „) ๋ฉ‹์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค :)

โ€”
์—ด๊ธฐ/๋‹ซ๊ธฐ ์ƒํƒœ๋ฅผ ์ˆ˜์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/benoitc/gunicorn/issues/1114#issuecomment -216225302

์ง€๊ธˆ์€ 3.x ๋ฒ„์ „์„ ์žŠ์–ด๋ฒ„๋ฆฌ์ž. ๋ชจ๋“  ๋ฒ„์ „์˜ python์—์„œ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ์ƒ์ˆ˜๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋‹ค์Œ์€ ๊ฐœ๋… ์ฆ๋ช…์ž…๋‹ˆ๋‹ค. https://github.com/benoitc/gunicorn/pull/1454

ํŠน์ • ๋‹ค๋ฅธ ๋ฒ„์ „์˜ TLS์—์„œ ํ™œ์„ฑํ™” ๋˜๋Š” ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด์ „ ๋ฒ„์ „์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ๋ฌธ์„œ์—์„œ "--ssl-version"์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด์ „ ๋ฒ„์ „์„ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋˜๋Š” ๋‘ ๋ฒˆ ์ด์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€(์˜ˆ: SSL3 ๋น„ํ™œ์„ฑํ™” ๋ฐ TLS1.0 ๋น„ํ™œ์„ฑํ™”) ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ ์‚ฌ์šฉ ์ „ํ™˜์ด ํ•„์š”ํ•œ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐ SSLContext ์ƒˆ๋กœ์šด ์˜ต์…˜์„ ์ถ”๊ฐ€ --ssl-options (์šฐ๋ฆฌ๊ฐ€ ์•„๋งˆ ์‚ฌ์šฉ ssl.create_default_context() ์€ SSLv3 ๋ฐ TLS 1.0์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™” ํ•  ์ˆ˜ ์žˆ๋„๋ก) ๋•Œ๋ฌธ์—์ด ๋„ˆ๋ฌด ๋งŽ์€ ์กฐํ•ฉ์ด --ssl-version ๋ช…๋ช…๋œ ์ƒ์ˆ˜๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž๋Š” ์—ฌ์ „ํžˆ Gunicorn ๊ตฌ์„ฑ ํŒŒ์ผ์— ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ssl_options = ssl.OP_NO_COMPRESSION | ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3

ํ”„๋กœํ† ์ฝœ _๋ฐ ์ •ํ™•ํ•œ ๋ฒ„์ „_์„ ๋ชจ๋‘ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด PROTOCOL_ *๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ssl_options ๊ฐ€ ํ˜„์žฌ ๊ตฌํ˜„๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  #1680์„ ์˜ฌ๋ ธ์Šต๋‹ˆ๋‹ค.

1890๋…„์— ๊ทธ๊ฒƒ์„ ๊ณ ์ณค์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€ ๋‚˜๋ฅผ ์œ„ํ•œ ์ง€์นจ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ž ์‹œ ๋™์•ˆ ์ด๊ฒƒ์œผ๋กœ ๊ณ ์ƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ํ™˜๊ฒฝ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Python 3.4.3
gunicorn==19.9.0
pyOpenSSL==18.0.0
cryptography==2.4.2

์ €๋„ gunicorn ํ”Œ๋ž˜๊ทธ --ssl-version 5

๋‚ด ์„œ๋ฒ„๊ฐ€ TLS 1.2๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ๋ณด์•ˆ๋˜์ง€ ์•Š์€ ์•”ํ˜ธ ์ œํ’ˆ๊ตฐ์„ ๋งŽ์ด ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์•”ํ˜ธ ์ œํ’ˆ๊ตฐ์„ ์–ด๋–ป๊ฒŒ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? --ciphers ํ”Œ๋ž˜๊ทธ๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์šด์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌ!

--ssl-version 5 --ciphers ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256
์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค:

~# openssl s_client -connect localhost:443 - ์•”ํ˜ธ ECDHE-RSA-AES256-GCM-SHA384
์—ฐ๊ฒฐ๋จ(00000003)
๊นŠ์ด=3...

~# openssl s_client - ๋กœ์ปฌ ํ˜ธ์ŠคํŠธ ์—ฐ๊ฒฐ:443 -์•”ํ˜ธํ™” DHE-RSA-AES256-GCM-SHA384
์—ฐ๊ฒฐ๋จ(00000003)
140497569816640: ์˜ค๋ฅ˜:14094410 :SSL ๋ฃจํ‹ด:ssl3_read_bytes :sslv3 ๊ฒฝ๊ณ  ํ•ธ๋“œ์…ฐ์ดํฌ ์‹คํŒจ:../ssl/record/rec_layer_s3.c :1407:SSL ๊ฒฝ๊ณ  ๋ฒˆํ˜ธ 40

@lemrouch ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด์ „์—๋Š” ์™œ ๊ทธ๊ฒƒ์ด ํšจ๊ณผ๊ฐ€ ์—†์—ˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ง€๊ธˆ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!

gunicorn flask ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— TLS1.0 ๋Œ€์‹  TLS 1.2๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ผ๋ถ€๋Š” ๋„ฃ์–ด์•ผ ํ•˜๋Š” ํ„ฐ๋ฏธ๋„ ๋ช…๋ น์ด๋‚˜ ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@rkbala ์ด๊ฒƒ์€ ๋‚ด ํ”Œ๋ผ์Šคํฌ ์•ฑ์— ๋Œ€ํ•œ ๊ด€๋ จ ์ฝ”๋“œ์˜ ๋ชจ์Šต์ž…๋‹ˆ๋‹ค.

...
from ssl import SSLContext, PROTOCOL_TLSv1_2, OP_NO_SSLv3, OP_NO_TLSv1, OP_NO_TLSv1_1
...
ssl = SSLContext(PROTOCOL_TLSv1_2)
ssl.set_ciphers('ECDH+AES256:ECDH+AES128:' + 
                '!aNULL:!eNULL:!MD5:!DSS:!RC4:!SSLv2:!SSLv3:!TLSv1')
ssl.options |= OP_NO_SSLv3
ssl.options |= OP_NO_TLSv1
ssl.options |= OP_NO_TLSv1_1
ssl.load_cert_chain('/etc/letsencrypt/live/fullchain.pem',
                    '/etc/letsencrypt/live/privkey.pem')
...
if __name__ == '__main__':
    app.run(host='0.0.0.0', port='443', ssl_context=ssl)

@rkbala ์ด๊ฒƒ์€ ๋‚ด ํ”Œ๋ผ์Šคํฌ ์•ฑ์— ๋Œ€ํ•œ ๊ด€๋ จ ์ฝ”๋“œ์˜ ๋ชจ์Šต์ž…๋‹ˆ๋‹ค.

...
from ssl import SSLContext, PROTOCOL_TLSv1_2, OP_NO_SSLv3, OP_NO_TLSv1, OP_NO_TLSv1_1
...
ssl = SSLContext(PROTOCOL_TLSv1_2)
ssl.set_ciphers('ECDH+AES256:ECDH+AES128:' + 
                '!aNULL:!eNULL:!MD5:!DSS:!RC4:!SSLv2:!SSLv3:!TLSv1')
ssl.options |= OP_NO_SSLv3
ssl.options |= OP_NO_TLSv1
ssl.options |= OP_NO_TLSv1_1
ssl.load_cert_chain('/etc/letsencrypt/live/fullchain.pem',
                    '/etc/letsencrypt/live/privkey.pem')
...
if __name__ == '__main__':
    app.run(host='0.0.0.0', port='443', ssl_context=ssl)

@pixelrebel ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!! ํ•ด๋ณด๊ณ  ์•Œ๋ ค๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ssl.options |=OP_NO_*๋Š” ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

์•”ํ˜ธ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์œ„์˜ set_ciphers๊ฐ€ ๋ฌด์ž‘์œ„ ์•”ํ˜ธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๊นŒ?

@rkbala ๋น„ํŠธ ๋‹จ์œ„ ๋˜๋Š” ์—ฐ์‚ฐ์ด ํ•„์š”ํ•œ ์ด์œ ๋ฅผ ๊ธฐ์–ตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

TLS 1.2์™€ ํ˜ธํ™˜๋˜๋Š” ์•”ํ˜ธ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ ๊ฒฝ์šฐ์—๋Š” ์•ฑ์—์„œ Slack๊ณผ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋Š” API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ Slackbot์ด ์‚ฌ์šฉํ•˜๋Š” ์•”ํ˜ธ๋ฅผ ์ง€์›ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@rkbala IO๋Š” ๋‚ด๊ฐ€ ๊ทธ ๊ตฌ๋ฌธ์ด ํ•„์š”ํ•œ ์ด์œ ๋ฅผ ๊ธฐ์–ตํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ์ ์„ ๋ถ„๋ช…ํžˆ ํ•ด์•ผ ํ•˜์ง€๋งŒ ๋‹น์‹œ์—๋Š” ๋‚ด ์•ฑ์ด TLS1.2๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ๋” ๋‚ฎ์€ ๋ฒ„์ „์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด OP_NO_* ์˜ต์…˜์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

@rkbala ๋น„ํŠธ ๋‹จ์œ„ ๋˜๋Š” ์—ฐ์‚ฐ์ด ํ•„์š”ํ•œ ์ด์œ ๋ฅผ ๊ธฐ์–ตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

TLS 1.2์™€ ํ˜ธํ™˜๋˜๋Š” ์•”ํ˜ธ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ ๊ฒฝ์šฐ์—๋Š” ์•ฑ์—์„œ Slack๊ณผ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋Š” API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ Slackbot์ด ์‚ฌ์šฉํ•˜๋Š” ์•”ํ˜ธ๋ฅผ ์ง€์›ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด gunicorn์ด ๊ธฐ๋ณธ ํŒŒ์ด์ฌ ์•”ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ์ •์ •ํ•˜์‹ญ์‹œ์˜ค.

๋˜ํ•œ ์œ„์˜ ํ”Œ๋ผ์Šคํฌ ์ฝ”๋“œ๋Š” gunicorn์ด TLSv1.2์—์„œ๋งŒ ํ”Œ๋ผ์Šคํฌ ์•ฑ์„ ์‹œ์ž‘ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๊นŒ? ์งˆ๋ฌธ์€ gunicorn์„ ํ†ตํ•ด ํ”Œ๋ผ์Šคํฌ ์•ฑ์„ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์˜ค๋Š˜ gunicorn ํ„ฐ๋ฏธ๋„ ๋ช…๋ น "gunicorn โ€”ssl-version TLSV1_2 project:app "์ด tls v1.2์—์„œ ํ”Œ๋ผ์Šคํฌ ์•ฑ์„ ์‹œ์ž‘ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๋ฐฉ๋ฒ•์ด ๋” ํšจ์œจ์ ์ž…๋‹ˆ๊นŒ?

์˜ˆ, TLS 1.2๋งŒ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์€ AFAIK์—์„œ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ง€๋งŒ ๋ช…๋ น์ค„ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์Šคํฌ๋ฆฝํŠธ์˜ ์˜ต์…˜์ด ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฒฐ์ฝ” gunicorn์˜ ์ „๋ฌธ๊ฐ€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ ๋‚ด ์ถฉ๊ณ ๋ฅผ ํ•œ ์•Œ์˜ ์†Œ๊ธˆ์œผ๋กœ ๋ฐ›์•„๋“ค์ด์‹ญ์‹œ์˜ค.

์˜ˆ, TLS 1.2๋งŒ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์€ AFAIK์—์„œ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ง€๋งŒ ๋ช…๋ น์ค„ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์Šคํฌ๋ฆฝํŠธ์˜ ์˜ต์…˜์ด ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฒฐ์ฝ” gunicorn์˜ ์ „๋ฌธ๊ฐ€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ ๋‚ด ์ถฉ๊ณ ๋ฅผ ํ•œ ์•Œ์˜ ์†Œ๊ธˆ์œผ๋กœ ๋ฐ›์•„๋“ค์ด์‹ญ์‹œ์˜ค.

@pixelrebel ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰