Asciinema: CentOS (Python 3.4)์—์„œ 4kb ์ด์ƒ์˜ ๋ ˆ์ฝ”๋”ฉ ์—…๋กœ๋“œ์— ๋Œ€ํ•œ ์ž˜๋ชป๋œ ์š”์ฒญ

์— ๋งŒ๋“  2017๋…„ 06์›” 07์ผ  ยท  58์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: asciinema/asciinema

๋ฒ„๊ทธ ์‹ ๊ณ 

์‹œ์Šคํ…œ ์ •๋ณด :

  • ์‚ฌ์šฉ ๋œ ๋ฒ„์ „ : 1.4.0 (1.1.1์—๋„ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ)
  • OS : CentOS Linux ๋ฆด๋ฆฌ์Šค 7.3.1611
  • Python ๋ฒ„์ „ : Python 3.4.5
  • ๋„๊ตฌ ์„ค์น˜ : yum (EPEL ์ €์žฅ์†Œ์—์„œ)

์žฌํ˜„ ๋‹จ๊ณ„ :

  1. asciinema upload asciicast.json

์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘ :

asciinema.org์— ์—…๋กœ๋“œ ๋œ ํŒŒ์ผ

์‹ค์ œ ํ–‰๋™ :

ํด๋ผ์ด์–ธํŠธ ์ธ์‡„ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ :

Error: Invalid request: <html><body><h1>400 Bad request</h1>
Your browser sent an invalid request.
</body></html>

์ถ”๊ฐ€ ์ •๋ณด:

zsh (์ œ ๊ฒฝ์šฐ์—๋Š” 4.3.11 (x86_64-redhat-linux-gnu) )๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  oh-my-zsh๋ฅผ ์„ค์น˜ํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊นจ์ง„ ๋…น์Œ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. oh-my-zsh๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋˜๊ฑฐ๋‚˜ bash๊ฐ€ ์…ธ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฌธ์ œ์—†์ด ๋…น์Œ์„ ๋งŒ๋“ค๊ณ  ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

JSON ๊ธฐ๋ก : https://gist.github.com/andyone/b2a883e8c3795a6ad393a715ff7a41df

compatibility help wanted hosting

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋ฐฉ๊ธˆ ์ด์ „ ๊ตฌ์„ฑ์œผ๋กœ ๋‹ค์‹œ ์ „ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค (Nginx์—์„œ SSL ์ข…๋ฃŒ). ์ง€๊ธˆ ์ž‘๋™ํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์„ธ์š” @andyone @ThiefMaster @benaryorg @peterbrittain @ThomasWaldmann

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

๋‚˜์—๊ฒŒ๋„ ์ผ์–ด๋‚œ๋‹ค. ZSH๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ OMZ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

$ zsh --version
zsh 5.3.1 (x86_64-pc-linux-gnu)
$ asciinema --version
asciinema 1.4.0

tmpw6byrbv8-asciinema.json

API URL์„ HTTPS์—์„œ HTTP๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ชจ๋‘ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

์–ด์ œ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ๊ตฌ์„ฑ์„ ๋ณ€๊ฒฝํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ด€๋ จ์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ Centos 7 Vagrant VM์—์„œ ์žฌํ˜„ ํ•  ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์–ด์ œ๋ถ€ํ„ฐ ์‚ฌ์šฉํ–ˆ๋˜ Brightbox๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ (SSL ์ข…๋ฃŒ, ์ž๋™ Let 's Encrypt ์ธ์ฆ์„œ ํฌํ•จ)์™€ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@andyone @ThiefMaster ์ง€๊ธˆ ์‹œ๋„ํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚ด๊ฐ€ ํ•ด๊ฒฐํ–ˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ 400 ์ 

OpenSSL ๊ด€๋ จ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. curl์€ SSL / TLS ์ž‘์—…์„ ์œ„ํ•ด NSS (Network Security Services)๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— curl์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

Brightbox๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ์‚ฌ์šฉ

nginx ๊ธฐ๋ฐ˜ ์†”๋ฃจ์…˜์ž…๋‹ˆ๊นŒ?

@andyone Brightbox๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๊ฐ€ Haproxy๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ์ผ๊ด€๋˜๊ฒŒ ์žฌํ˜„ ํ•  ์ˆ˜์žˆ๋‹ค. Vagrantfile ๋ฐ ์ง€์นจ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. https://github.com/sickill/bb-lb-400

@andyone ๋ฌธ์ œ๋Š” ๋…น์Œ ์—์„œ์ด ํŠน์ • ์ค„์ด ์•„๋‹Œ ์—…๋กœ๋“œ ๋œ json ํŒŒ์ผ์˜ ์ „์ฒด ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค.

์ด ๊ตฌ์„ฑ ์œผ๋กœ webkaos๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ https://ascii.kaos.io ํ”„๋ก์‹œ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค ( BoringSSL๋กœ ํ–ฅ์ƒ๋œ nginx). My ๋ฐ @ThiefMaster ๋…น์Œ์ด์ด ํ”„๋ก์‹œ๋ฅผ ํ†ตํ•ด ์„ฑ๊ณต์ ์œผ๋กœ ์—…๋กœ๋“œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ ๋‚ด๊ฐ€ ์•„๋Š” ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

HTTP ์š”์ฒญ์€ Brightbox ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ๋ฅผ ํ†ตํ•ด ์ž˜ ์ง„ํ–‰๋˜์ง€๋งŒ HTTPS ์š”์ฒญ์€ 400 ๊ฐœ์˜ ์ž˜๋ชป๋œ ์š”์ฒญ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
์š”์ฒญ ๋ณธ๋ฌธ ์ด ์•ฝ 4KB๋ณด๋‹ค ํฐ ์š”์ฒญ์˜ ๊ฒฝ์šฐ.

ํฅ๋ฏธ๋กœ์šด ๊ฒƒ์€ CentOS์—์„œ HTTPS ์šฉ์œผ๋กœ 400 ๊ฐœ๋ฅผ ๋ฐ›๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. macOS์—์„œ HTTPS๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. (HTTP๋Š” ๋ชจ๋“  ๊ณณ์—์„œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค).

๋‚˜๋Š” ๋” ๊นŠ์ด ๋“ค์—ฌ๋‹ค ๋ณด๋ฉฐ ์ฐจ์ด์ ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„ ๋ณด๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” tcpdump๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ CentOS์™€ macOS ๋ชจ๋‘์—์„œ ์š”์ฒญ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค (HTTP, ์š”์ฒญ ์ž์ฒด๊ฐ€ HTTPS์—์„œ์™€ ๋™์ผํ•œ ํ˜•์‹์ด๋ผ๊ณ  ๊ฐ€์ •).

์œ ์ผํ•œ ์ฐจ์ด์ ์€ macOS์—์„œ๋Š” ๋ณธ๋ฌธ ์•ž์— 2 ๊ฐœ์˜ ๋นˆ ์ค„, CentOS์—์„œ๋Š” 1 ๊ฐœ์˜ ๋นˆ ์ค„์ž…๋‹ˆ๋‹ค (์•„๋งˆ๋„ ์ด๋Ÿฌํ•œ OS์—์„œ Python 3๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” urllib ๋ฒ„์ „์ด ์•ฝ๊ฐ„ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ์Œ).

CentOS :

POST /api/asciicasts HTTP/1.1
Accept-Encoding: identity
User-Agent: asciinema/1.4.0 CPython/3.4.5 Linux/3.10.0-514.16.1.el7.x86_64-x86_64-with-centos-7.3.1611-Core
Authorization: Basic <61 bytes of base64 encoded credentials>
Content-Length: 13582
Content-Type: multipart/form-data; boundary=c3f4e35afa4a4ce6b65b6420da09b46e
Connection: close
Host: asciinema.org

--c3f4e35afa4a4ce6b65b6420da09b46e
Content-Disposition: form-data; name="asciicast"; filename="asciicast.json"
Content-Type: application/json

<about 13 kb of json>

๋งฅ OS:

POST /api/asciicasts HTTP/1.1
Accept-Encoding: identity
Content-Length: 13582
Host: asciinema.org
User-Agent: asciinema/1.4.0 CPython/3.6.1 Darwin/16.5.0-x86_64-i386-64bit
Content-Type: multipart/form-data; boundary=71d5b757e9d1451b9540dc286f74207d
Authorization: Basic <61 bytes of base64 encoded credentials>
Connection: close


--71d5b757e9d1451b9540dc286f74207d
Content-Disposition: form-data; name="asciicast"; filename="asciicast.json"
Content-Type: application/json

<about 13 kb of json>

๊ทธ๊ฒƒ์ด ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€๋ณด๊ธฐ ์œ„ํ•ด LB์˜ "์š”์ฒญ ๋ฒ„ํผ ํฌ๊ธฐ"๋ฅผ 4096 (๊ธฐ๋ณธ๊ฐ’)์—์„œ 8192 (์ตœ๋Œ€)๋กœ ์ผ์‹œ์ ์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ๊ณ  ๊ฐ‘์ž๊ธฐ ๋ชจ๋“  OS (๋ชจ๋“  OS, HTTPS)์—์„œ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฒ„ํผ ํฌ๊ธฐ๊ฐ€ 4096์ด๋ฉด ์ด๊ฒƒ์ด ์‚ฌ์‹ค์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ๊ถ๊ทน์  ์ธ ์†”๋ฃจ์…˜์ด๋ผ๊ณ  ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฌธ์ œ์—†์ด 3MB ๋ณธ๋ฌธ์œผ๋กœ POST ์š”์ฒญ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    macOS์˜ HTTPS
  • ๋”ฐ๋ผ์„œ์ด ๋ฒ„ํผ ํฌ๊ธฐ๋Š” ์š”์ฒญ ๋ณธ๋ฌธ์ด ์•„๋‹Œ ํ—ค๋” ์šฉ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค (Brightbox์˜ John์ด ํ™•์ธ ํ•จ).
  • ๋‚˜๋Š” ๋ฌธ์ œ์—†์ด <4KB ๋ณธ๋ฌธ์œผ๋กœ POST ์š”์ฒญ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    CentOS์˜ HTTPS
  • CentOS์—์„œ HTTPS๋ฅผ ํ†ตํ•ด 4KB ์ด์ƒ์˜ ๋ณธ๋ฌธ์œผ๋กœ POST ์š”์ฒญ์„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์œ„์˜ ๋‚ด์šฉ์€ ํ—ค๋”์—๋งŒ ์ ์šฉ๋˜๋Š” ๋ฒ„ํผ์— ๋Œ€ํ•œ ๋‚ด ๊ฐ€์ •๊ณผ ๋ชจ์ˆœ๋ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ๊ฒฝ์šฐ์— ์š”์ฒญ ํ—ค๋”๊ฐ€ ์ž‘์Œ (~ 330 ๋ฐ”์ดํŠธ)

"์š”์ฒญ ๋ฒ„ํผ ํฌ๊ธฐ"๋ฅผ 8192๋กœ ๋Š˜๋ฆฌ๋ฉด ๋ณธ๋ฌธ ํฌ๊ธฐ์™€ ํ”„๋กœํ† ์ฝœ์ด
์ค‘์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋ชจ๋“  ๊ฒƒ์ด ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ถ€๋”ชํ˜€์„œ
8192๋กœ ์‹œ๊ฐ„์„ ๋ฒŒ๊ฑฐ๋‚˜ (์˜ํ–ฅ๋ฐ›๋Š” ์‚ฌ๋žŒ์„ ์ค„์ด์‹ญ์‹œ์˜ค)
๋ฌธ์ œ๋ฅผ ์™„์ „ํžˆ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค (๊ทธ๋ ‡๋‹ค๋ฉด ์™œ?).

์ด์— ๋Œ€ํ•ด Brightbox์— ์—ฐ๋ฝํ•˜์—ฌ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์„ค๋ช…ํ•ด ์ค„ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

Brightbox ์ธก์—์„œ 8192 ๋ฒ„ํผ ํฌ๊ธฐ๋ฅผ ๋‹ค์‹œ ์—…๋ฐ์ดํŠธํ•˜์‹ญ์‹œ์˜ค.์ด ๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด CentOS์—์„œ ์ž‘๋™ํ•˜์ง€๋งŒ @ThiefMaster ์—์„œ๋Š” ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

Brightbox LB๋ฅผ ํ†ตํ•ด ํŠธ๋ž˜ํ”ฝ์„ ๋ณด๋‚ด๊ธฐ ์ „์— Nginx์—์„œ SSL์„ ์ข…๋ฃŒํ–ˆ๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ์ˆ˜๋…„ ๋™์•ˆ ์ž˜ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. Nginx๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœํ•˜๋Š” @andyone ์˜ ํ”„๋ก์‹œ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ๊ฒฝ์šฐ Nginx๊ฐ€ ์š”์ฒญ ํ˜•์‹์— ๋Œ€ํ•ด ๋” "์šฉ์„œ"ํ•˜๋Š” ๋ฐ˜๋ฉด Haproxy๋Š” ๋” ์—„๊ฒฉํ•˜๋ฉฐ asciinema ํด๋ผ์ด์–ธํŠธ๋Š” Python 3.4 (๋ฐ ํ•ด๋‹น Mac์—์„œ ์‚ฌ์šฉํ•˜๋Š” 3.6.1๋ณด๋‹ค ์˜ค๋ž˜๋œ urllib).

๋‚˜์ค‘์— Haproxy๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‚ด ๋ฒ„์ „์€ OpenSSL ๋Œ€์‹  LibreSSL๋กœ ๋นŒ๋“œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ํ˜„์žฌ ์ด๋ก ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ—ค๋” ๋ฐ ๋ณธ๋ฌธ ์•ž์˜์ด ๋‹จ์ผ ์ƒˆ ํ–‰์€ LB๊ฐ€ ํ—ค๋” ์ฝ๊ธฐ๋ฅผ ์™„๋ฃŒํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์œผ๋ฉฐ (์ƒˆ ํ–‰ 2 ๊ฐœ ์˜ˆ์ƒ), ๊ทธ ์•„๋ž˜์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํ—ค๋”๋กœ ๊ณ„์† ์ฝ๊ณ  ๋ฐ”์ดํŠธ๋ฅผ ๊ณ„์‚ฐํ•˜๋ฉฐ ๊ฒฐ๊ตญ ํ—ค๋”์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ์ดˆ๊ณผํ•ฉ๋‹ˆ๋‹ค. LB์— bytes_read (์†Œ์ผ“์—์„œ ์ฝ์€ ๋ฐ”์ดํŠธ)์™€ ๊ฐ™์€ ๋ณ€์ˆ˜๊ฐ€ ์žˆ์œผ๋ฉด ํ—ค๋” ์ฝ๊ธฐ๋ฅผ ๋งˆ์นœ ํ›„ ๊ฐ’์„ ํ™•์ธํ•œ ๋‹ค์Œ ๋ณธ๋ฌธ์„ ์ฝ์€ ํ›„ ๋‹ค์‹œ ๋‹ค์‹œ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. <4kb ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜๋ฉด ํ—ค๋”์— ๋Œ€ํ•œ 4kb ์ œํ•œ์„ ์ดˆ๊ณผํ•˜์ง€ ์•Š์œผ๋ฉฐ> 4kb๋ฅผ ์—…๋กœ๋“œํ•˜๋ฉด ์ดˆ๊ณผํ•ฉ๋‹ˆ๋‹ค.
(๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ HTTPS์—์„œ๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค)

๊ทธ๊ฒŒ ์‚ฌ์‹ค์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์†Œ๋ฆฌ๋‚ด์–ด ์ƒ๊ฐ ๋งŒ ํ•ด์š” ๐Ÿ˜€

์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์ƒˆ ์ค„์„ ์ถ”๊ฐ€ํ•˜๊ณ  CentOS์—์„œ ํ™•์ธํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„์˜ ์ด๋ก ์€ ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ HTTPS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” CentOS์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

curl -v -X POST -u $USER:api-token https://asciinema.org/api/asciicasts -F [email protected]

* About to connect() to asciinema.org port 443 (#0)
*   Trying 109.107.38.233...
* Connected to asciinema.org (109.107.38.233) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
* SSL connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate:
*   subject: CN=asciinema.org
*   start date: Jun 07 09:12:00 2017 GMT
*   expire date: Sep 05 09:12:00 2017 GMT
*   common name: asciinema.org
*   issuer: CN=Let's Encrypt Authority X3,O=Let's Encrypt,C=US
* Server auth using Basic with user 'vagrant'
> POST /api/asciicasts HTTP/1.1
> Authorization: Basic <...hidden...>
> User-Agent: curl/7.29.0
> Host: asciinema.org
> Accept: */*
> Content-Length: 5658
> Expect: 100-continue
> Content-Type: multipart/form-data; boundary=----------------------------6ca3f3de6469

๊ทธ๋ ‡๋‹ค๋ฉด Python์—์„œ ์‚ฌ์šฉํ•˜๋Š” SSL lib๊ฐ€ curl๊ณผ ๋‹ค๋ฅด๊ณ  ๋ฌธ์ œ๊ฐ€ SSL ์˜์—ญ ์–ด๋”˜๊ฐ€์— ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋„ ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•ด. Python์€ OpenSSL์„ ์‚ฌ์šฉํ•˜๊ณ  curl์€ NSS๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

@andyone ascii.kaos.io ์˜ ์ธ์ฆ์„œ๋Š” Let 's Encrypt๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

RapidSSL SHA256withRSA

์ผ๋ฐ˜์ ์œผ๋กœ CentOS์— Let 's Encrypt (๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๐Ÿ˜Š)์— ๋Œ€ํ•œ ๋ฃจํŠธ ์ธ์ฆ์„œ๊ฐ€ ๋ˆ„๋ฝ๋˜์–ด ์žˆ์ง€๋งŒ SSL ์—ฐ๊ฒฐ์ด ์ด๋ฃจ์–ด์ง€๊ณ  ์˜ค๋ฅ˜๊ฐ€ HTTP ํ”„๋กœํ† ์ฝœ ์ˆ˜์ค€ (400 Bad Request)์— ์žˆ์œผ๋ฏ€๋กœ ... ๐Ÿ‘

Let 's Encrypt์˜ ๋ฃจํŠธ ์ธ์ฆ์„œ๊ฐ€ ์—†์œผ๋ฉด curl์—์„œ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

(Brightbox)๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋Š” ์‹ค์ œ๋กœ haproxy๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. HTTP RFC ๋ฐ haproxy ๋ฌธ์„œ๋Š” ํ—ค๋”๋ฅผ ๋ณธ๋ฌธ์—์„œ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐ ํ•˜๋‚˜์˜ CRLF๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.

https://github.com/haproxy/haproxy/blob/master/doc/internals/http-parsing.txt

์—ฌ๊ธฐ์—์„œ ์ „์ฒด CRLF๊ฐ€ ์•„๋‹Œ CR ๋˜๋Š” LF ๋งŒ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@sickill ์ด๊ฒƒ์€ LibreSSL 2.5.0- https: //ascii-ha.kaos.io๋ฅผ ์‚ฌ์šฉ ํ•˜๋Š” HA-Proxy 1.7.5์˜ ํ”„๋ก์‹œ ์ž…๋‹ˆ๋‹ค. My ๋ฐ @ThiefMaster ๋…น์Œ๊ณผ ์ €์žฅ์†Œ์˜ over-4k.json ์ด์ด ํ”„๋ก์‹œ๋ฅผ ํ†ตํ•ด ์„ฑ๊ณต์ ์œผ๋กœ ์—…๋กœ๋“œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@andyone ์ข‹์•„์š”. ๊ทธ๋ ‡๋‹ค๋ฉด tune.bufsize (https://cbonte.github.io/haproxy-dconv/1.7/configuration.html#3.2-tune.bufsize)๋ฅผ 4096์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@johnl CRLF๋ฅผ ํ™•์ธํ–ˆ๊ณ  ์—ฌ๊ธฐ์—์„œ ๋ชจ๋‘ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

๋‹ค์‹œ CentOS์™€ macOS ๋ชจ๋‘์—์„œ ์š”์ฒญ์„ tcpdumpedํ–ˆ์Šต๋‹ˆ๋‹ค (HTTP ํŽ˜์ด๋กœ๋“œ๊ฐ€ HTTPS์— ๋Œ€ํ•ด ๋™์ผํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  HTTP๋ฅผ ํ†ตํ•ด).

dump-centos.pcap.txt ๋ฐ dump-mac.pcap.txt์—๋Š” tcpdump ์บก์ฒ˜ ( tcpdump -s 0 dst port 80 -w dump-centos.pcap.txt )๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
dump-centos-hex.txt ๋ฐ dump-mac-hex.txt์—๋Š” 16 ์ง„ ํ˜•์‹์˜ ๋คํ”„๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค ( hexdump -C ).

dump-centos-hex.txt
dump-centos.pcap.txt
dump-mac-hex.txt
dump-mac.pcap.txt

๋‘ OS ๋ชจ๋‘์—์„œ ์ƒˆ ์ค„์— ์‚ฌ์šฉ๋˜๋Š” CRLF๊ฐ€ ์žˆ๊ณ  ํ—ค๋”์™€ ๋ณธ๋ฌธ ์‚ฌ์ด์— ํ•˜๋‚˜์˜ ๋นˆ ์ค„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์™ผ์ชฝ CentOS, ์˜ค๋ฅธ์ชฝ macOS :

centos-mac-comparison

@sickill ๊ตฌ์„ฑ์ด ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. over-4k.json ์—…๋กœ๋“œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@andyone ์—…๋ฐ์ดํŠธ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. X-Forwarded-Proto ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค (๋ฐ˜ํ™˜ ๋œ ๋…นํ™” URL์ด http:// ์ด๋ฏ€๋กœ). http-request set-header X-Forwarded-Proto https if { ssl_fc } ๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ๋‚ด ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค.

frontend www-https
    bind 207.154.241.251:443 ssl crt /etc/ssl/private/kaos.pem
    reqadd X-Forwarded-Proto:\ https
    default_backend www-backend

backend www-backend
    server asciinema-backend asciinema.org:80

์ด ์ค„์„ ์–ด๋””์— ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

@andyone backend ์„น์…˜์œผ๋กœ ์ด๋™ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (๋‚˜๋Š” haproxy ์ „๋ฌธ๊ฐ€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค).

@andyone btw, ๋””๋ฒ„๊ทธ๋ฅผ ๋„์™€ ์ฃผ์…”์„œ ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์•ž์œผ๋กœ๋„ ์žŠ์ง€ ๋งˆ์„ธ์š”. ์ด๊ฒƒ์€ SSL ์•”ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์ •์„ ๋งค์šฐ ๋ฐ€์ ‘ํ•˜๊ฒŒ ๋ณต์ œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

    tune.bufsize 4096
    tune.ssl.default-dh-param 2048
    tune.maxrewrite 40

frontend www-https
    bind 207.154.241.251:443 ssl no-sslv3 crt /etc/ssl/private/kaos.pem ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
    reqadd X-Forwarded-Proto:\ https
    default_backend www-backend

backend www-backend
    server asciinema-backend asciinema.org:80
    mode http
    option forwardfor
    option httplog

๋‚˜๋Š” ์ด๊ฒƒ์œผ๋กœ ๊ตฌ์„ฑ์„ ์ˆ˜์ •ํ–ˆ์ง€๋งŒ ์šด์ด ์—†๋‹ค.

    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option                  http-server-close
    option                  forwardfor
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

frontend www-https
    bind 207.154.241.251:443 ssl crt /etc/ssl/private/kaos.pem
    reqadd X-Forwarded-Proto:\ https
    default_backend www-backend

backend www-backend
    http-request set-header X-Forwarded-Proto https
    server asciinema-backend asciinema.org:80

ํด๋ผ์ด์–ธํŠธ๋Š” ์—ฌ์ „ํžˆ http:// ๋งํฌ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์œ ์šฉํ•œ ์„œ๋น„์Šค๋ฅผ ๊ฐœ์„  ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ญ์ƒ ๊ธฐ๊บผ์ด ๋„์™€ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค ๐Ÿ˜‰.

@johnl ์ด๊ฒƒ์€ ์ „์ฒด ๊ตฌ์„ฑ์ด๋ฉฐ ๋ชจ๋“  ํ•„์ˆ˜ ์˜ต์…˜์€ defaults ๋ฐ global ์„น์…˜์—์„œ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

    log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

    tune.bufsize 4096

    # SSL configuration
    tune.ssl.default-dh-param 2048
    ssl-default-bind-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:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
    ssl-default-bind-options no-sslv3 no-tlsv10 no-tlsv11 no-tls-tickets
    ssl-default-server-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:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
    ssl-default-server-options no-sslv3 no-tlsv10 no-tlsv11 no-tls-tickets

    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats

defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option                  http-server-close
    option                  forwardfor
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

frontend www-https
    bind 207.154.241.251:443 ssl crt /etc/ssl/private/kaos.pem
    reqadd X-Forwarded-Proto:\ https
    default_backend www-backend

backend www-backend
    http-request set-header X-Forwarded-Proto https
    server asciinema-backend asciinema.org:80

@andyone ์˜ haproxy ๊ตฌ์„ฑ์ด ์ด์ œ BB์— ๋งค์šฐ ๊ฐ€๊น๊ณ  ์—ฌ์ „ํžˆ ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ ํ•  ์ˆ˜์—†๋Š” ๊ฒฝ์šฐ https://ascii-ha.kaos.io ์™€ https://asciinema.org ์˜ ์ฐจ์ด์  ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค

์ด๊ฒƒ์€ https://ascii-ha.kaos.io ์™€ https://asciinema.org ์˜ ์ฐจ์ด์  ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค

์•„๋‹ˆ์š”. BB LB๋Š” OpenSSL๋กœ ๊ตฌ์ถ• ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์ €๋Š” LibreSSL์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค).

https://ascii-ha.kaos.io์— Let 's Encrypt ์ธ์ฆ์„œ๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค

์™„๋ฃŒ-https: //ascii.kaos.re
HA-Proxy 1.7.5 (LibreSSL 2.5.0 ํฌํ•จ) + Let 's Encrypt ์ธ์ฆ์„œ (Certbot์—์„œ ์ƒ์„ฑ)
๊ตฌ์„ฑ :

    tune.bufsize 4096
    tune.ssl.default-dh-param 2048
    tune.maxrewrite 40

frontend www-https
    bind 207.154.241.251:443 ssl no-sslv3 crt /etc/ssl/private/ascii.kaos.re.pem ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
    reqadd X-Forwarded-Proto:\ https
    default_backend www-backend

backend www-backend
    server asciinema-backend asciinema.org:80
    mode http
    option forwardfor
    option httplog

๋ชจ๋“  ๊ฒƒ์ด ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. over-4k.json ์—…๋กœ๋“œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•œ ๋” ์ด์ƒ์˜ ์•„์ด๋””์–ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ๋ฐ SSL ์ข…๋ฃŒ๋ฅผ ์œ„ํ•ด ์ž์ฒด Nginx ์ธ์Šคํ„ด์Šค๋กœ ๋กค๋ฐฑํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ ค ์ค‘์ž…๋‹ˆ๋‹ค ๐Ÿค•

๋ฌธ์ œ๋ฅผ ์žฌํ˜„ ํ•  ์ˆ˜์žˆ๋Š” ๋‹จ์ผ curl ๋ช…๋ น์œผ๋กœ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ ํ•˜์ง€๋งŒ ์•„์ง ๊ด€๋ฆฌํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋“ ์ง€ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

curl์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆ ์‚ฌ์šฉ์ž ์ด๋ฆ„ / ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ 5k ๋ณธ๋ฌธ์„ ๊ฒŒ์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. netcat ์›น ์„œ๋ฒ„ ๋ฐฑ์—”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Brightbox๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›์‹œ ์š”์ฒญ ํ…์ŠคํŠธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ ํ†ต๊ณผ-์ž˜๋ชป๋œ ์š”์ฒญ ์‘๋‹ต์„ ํŠธ๋ฆฌ๊ฑฐ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ์— ์˜ํ•ด ๊ฑฐ๋ถ€๋˜๋Š” ๊ฒฝ์šฐ ๋ฐฑ์—”๋“œ์— ์•ฑ์˜ ์‹ค์ œ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋ฉ€์–ด์ง€์ง€ ์•Š์•„์•ผํ•˜๋ฏ€๋กœ ์•ฑ์—†์ด curl๋กœ์ด๋ฅผ ์žฌํ˜„ ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ถ„ํˆฌ์™€ centos7์—์„œ ๊ทธ๋ฆฌ๊ณ  ํŠน๋ณ„ํžˆ openssl์„ ์‚ฌ์šฉํ•˜์—ฌ curl์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค (์‚ฌ์šฉํ•  sslib lib๋ฅผ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•ด curl์— --engine ๋ช…๋ น์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. centos7 curl ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์˜ต์…˜์— ๋Œ€ํ•ด ๋นŒ๋“œ๋ฉ๋‹ˆ๋‹ค)

@johnl ์ด๊ฒƒ์„ ์กฐ์‚ฌํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ์šฉ ๋ฐฑ์—”๋“œ๋กœ netcat์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค ๐Ÿ‘

asciinema upload over-4k.json ํ•ด๋‹นํ•˜๋Š” curl์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

curl -v -X POST -u test:uuid4 https://asciinema.org/api/asciicasts -F [email protected]

( uuid4 ๋ฅผ python3 -c 'import uuid; print(uuid.uuid4())' ์˜ ๊ฒฐ๊ณผ๋กœ ๋Œ€์ฒด)

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ์‹ค์ œ๋กœ ์ปฌ๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค ...

asciinema upload tcpdump์™€ ์œ„์˜ curl์„ ๋น„๊ตํ–ˆ๋Š”๋ฐ HTTP ํ”„๋กœํ† ์ฝœ ์ˆ˜์ค€์—์„œ ์˜์‹ฌ์Šค๋Ÿฌ์šด ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ถ€ tcp ํ”„๋ ˆ์ž„์€ ๋‹ค๋ฅธ ์œ„์น˜์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค (๊ฐ tcp ํŒจํ‚ท์— ๋” ๋งŽ๊ฑฐ๋‚˜ ์ ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ „์†ก / ์ ํ•ฉ ๋  ์ˆ˜ ์žˆ์Œ).

CentOS 7 VM์—์„œ tcpflow๋กœ HTTP ์š”์ฒญ (http://asciinema.org๋กœ)์„ ์บก์ฒ˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

sudo tcpflow -p -C -i eth0 port 80 >tcpflow-req.txt

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋™์ผํ•œ VM์˜ ๋‹ค๋ฅธ ์…ธ์—์„œ ๋‹ค์Œ์„ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

ASCIINEMA_API_URL=http://asciinema.org asciinema upload /vagrant/over-4k.json

์‘๋‹ต์„ ๋Š๊ณ  ์š”์ฒญ ๋งŒ ๋‚จ๊ฒผ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ์ „์†ก๋˜๋Š” ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. tcpflow-req.txt

์ด ์บก์ฒ˜ ๋œ HTTP ์š”์ฒญ์„ asciinema์— ๋Œ€ํ•ด ์žฌ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. org : 80 with nc :

bash-4.4$ (cat tcpflow-req.txt; cat) | nc asciinema.org 80
HTTP/1.1 201 Created
Server: nginx
Date: Mon, 12 Jun 2017 13:30:03 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 48
Connection: close
Status: 201 Created
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Location: http://asciinema.org/a/4lgbbik7li4ywzqrfak0e7eku
ETag: "9beb7ac6bb5981f06fdc71df3947d8b0"
Cache-Control: max-age=0, private, must-revalidate
X-Request-Id: 2a8a8c75-ed06-4741-9adb-e5d276032ded
X-Runtime: 0.360858
Vary: Accept-Encoding
Strict-Transport-Security: max-age=15768000

http://asciinema.org/a/4lgbbik7li4ywzqrfak0e7eku

๋ฌธ์ œ ์—†๋‹ค.

์ด์ œ SSL์„ ํ†ตํ•ด asciinema๋กœ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. org : 443 :

(cat tcpflow-req.txt; cat) | openssl s_client -connect asciinema.org:443

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

CONNECTED(00000003)
depth=1 /C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
 0 s:/CN=asciinema.org
   i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
 1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
   i:/O=Digital Signature Trust Co./CN=DST Root CA X3
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIFFDCCA/ygAwIBAgISBDhrp0YwV5NtleFOG+Zj61lQMA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xNzA2MDcwOTEyMDBaFw0x
NzA5MDUwOTEyMDBaMBgxFjAUBgNVBAMTDWFzY2lpbmVtYS5vcmcwggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQC+/g237mVels4G9blsZlaeeiURbSp22eGO
T5OZ5As9NyuxSvRVEJrs4xk/RBEkCVgeZspSOmkRLwXG+FSMtjhbqIUt73AUKMdm
4DG+OwkVxjZatskL0wUWRcU7DmyW/Ls/OFJpPPcZ+pqu/v/ek99EiVNoAHJzXMXJ
ZsWy5KLE3fhkrlyMvdIkOkCK5zHOT95t0i8OmdaPIekPBa57VhvnDlUJsYyCF9GN
mP8Qg6OygexyULJGqBwiZ0BN2J6cYwChUlSvqFnkL4OzfixZ+mItuhl1b1vx/N5K
XMtPiM+nc/S+/liIWgtt7HIy9NmrOtSKbPTh3Bv/rfNdaiYx5CUHAgMBAAGjggIk
MIICIDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUF
BwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFNAMhQNNwl+/bJjml9hrrHYzBxbf
MB8GA1UdIwQYMBaAFKhKamMEfd265tE5t6ZFZe/zqOyhMG8GCCsGAQUFBwEBBGMw
YTAuBggrBgEFBQcwAYYiaHR0cDovL29jc3AuaW50LXgzLmxldHNlbmNyeXB0Lm9y
ZzAvBggrBgEFBQcwAoYjaHR0cDovL2NlcnQuaW50LXgzLmxldHNlbmNyeXB0Lm9y
Zy8wLwYDVR0RBCgwJoINYXNjaWluZW1hLm9yZ4IVc3RhZ2luZy5hc2NpaW5lbWEu
b3JnMIH+BgNVHSAEgfYwgfMwCAYGZ4EMAQIBMIHmBgsrBgEEAYLfEwEBATCB1jAm
BggrBgEFBQcCARYaaHR0cDovL2Nwcy5sZXRzZW5jcnlwdC5vcmcwgasGCCsGAQUF
BwICMIGeDIGbVGhpcyBDZXJ0aWZpY2F0ZSBtYXkgb25seSBiZSByZWxpZWQgdXBv
biBieSBSZWx5aW5nIFBhcnRpZXMgYW5kIG9ubHkgaW4gYWNjb3JkYW5jZSB3aXRo
IHRoZSBDZXJ0aWZpY2F0ZSBQb2xpY3kgZm91bmQgYXQgaHR0cHM6Ly9sZXRzZW5j
cnlwdC5vcmcvcmVwb3NpdG9yeS8wDQYJKoZIhvcNAQELBQADggEBABxmJxdQQCcy
FpCkiDrB+vonBUCLYSJtrFkmRdmj9W8/ADpC6M/EhYFOCgrO2cmhYfy1SxDAP5Hd
KIhd3p1F931MMXVcxYt2n6FiDJHN531qp6eBzjZsVIgHXS27PAV466IIMTydNQSe
reyDc9fi+q+ji1Gz89nI8lHIOlRt3dzVGT2J3oQidsm4ZuPNJFj4y8MUrbUAOOH6
YY4n395OKV7vWzl7VPKiCWx+zsv4bzr6IGUPlwqCN2e6cppPWE47ugnYsarINCHO
ie5lU4E2N0k2qVWe/+uYbwSUQ0nrEx8R078m6+6EjDkR4VLboLjuV5tGBgHsJLQB
CmLH6CmNCRE=
-----END CERTIFICATE-----
subject=/CN=asciinema.org
issuer=/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
---
No client certificate CA names sent
---
SSL handshake has read 3436 bytes and written 456 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES128-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : DHE-RSA-AES128-SHA
    Session-ID: AC26CBF8D3719B1DE709A9A8AEAB43D20B14C62085A74604338C512CEA4472C5
    Session-ID-ctx:
    Master-Key: 0C59B1A2B6802D35FAD26DEE139043A853F3E62787E9AA743A8CAFDA95744DB73AB42B511F37EA7D6BB398A352938551
    Key-Arg   : None
    Start Time: 1497273777
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---
HTTP/1.0 400 Bad request
Cache-Control: no-cache
Connection: close
Content-Type: text/html

<html><body><h1>400 Bad request</h1>
Your browser sent an invalid request.
</body></html>

/ cc @johnl

@sickill https://ascii.kaos.re์—์„œ ๋™์ผํ•œ ์š”์ฒญ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ

@andyone์ด ๋ฐฉ๊ธˆ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. (cat tcpflow-req.txt; cat) | openssl s_client -connect ascii.kaos.re:443 ์„ฑ๊ณต์ ์œผ๋กœ ์—…๋กœ๋“œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ๊ธฐ์„œ ๋” ๋งŽ์€ ๊ฒƒ์„ ํŒŒํ—ค ์ณค๋‹ค. centos7์˜ curl์€ nss๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ wget์€ openssl์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. curl ๋˜๋Š” wget์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ฑ๊ณต์ ์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. python httpie ๋„๊ตฌ (python 3 ์•„๋ž˜)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด๋‚ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ stdin์„ ํ†ตํ•ด openssl s_client๋กœ ๋ณด๋‚ด๋Š” ๋ฐ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ stdin์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ์š”์ฒญ์„ ๋ถ™์—ฌ ๋„ฃ์–ด openssl s_client๋กœ ์ „์†กํ•˜๋Š” ๋ฐ ์„ฑ๊ณตํ•ฉ๋‹ˆ๋‹ค!

๋‚˜๋Š” ์ด๊ฒƒ์ด ํ•„์š”ํ•œ CRLF ๋ผ์ธ ์—”๋”ฉ์ด ์•„๋‹Œ LF ๋ผ์ธ ์—”๋”ฉ์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ํ™•์‹คํ•˜๋‹ค๊ณ  ํ™•์‹ ํ•˜์ง€๋งŒ, ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” "openssl s_client"๊ฐ€ ๋‚˜์œ ํ…Œ์ŠคํŠธ ๋„๊ตฌ์ด๊ณ  ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์•„์ง nss ๋˜๋Š” openssl์„ ์‚ฌ์šฉํ•˜๋“  ์ ์ ˆํ•œ http ํด๋ผ์ด์–ธํŠธ๋กœ ์ด๊ฒƒ์„ ์žฌํ˜„ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค (์šฐ๋ถ„ํˆฌ์˜ ์ปฌ๋„ openssl์„ ์‚ฌ์šฉํ•˜๊ณ  ์ž˜ ์ž‘๋™ํ•˜๋ฏ€๋กœ ๋‘ ๋ฒˆ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค). ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๊ด€๋ฆฌํ•ฉ๋‹ˆ๊นŒ?

๋ฐฉ๊ธˆ ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์œผ๋ฉฐ์ด ๋ฌธ์ œ๊ฐ€ ์ฝ˜ํ…์ธ  ๊ธธ์ด 4520์œผ๋กœ ์ง€์†๋˜์ง€๋งŒ ๋™์ผํ•œ ์š”์ฒญ์ด 1000 ์ž (๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์กฐ์ • ๋œ Content-Length ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CRLF๋Š” ๋‚ด ๋ชจ๋“  ํ…Œ์ŠคํŠธ์— ์žˆ์œผ๋ฉฐ xxd ๋Š” ํŒŒ์ดํ”„๋ฅผ ํ†ตํ•ด ์ „์†ก๋˜์—ˆ์Œ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
OpenBSD์˜ nc (TLS ์ง€์›)์œผ๋กœ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์„œ์—์„œ :

tune.bufsize
๋ฒ„ํผ ํฌ๊ธฐ๋ฅผ์ด ํฌ๊ธฐ (๋ฐ”์ดํŠธ)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‚ฎ์€ ๊ฐ’์€ ๋” ๋งŽ์€ ๊ฒƒ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค
์„ธ์…˜์ด ๊ฐ™์€ ์–‘์˜ RAM์— ๊ณต์กดํ•˜๊ณ  ๊ฐ’์ด ๋†’์„์ˆ˜๋ก
๋งค์šฐ ํฐ ์ฟ ํ‚ค๊ฐ€์žˆ๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 16384์ด๋ฉฐ
๋นŒ๋“œ์‹œ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค
๋งค์šฐ ๋‚ฎ์€ ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ์„œ๋น„์Šค๋ฅผ ์ค‘๋‹จํ•˜๋ฏ€๋กœ ๊ธฐ๋ณธ๊ฐ’์—์„œ
ํ†ต๊ณ„ ๋ฐ ๊ธฐ๋ณธ ํฌ๊ธฐ๋ณด๋‹ค ํฐ ๊ฐ’์€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.
์‹œ์Šคํ…œ์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ ๊ธ€๋กœ๋ฒŒ maxconn
๋งค๊ฐœ ๋ณ€์ˆ˜๋Š”์ด ๊ฐ’์ด ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์š”์ธ์œผ๋กœ ๊ฐ์†Œ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
HTTP ์š”์ฒญ์ด (tune.bufsize-tune.maxrewrite)๋ณด๋‹ค ํฌ๋ฉด haproxy๊ฐ€
HTTP 400 (์ž˜๋ชป๋œ ์š”์ฒญ) ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ HTTP ์‘๋‹ต์ด ๋” ํฐ ๊ฒฝ์šฐ
์ด ํฌ๊ธฐ๋ณด๋‹ค haproxy๋Š” HTTP 502 (์ž˜๋ชป๋œ ๊ฒŒ์ดํŠธ์›จ์ด)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ „์ฒด ์š”์ฒญ์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ์ฆ‰์‹œ ์ „๋‹ฌ (AFAIK)ํ•˜๊ฑฐ๋‚˜ ์ตœ์†Œํ•œ ์ž„์‹œ ํŒŒ์ผ๋กœ ๋ฒ„ํผ๋งํ•˜๋Š” nginx์™€๋Š” ๋‹ฌ๋ฆฌ.

์ด no option http-buffer-request ์˜ต์…˜ , ์ด๋Š” ๋‚ด๊ฐ€ ํ–‰๋™์ด ์ •ํ™•ํžˆ ๊ทธ ๊ถŒ๋ฆฌ๋ฅผ ๋น„ํ™œ์„ฑํ™” ๊ฐ€์ง€๊ณ ์žˆ๋Š” ๊ฒฝ์šฐ (์ž‘์„ฑ๋œ option http-buffer-request ํ•˜์ง€ ์•Š๊ณ , no ) :

๋•Œ๋•Œ๋กœ HTTP ์š”์ฒญ์˜ ๋ณธ๋ฌธ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•ฉ๋‹ˆ๋‹ค.
๊ฒฐ์ •์„ ๋‚ด๋ฆฝ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ "balance url_param"์— ์˜ํ•ด ์ˆ˜ํ–‰๋˜๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค.
์˜ˆ. ์ฒซ ๋ฒˆ์งธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์ด์ „์— ๋Š๋ฆฐ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋ฒ„ํผ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์„œ๋ฒ„์— ์—ฐ๊ฒฐ. ๋˜ ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋ผ์šฐํŒ…์„ ์ทจํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์š”์ฒญ ๋ณธ๋ฌธ์˜ ๋‚ด์šฉ์— ๋”ฐ๋ผ ๊ฒฐ์ •. ์ด ์˜ต์…˜์€
ํ”„๋ก ํŠธ ์—”๋“œ ๋˜๋Š” ๋ฐฑ์—”๋“œ๋Š” HTTP ์ฒ˜๋ฆฌ๊ฐ€ ์ „์ฒด
๋ณธ๋ฌธ์ด ์ˆ˜์‹ ๋˜์—ˆ๊ฑฐ๋‚˜ ์š”์ฒญ ๋ฒ„ํผ๊ฐ€ ๊ฐ€๋“ ์ฐผ๊ฑฐ๋‚˜ ์ฒซ ๋ฒˆ์งธ ์ฒญํฌ๊ฐ€
์ฒญํฌ ์ธ์ฝ”๋”ฉ์˜ ๊ฒฝ์šฐ ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ์›์น˜ ์•Š๋Š” ๋ถ€์ž‘์šฉ์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
HTTP๋ฅผ ๋‚จ์šฉํ•˜๋Š” ์ผ๋ถ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€
ํ”„๋ŸฐํŠธ ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ๊ฐ€ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ
๊ธฐ๋ณธ.

๋‚˜๋„ ์ณค์–ด. HTTP๋ฅผ ํ†ตํ•ด ์ž‘๋™ํ•˜์ง€๋งŒ HTTPS๊ฐ€ ์•„๋‹Œ ๋™์ผํ•œ ์ฝ˜ํ…์ธ ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ์™€ ํ”„๋ก์‹œ ์‚ฌ์ด์— ๋งŽ์€ ์ถ”๊ฐ€ ํ—ค๋”๊ฐ€ ์ถ”๊ฐ€๋˜์ง€ ์•Š๋Š” ํ•œ ๋ฒ„ํผ ํฌ๊ธฐ๊ฐ€ ์ž˜๋ชป ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ SSL ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•˜๋Š” ๋ฒ„๊ทธ๊ฐ€ ํ—ค๋”๋ฅผ ์•ฝ๊ฐ„ ์†์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด HAProxy์˜ ๋ณด์•ˆ์„ ๋‚ฎ์ถ”์ง€ ๋งŒ ๋œ ์ค€์ˆ˜ํ•˜๋Š” HTTP ํŠธ๋ž˜ํ”ฝ์„ ํ—ˆ์šฉํ•˜๋Š” ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. https://stackoverflow.com/questions/39286346/extra-space-in-http-headers-gives-400-error-on-haproxy๋ฅผ ์ฐธ์กฐ

์ตœ์ข… ์ˆ˜์ •์œผ๋กœ ๋ณด์•ˆ ๊ฐ์†Œ๋ฅผ ์˜นํ˜ธํ•˜์ง€๋Š” ์•Š์ง€๋งŒ์ด๋ฅผ ํ†ตํ•ด ๋””๋ฒ„๊น…ํ•˜๋Š” ๋™์•ˆ ์„œ๋น„์Šค๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๋“ค์˜ Haproxy์˜ ์„ค์ •์„ ์ œ์–ดํ•˜์ง€ ์•Š๋„๋ก ์ˆœ๊ฐ„ asciinema.org์—์„œ @peterbrittain๋Š” Brightbox ํด๋ผ์šฐ๋“œ ๋ถ€ํ•˜ ๋ถ„์‚ฐ ์žฅ์น˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ ์ž์‹ ์˜ Nginx์—์„œ SSL์„ ์ข…๋ฃŒํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์—ˆ์œผ๋ฉฐ ์ œ๋Œ€๋กœ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. BB LB๋กœ ์ „ํ™˜ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค (์ผ๋ถ€). CentOS ๋˜๋Š” ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์—์„œ ๊ฒฝํ—˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์†”์งํžˆ, ์ด์ „ Nginx ๊ธฐ๋ฐ˜ ์†”๋ฃจ์…˜์— ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ SSL ์ธ์ฆ์„œ๊ฐ€ ๋งŒ๋ฃŒ๋˜์–ด Let 's Encrypt๋กœ ๊ฐˆ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. LE ์ธ์ฆ์„œ๋Š” ์ˆ˜๋ช…์ด ์งง๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์œผ๋ฉฐ Brightbox LB๊ฐ€์ด๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. LE ์„ค์ • ์ž‘์—…์„ ์ ˆ์•ฝํ•˜๊ณ  ์‹ถ์—ˆ๊ณ  BB LB๊ฐ€ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜ ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€์Šต๋‹ˆ๋‹ค (asciinema.org๋Š” Brightbox๊ฐ€ ํ›„์›ํ•˜๊ณ  ํ›Œ๋ฅญํ•œ ์ธํ”„๋ผ์—์„œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค). ์ด์ œ Nginx์—์„œ LE๋ฅผ ์ง์ ‘ ์„ค์ •ํ•˜๋ฉด์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์ด๋ฏธ ์†Œ๋น„ ํ•œ ์‹œ๊ฐ„์˜ 1/10์ด ๊ฑธ๋ฆด ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ˜ž๐Ÿ˜ž๐Ÿ˜ž

์•„. ๋‚˜๋Š” ๋ˆ„๊ฐ€ ์–ด๋–ค ๋น„ํŠธ๋ฅผ ์†Œ์œ ํ–ˆ๋Š”์ง€์— ๋Œ€ํ•œ ๋ฏธ๋ฌ˜ํ•จ์„ ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด BB์—์„œ ์ง„๋‹จ์„๋ฐ›์€ ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๋ฆฌ๊ณ  ๊ท€ํ•˜์˜ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋Œ€๋‹ต : ๋‚ด ์ƒ์ž๋Š” CentOS 6 VM์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ asciinema 1.2.0 (์šฐ๋ถ„ํˆฌ 16.04 lts์˜ ๋ฒ„์ „)์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž˜๋ชป๋œ ์š”์ฒญ ๋ฌธ์ œ๋ฅผ ๊ฒฝํ—˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

์œ„์— ์ฃผ์–ด์ง„ ์ปฌ ํ•ดํ‚น์ด ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ ๋™์ผํ•œ ํŒŒ์ผ์ด Gentoo [1] ์ƒ์ž์—์„œ ์ž˜๋ชป๋œ ์š”์ฒญ์„ ์ƒ์„ฑํ•˜์ง€๋งŒ OpenBSD [2] ์ƒ์ž์—์„œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๋ฐฉ๊ธˆ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.
OpenBSD๋Š” ์ž˜ ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
์ด ํด๋ผ์ด์–ธํŠธ๋“ค ๊ฐ„์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์กฐ์‚ฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์  ํˆฌ ๋ฐ•์Šค๋Š”์ด ๋นŒ๋“œ ๋‹น ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŒŒ์ด์ฌ ํƒ€๊ฒŸ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค :

PYTHON_TARGETS="python3_4 -python3_5"

๋‚˜๋Š” ํ˜„์žฌ python3.5๋ฅผ ์‰ฝ๊ฒŒ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์—†์ง€๋งŒ ์•„๋งˆ๋„ ์ด๊ฒƒ์€ ์ด๋ฏธ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŽธ์ง‘ : OpenSSL ๋ฒ„์ „์„ ์ถ”๊ฐ€ํ–ˆ์ง€๋งŒ ์™„์ „ํžˆ ์žŠ์–ด ๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค.

  • asciinema 1.4.0

    • python-exec 2.4.5๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰

    • ์ฐจ๋ก€๋กœ Python 3.4.6 ์‹คํ–‰

  • OpenSSL 1.0.2l 2017 ๋…„ 5 ์›” 25 ์ผ

  • asciinema 1.3.0

    • Python 3.6.0์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰
  • LibreSSL 2.5.2

๋ฐฉ๊ธˆ ์ด์ „ ๊ตฌ์„ฑ์œผ๋กœ ๋‹ค์‹œ ์ „ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค (Nginx์—์„œ SSL ์ข…๋ฃŒ). ์ง€๊ธˆ ์ž‘๋™ํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์„ธ์š” @andyone @ThiefMaster @benaryorg @peterbrittain @ThomasWaldmann

@sickill ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ด์ „์— ์‹คํŒจํ•œ ๋™์ผํ•œ ํŒŒ์ผ์ด๋ผ๊ณ  85 % ํ™•์‹ ํ•˜์ง€๋งŒ ๋งŒ์•ฝ ๊ทธ๋ ‡๋‹ค๋ฉด, ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„

@sickill ์ง€๊ธˆ์€ ๋งค๋ ฅ์ ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ‘

๋„ค, ( asciinema upload ) ๋‚˜์—๊ฒŒ๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌ!

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