ZeroTech์—์„œ Apple Safari์™€ ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ๋ฅผ ์›น์†Œ์ผ“์— ์—ฐ๊ฒฐํ•œ ๋ฐฉ๋ฒ•

์ด ๊ธฐ์‚ฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ๊ณ  ๋ชจ๋ฐ”์ผ Safari์—์„œ ์›น์†Œ์ผ“์ด ํ•„์š”ํ•œ ์ด์œ ๋ฅผ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.
  • ๋‚˜๋Š” ์ œํ•œ๋œ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋งŒ ๋˜๋Š” ๋‚˜ ์ž์‹ ์—๊ฒŒ๋งŒ ์›น ์„œ๋น„์Šค๋ฅผ ๊ฒŒ์‹œํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ๊ฒƒ์€ ์ด๋ฏธ ๋ˆ„๊ตฐ๊ฐ€์— ์˜ํ•ด ์ด๋ฃจ์–ด์กŒ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ, ์„ธ์ƒ์„ ์ข€ ๋” ํŽธ๋ฆฌํ•˜๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์›น์†Œ์ผ“์˜ ์—ญ์‚ฌ๋Š” ์•ฝ 8๋…„ ์ „๋ถ€ํ„ฐ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์—๋Š” ๊ธด http ์š”์ฒญ(์‹ค์ œ ์‘๋‹ต) ํ˜•์‹์œผ๋กœ ๋ฉ”์„œ๋“œ๊ฐ€ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €๋Š” ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์„œ๋ฒ„๊ฐ€ ์‘๋‹ตํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ์‘๋‹ต ํ›„์— ๋‹ค์‹œ ์—ฐ๊ฒฐํ•˜์—ฌ ๊ธฐ๋‹ค๋ ธ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์›น ์†Œ์ผ“์ด ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.

ZeroTech์—์„œ Apple Safari์™€ ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ๋ฅผ ์›น์†Œ์ผ“์— ์—ฐ๊ฒฐํ•œ ๋ฐฉ๋ฒ•

๋ช‡ ๋…„ ์ „, ์šฐ๋ฆฌ๋Š” ๋งํฌ ๋ ˆ์ด์–ด์ด๊ธฐ ๋•Œ๋ฌธ์— https ์š”์ฒญ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ˆœ์ˆ˜ PHP๋กœ ์ž์ฒด ๊ตฌํ˜„์„ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค. ์–ผ๋งˆ ์ „๊นŒ์ง€๋งŒ ํ•ด๋„ ๊ฑฐ์˜ ๋ชจ๋“  ์›น ์„œ๋ฒ„๋Š” https๋ฅผ ํ†ตํ•ด ์š”์ฒญ์„ ํ”„๋ก์‹œํ•˜๊ณ  ์—ฐ๊ฒฐ:์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฐ ์ผ์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์›น ์†Œ์ผ“์€ SPA ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฑฐ์˜ ๊ธฐ๋ณธ ์„œ๋น„์Šค๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์ฃผ๋„๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ฝ˜ํ…์ธ ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ํŽธ๋ฆฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•˜๊ฑฐ๋‚˜ ์ด๋ฏธ์ง€, ๋ฌธ์„œ, ํ”„๋ฆฌ์  ํ…Œ์ด์…˜์˜ ์ƒˆ ๋ฒ„์ „์„ ๋‹ค์šด๋กœ๋“œ). ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ํ˜„์žฌ ํŽธ์ง‘ ์ค‘์ธ ๋‚ด์šฉ).

ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ๊ฐ€ ๋‚˜์˜จ ์ง€ ๊ฝค ๋์ง€๋งŒ, ์šฐํšŒํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ์ง€์›์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  (์•„๋งˆ๋„ :slightly_smiling_face: ) ์ด๊ฒƒ์ด IOS ๋ธŒ๋ผ์šฐ์ €(Safari๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €)๊ฐ€ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š๊ณ  ๋กœ์ปฌ ์ธ์ฆ์„œ ์ €์žฅ์†Œ์—์„œ ์š”์ฒญํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ์ธ์ฆ์„œ๋Š” ๋กœ๊ทธ์ธ/ํŒจ์Šค ๋˜๋Š” SSH ํ‚ค๋‚˜ ๋ฐฉํ™”๋ฒฝ์„ ํ†ตํ•ด ํ•„์š”ํ•œ ํฌํŠธ๋ฅผ ๋‹ซ๋Š” ๊ฒƒ์— ๋น„ํ•ด ๋งŽ์€ ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์ด๊ฒƒ์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

iOS์—์„œ ์ธ์ฆ์„œ๋ฅผ ์„ค์น˜ํ•˜๋Š” ์ ˆ์ฐจ๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•˜์ง€๋งŒ(๊ตฌ์ฒด์ ์ธ ์‚ฌํ•ญ ์—†์ด๋Š” ์•„๋‹˜) ์ผ๋ฐ˜์ ์œผ๋กœ ์ธํ„ฐ๋„ท์— ๋งŽ์€ ๋‚ด์šฉ์ด ์žˆ๊ณ  Safari ๋ธŒ๋ผ์šฐ์ €์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ง€์นจ์— ๋”ฐ๋ผ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ๋ถˆํ–‰ํ•˜๊ฒŒ๋„ Safari๋Š” ์›น ์†Œ์ผ“์šฉ Client Cert๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด์ง€๋งŒ ๊ทธ๋Ÿฌํ•œ ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ธํ„ฐ๋„ท ์ง€์นจ์ด ๋งŽ์ด ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์ด๋ฅผ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ZeroTech์—์„œ Apple Safari์™€ ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ๋ฅผ ์›น์†Œ์ผ“์— ์—ฐ๊ฒฐํ•œ ๋ฐฉ๋ฒ•

์›น์†Œ์ผ“์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ๊ณ„ํš์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ/๊ฐ€์„ค/ํ•ด๊ฒฐ์ฑ….

๋ฌธ์ œ : IOS์šฉ Safari ๋ชจ๋ฐ”์ผ ๋ธŒ๋ผ์šฐ์ €์™€ ์ธ์ฆ์„œ ์ง€์›์„ ํ™œ์„ฑํ™”ํ•œ ๊ธฐํƒ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ๋กœ ๋ณดํ˜ธ๋˜๋Š” ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์š”์ฒญ์„ ํ”„๋ก์‹œ ์ฒ˜๋ฆฌํ•  ๋•Œ ์›น ์†Œ์ผ“์ด ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ€์„ค :

  1. ๋‚ด๋ถ€/์™ธ๋ถ€ ํ”„๋ก์‹œ ๋ฆฌ์†Œ์Šค์˜ ์›น ์†Œ์ผ“์— ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก(์•„๋ฌด๊ฒƒ๋„ ์—†์Œ์„ ์•Œ๊ณ ) ์ด๋Ÿฌํ•œ ์˜ˆ์™ธ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์›น์†Œ์ผ“์˜ ๊ฒฝ์šฐ ์ผ๋ฐ˜(์›น์†Œ์ผ“์ด ์•„๋‹Œ) ๋ธŒ๋ผ์šฐ์ € ์š”์ฒญ ์ค‘์— ์ƒ์„ฑ๋˜๋Š” ์ž„์‹œ ์„ธ์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ์œ ํ•˜๊ณ  ์•ˆ์ „ํ•˜๋ฉฐ ๋ฐฉ์–ด ๊ฐ€๋Šฅํ•œ ์—ฐ๊ฒฐ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ์ž„์‹œ ์„ธ์…˜์€ ํ•˜๋‚˜์˜ ํ”„๋ก์‹œ ์›น ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋‚ด์žฅ ๋ชจ๋“ˆ ๋ฐ ๊ธฐ๋Šฅ๋งŒ ํ•ด๋‹น).
  4. ์ž„์‹œ ์„ธ์…˜ ํ† ํฐ์€ ์ด๋ฏธ ์ค€๋น„๋œ Apache ๋ชจ๋“ˆ๋กœ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  5. ์ž„์‹œ ์„ธ์…˜ ํ† ํฐ์€ ์ƒํ˜ธ ์ž‘์šฉ ๊ตฌ์กฐ๋ฅผ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์„ค๊ณ„ํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌํ˜„ ํ›„ ํ‘œ์‹œ๋˜๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

๋ชฉ์ : ์„œ๋น„์Šค ๋ฐ ์ธํ”„๋ผ ๊ด€๋ฆฌ๋Š” ์ถ”๊ฐ€ ํ”„๋กœ๊ทธ๋žจ(์˜ˆ: VPN) ์—†์ด IOS์˜ ํœด๋Œ€ํฐ์—์„œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ ํ†ตํ•ฉ๋˜๊ณ  ์•ˆ์ „ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ๋ชฉํ‘œ: ๋ชจ๋ฐ”์ผ ์ธํ„ฐ๋„ท์—์„œ ์ฝ˜ํ…์ธ ๋ฅผ ๋” ๋น ๋ฅด๊ฒŒ ์ „๋‹ฌํ•˜์—ฌ ์‹œ๊ฐ„๊ณผ ๋ฆฌ์†Œ์Šค/์ „ํ™” ํŠธ๋ž˜ํ”ฝ์„ ์ ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค(์›น ์†Œ์ผ“์ด ์—†๋Š” ์ผ๋ถ€ ์„œ๋น„์Šค๋Š” ๋ถˆํ•„์š”ํ•œ ์š”์ฒญ์„ ์ƒ์„ฑํ•จ).

ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•?

1. ์‹œ์ž‘ ํŽ˜์ด์ง€:

โ€” ะฝะฐะฟั€ะธะผะตั€, https://teamcity.yourdomain.com ะฒ ะผะพะฑะธะปัŒะฝะพะผ ะฑั€ะฐัƒะทะตั€ะต Safari (ะดะพัั‚ัƒะฟะตะฝ ั‚ะฐะบะถะต ะฒ ะดะตัะบั‚ะพะฟะฝะพะน ะฒะตั€ัะธะธ) โ€” ะฒั‹ะทั‹ะฒะฐะตั‚ ัƒัะฟะตัˆะฝะพะต ะฟะพะดะบะปัŽั‡ะตะฝะธะต ะบ ะฒะตะฑ-ัะพะบะตั‚ะฐะผ.
โ€” ะฝะฐะฟั€ะธะผะตั€, https://teamcity.yourdomain.com/admin/admin.html?item=diagnostics&tab=webSโ€ฆโ€” ะฟะพะบะฐะทั‹ะฒะฐะตั‚ ping/pong.
โ€” ะฝะฐะฟั€ะธะผะตั€, https://rancher.yourdomain.com/p/c-84bnv:p-vkszd/workload/deployment:danidb:phโ€ฆ-> viewlogs โ€” ะฟะพะบะฐะทั‹ะฒะฐะตั‚ ะปะพะณะธ ะบะพะฝั‚ะตะนะฝะตั€ะฐ.

2. ๋˜๋Š” ๊ฐœ๋ฐœ์ž ์ฝ˜์†”์—์„œ:

ZeroTech์—์„œ Apple Safari์™€ ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ๋ฅผ ์›น์†Œ์ผ“์— ์—ฐ๊ฒฐํ•œ ๋ฐฉ๋ฒ•

๊ฐ€์„ค ๊ฒ€์ฆ:

1. ๋‚ด๋ถ€/์™ธ๋ถ€ ํ”„๋ก์‹œ ๋ฆฌ์†Œ์Šค์˜ ์›น ์†Œ์ผ“์— ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก(์•„๋ฌด๊ฒƒ๋„ ์—†์Œ์„ ์•Œ๊ณ ) ์ด๋Ÿฌํ•œ ์˜ˆ์™ธ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ 2๊ฐ€์ง€ ์†”๋ฃจ์…˜์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

a) ์ˆ˜์ค€์—์„œ

<Location sock*> SSLVerifyClient optional </Location>
<Location /> SSLVerifyClient require </Location>

์•ก์„ธ์Šค ์ˆ˜์ค€์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฐฉ๋ฒ•์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‰˜์•™์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ธ์ฆ์„œ ํ™•์ธ์€ ํ”„๋ก์‹œ๋œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์š”์ฒญ, ์ฆ‰ ์‚ฌํ›„ ์š”์ฒญ ํ•ธ๋“œ์…ฐ์ดํฌ ํ›„์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ”„๋ก์‹œ๊ฐ€ ๋จผ์ € ๋กœ๋“œ๋œ ๋‹ค์Œ ๋ณดํ˜ธ๋˜๋Š” ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์š”์ฒญ์„ ์ฐจ๋‹จํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‚˜์˜์ง€๋งŒ ์ค‘์š”ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
  • http2 ํ”„๋กœํ† ์ฝœ์—์„œ. ์•„์ง ์ดˆ์•ˆ ๋‹จ๊ณ„์ด๋ฉฐ ๋ธŒ๋ผ์šฐ์ € ์ œ์กฐ์—…์ฒด๋Š” ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. #info about tls1.3 http2 post handshake(ํ˜„์žฌ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Œ) RFC 8740 "HTTP/1.3์™€ ํ•จ๊ป˜ TLS 2 ์‚ฌ์šฉ" ๊ตฌํ˜„;
  • ์ด ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

b) ๊ธฐ๋ณธ ์ˆ˜์ค€์—์„œ๋Š” ์ธ์ฆ์„œ ์—†์ด SSL์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

SSLVerifyClient require => SSLVerifyClient ์„ ํƒ ์‚ฌํ•ญ์ด์ง€๋งŒ ์ด๋Ÿฌํ•œ ์—ฐ๊ฒฐ์€ ์ธ์ฆ์„œ ์—†์ด ์ฒ˜๋ฆฌ๋˜๋ฏ€๋กœ ํ”„๋ก์‹œ ์„œ๋ฒ„์˜ ๋ณด์•ˆ ์ˆ˜์ค€์ด ๋‚ฎ์•„์ง‘๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์Œ ์ง€์‹œ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋ก์‹œ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์ถ”๊ฐ€๋กœ ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

RewriteEngine        on
RewriteCond     %{SSL:SSL_CLIENT_VERIFY} !=SUCCESS
RewriteRule     .? - [F]
ErrorDocument 403 "You need a client side certificate issued by CAcert to access this site"

๋” ์ž์„ธํ•œ ์ •๋ณด๋Š” SSL์— ๊ด€ํ•œ ๊ธฐ์‚ฌ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Apache ์„œ๋ฒ„ ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ ์ธ์ฆ

๋‘ ์˜ต์…˜ ๋ชจ๋‘ ํ…Œ์ŠคํŠธ๋˜์—ˆ์œผ๋ฉฐ http2 ํ”„๋กœํ† ์ฝœ๊ณผ์˜ ํ˜ธํ™˜์„ฑ ๋ฐ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ์˜ต์…˜ "b"๊ฐ€ ์„ ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฐ€์„ค์˜ ๊ฒ€์ฆ์„ ์™„๋ฃŒํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ๋งŽ์€ ์‹คํ—˜์ด ํ•„์š”ํ–ˆ์œผ๋ฉฐ ๋‹ค์Œ ๋””์ž์ธ์ด ํ…Œ์ŠคํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

if = ํ•„์š” = ๋‹ค์‹œ ์ž‘์„ฑ

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋ณธ ๋””์ž์ธ์ž…๋‹ˆ๋‹ค.

SSLVerifyClient optional
RewriteEngine on
RewriteCond %{SSL:SSL_CLIENT_VERIFY} !=SUCCESS
RewriteCond %{HTTP:Upgrade} !=websocket [NC]
RewriteRule     .? - [F]
#ErrorDocument 403 "You need a client side certificate issued by CAcert to access this site"

#websocket for safari without cert auth
<If "%{SSL:SSL_CLIENT_VERIFY} != 'SUCCESS'">
<If "%{HTTP:Upgrade} = 'websocket'">
...
    #ะทะฐะผะตั‰ะฐะตะผ ะฐะฒั‚ะพั€ะธะทะฐั†ะธัŽ ะฟะพ ะฒะปะฐะดะตะปัŒั†ัƒ ัะตั€ั‚ะธั„ะธะบะฐั‚ะฐ ะฝะฐ ะฐะฒั‚ะพั€ะธะทะฐั†ะธัŽ ะฟะพ ะฝะพะผะตั€ัƒ ะฟั€ะพั‚ะพะบะพะปะฐ
    SSLUserName SSl_PROTOCOL
</If>
</If>

์ธ์ฆ์„œ ์†Œ์œ ์ž์˜ ๊ธฐ์กด ์ธ์ฆ์„ ๊ณ ๋ คํ–ˆ์ง€๋งŒ ์ธ์ฆ์„œ๊ฐ€ ๋ˆ„๋ฝ๋˜์–ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ณ€์ˆ˜ SSl_PROTOCOL(SSL_CLIENT_S_DN_CN ๋Œ€์‹ ) ์ค‘ ํ•˜๋‚˜์˜ ํ˜•์‹์œผ๋กœ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ธ์ฆ์„œ ์†Œ์œ ์ž๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์•„ํŒŒ์น˜ ๋ชจ๋“ˆ mod_ssl

ZeroTech์—์„œ Apple Safari์™€ ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ๋ฅผ ์›น์†Œ์ผ“์— ์—ฐ๊ฒฐํ•œ ๋ฐฉ๋ฒ•

2. ์›น์†Œ์ผ“์˜ ๊ฒฝ์šฐ ์ผ๋ฐ˜(์›น์†Œ์ผ“์ด ์•„๋‹Œ) ๋ธŒ๋ผ์šฐ์ € ์š”์ฒญ ์ค‘์— ์ƒ์„ฑ๋˜๋Š” ์ž„์‹œ ์„ธ์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ์œ ํ•˜๊ณ  ์•ˆ์ „ํ•˜๋ฉฐ ๋ณดํ˜ธ๋œ ์—ฐ๊ฒฐ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ „ ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ ์ผ๋ฐ˜(์›น ์†Œ์ผ“์ด ์•„๋‹Œ) ์š”์ฒญ ์ค‘์— ์›น ์†Œ์ผ“ ์—ฐ๊ฒฐ์„ ์œ„ํ•œ ์ž„์‹œ ํ† ํฐ์„ ์ค€๋น„ํ•˜๋ ค๋ฉด ๊ตฌ์„ฑ์— ์ถ”๊ฐ€ ์„น์…˜์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

#ะฟะพะดะณะพั‚ะพะฒะบะฐ ะฟะตั€ะตะดะฐั‡ะฐ ัะตะฑะต ะกookie ั‡ะตั€ะตะท ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัŒัะบะธะน ะฑั€ะฐัƒะทะตั€
<If "%{SSL:SSL_CLIENT_VERIFY} = 'SUCCESS'">
<If "%{HTTP:Upgrade} != 'websocket'">
Header set Set-Cookie "websocket-allowed=true; path=/; Max-Age=100"
</If>
</If>

#ะฟั€ะพะฒะตั€ะบะฐ Cookie ะดะปั ัƒัั‚ะฐะฝะพะฒะปะตะฝะธั ะฒะตะฑ-ัะพะบะตั‚ ัะพะตะดะธะฝะตะฝะธั
<source lang="javascript">
<If "%{SSL:SSL_CLIENT_VERIFY} != 'SUCCESS'">
<If "%{HTTP:Upgrade} = 'websocket'">
#check for exists cookie

#get and check
SetEnvIf Cookie "websocket-allowed=(.*)" env-var-name=$1

#or rewrite rule
RewriteCond %{HTTP_COOKIE} !^.*mycookie.*$

#or if
<If "%{HTTP_COOKIE} =~ /(^|; )cookie-names*=s*some-val(;|$)/ >
</If

</If>
</If>

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

3. ์ž„์‹œ ์„ธ์…˜์€ ํ•˜๋‚˜์˜ ํ”„๋ก์‹œ ์›น ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋‚ด์žฅ ๋ชจ๋“ˆ ๋ฐ ๊ธฐ๋Šฅ๋งŒ ํ•ด๋‹น).

์•ž์„œ ์•Œ์•„๋‚ธ ๊ฒƒ์ฒ˜๋Ÿผ Apache์—๋Š” ์กฐ๊ฑด๋ถ€ ๊ตฌ์„ฑ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ •๋ณด๊ฐ€ ์‚ฌ์šฉ์ž ๋ธŒ๋ผ์šฐ์ €์— ์žˆ๋Š” ๋™์•ˆ ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋‹จ์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ๋ฌด์—‡์„ ์ €์žฅํ• ์ง€, ์™œ ์ €์žฅํ• ์ง€, ์–ด๋–ค ๋‚ด์žฅ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ• ์ง€ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  • ์‰ฝ๊ฒŒ ํ•ด๋…ํ•  ์ˆ˜ ์—†๋Š” ํ† ํฐ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ๋…ธํ›„ํ™”๊ฐ€ ๋‚ด์žฅ๋œ ํ† ํฐ๊ณผ ์„œ๋ฒ„์—์„œ ๋…ธํ›„ํ™”๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ์ธ์ฆ์„œ ์†Œ์œ ์ž์™€ ์—ฐ๊ฒฐ๋  ํ† ํฐ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ํ•ด์‹ฑ ํ•จ์ˆ˜, ์†”ํŠธ ๋ฐ ํ† ํฐ์„ ๋งŒ๋ฃŒ์‹œํ‚ฌ ๋‚ ์งœ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Apache HTTP ์„œ๋ฒ„์˜ ํ‘œํ˜„์‹ ์šฐ๋ฆฌ๋Š” sha1๊ณผ %{TIME}์— ๋ชจ๋“  ๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋””์ž์ธ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

#ะฝะตั‚ ัะตั€ั‚ะธั„ะธะบะฐั‚ะฐ, ะธ ะพะฑั€ะฐั‰ะตะฝะธะต ะบ websocket
<If "%{SSL:SSL_CLIENT_VERIFY} != 'SUCCESS'">
<If "%{HTTP:Upgrade} = 'websocket'">
    SetEnvIf Cookie "zt-cert-sha1=([^;]+)" zt-cert-sha1=$1
    SetEnvIf Cookie "zt-cert-uid=([^;]+)" zt-cert-uid=$1
    SetEnvIf Cookie "zt-cert-date=([^;]+)" zt-cert-date=$1

#ั‚ะพะปัŒะบะพ ั‚ะฐะบ ะผะพะถะฝะพ ั€ะฐะฑะพั‚ะฐั‚ัŒ ั ะฟะตั€ะตะผะตะฝะฝั‹ะผะธ, ะฟะพะปัƒั‡ะตะฝะฝั‹ะผะธ ะฒ env-ะฐั… ะฒ ัั‚ะพั‚ ะผะพะผะตะฝั‚ ะฒั€ะตะผะตะฝะธ, ะฑะพะปะตะต ะพะฝะธ ะฝะธะณะดะต ะฝะต ะดะพัั‚ัƒะฟะฝั‹ ะดะปั ั„ัƒะฝะบั†ะธะธ ั…ะตัˆะธั€ะพะฒะฐะฝะธั (ะฟะพ ะพั‚ะดะตะปัŒะฝะพัั‚ะธ ะผะพะถะฝะพ, ะฝะพ ะฝะต ะฒะผะตัั‚ะต, ะดะฐ ะธ ะตั‰ั‘ ั ั…ะตัˆะธั€ะพะฒะฐะฝะธะตะผ)
    <RequireAll>
        Require expr %{sha1:salt1%{env:zt-cert-date}salt3%{env:zt-cert-uid}salt2} == %{env:zt-cert-sha1}
        Require expr %{env:zt-cert-sha1} =~ /^.{40}$/
    </RequireAll>
</If>
</If>

#ะตัั‚ัŒ ัะตั€ั‚ะธั„ะธะบะฐั‚, ะทะฐะฟั€ะฐัˆะธะฒะฐะตั‚ัั ะฝะต websocket
<If "%{SSL:SSL_CLIENT_VERIFY} = 'SUCCESS'">
<If "%{HTTP:Upgrade} != 'websocket'">
    SetEnvIf Cookie "zt-cert-sha1=([^;]+)" HAVE_zt-cert-sha1=$1

    SetEnv zt_cert "path=/; HttpOnly;Secure;SameSite=Strict"
#ะะพะฒั‹ะต ะบัƒะบะธ ัั‚ะฐะฒัั‚ัั, ะตัะปะธ ัั‚ะฐั€ั‹ั… ะฝะตั‚
    Header add Set-Cookie "expr=zt-cert-sha1=%{sha1:salt1%{TIME}salt3%{SSL_CLIENT_S_DN_CN}salt2};%{env:zt_cert}" env=!HAVE_zt-cert-sha1
    Header add Set-Cookie "expr=zt-cert-uid=%{SSL_CLIENT_S_DN_CN};%{env:zt_cert}" env=!HAVE_zt-cert-sha1
    Header add Set-Cookie "expr=zt-cert-date=%{TIME};%{env:zt_cert}" env=!HAVE_zt-cert-sha1
</If>
</If>

๋ชฉํ‘œ๋Š” ๋‹ฌ์„ฑํ–ˆ์ง€๋งŒ ์„œ๋ฒ„ ๋…ธํ›„ํ™” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(XNUMX๋…„ ๋œ ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ). ์ด๋Š” ํ† ํฐ์ด ๋‚ด๋ถ€ ์‚ฌ์šฉ์—๋Š” ์•ˆ์ „ํ•˜์ง€๋งŒ ์‚ฐ์—…์šฉ(๋Œ€๋Ÿ‰) ์‚ฌ์šฉ์—๋Š” ์•ˆ์ „ํ•˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

ZeroTech์—์„œ Apple Safari์™€ ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ๋ฅผ ์›น์†Œ์ผ“์— ์—ฐ๊ฒฐํ•œ ๋ฐฉ๋ฒ•

4. ์ž„์‹œ ์„ธ์…˜ ํ† ํฐ์€ ์ด๋ฏธ ๊ธฐ์„ฑ Apache ๋ชจ๋“ˆ๋กœ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด์ „ ๋ฐ˜๋ณต์—์„œ ํ•œ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ๋ฌธ์ œ๊ฐ€ ๋‚จ์•„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํ† ํฐ ๋…ธํ™”๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋‹ค์Œ ๋‹จ์–ด์— ๋”ฐ๋ผ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ์„ฑ ๋ชจ๋“ˆ์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Apache ํ† ํฐ json XNUMX๋‹จ๊ณ„ ์ธ์ฆ

์˜ˆ, ๊ธฐ์„ฑ ๋ชจ๋“ˆ์ด ์žˆ์ง€๋งŒ ๋ชจ๋‘ ํŠน์ • ์ž‘์—…๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉฐ ์„ธ์…˜ ์‹œ์ž‘ ๋ฐ ์ถ”๊ฐ€ ์ฟ ํ‚ค ํ˜•ํƒœ์˜ ์•„ํ‹ฐํŒฉํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํ•œ๋™์•ˆ์€ ์•„๋‹™๋‹ˆ๋‹ค.
๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐ XNUMX์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์ง€๋งŒ ๊ตฌ์ฒด์ ์ธ ๊ฒฐ๊ณผ๋Š” ๋‚˜์˜ค์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

5. ์ž„์‹œ ์„ธ์…˜ ํ† ํฐ์€ ์ƒํ˜ธ ์ž‘์šฉ์˜ ๊ตฌ์กฐ๋ฅผ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์„ค๊ณ„ํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์„ฑ ๋ชจ๋“ˆ์€ ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋Šฅ๋งŒ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋„ˆ๋ฌด ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ๋‚ ์งœ์˜ ๋ฌธ์ œ์ ์€ Apache์˜ ๋‚ด์žฅ ํ•จ์ˆ˜๊ฐ€ ๋ฏธ๋ž˜์˜ ๋‚ ์งœ ์ƒ์„ฑ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•  ๋•Œ ๋‚ด์žฅ ํ•จ์ˆ˜์— ์ˆ˜ํ•™์  ๋ง์…ˆ/๋บ„์…ˆ์ด ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฆ‰, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

(%{env:zt-cert-date} + 30) > %{DATE}

๋‘ ์ˆซ์ž๋งŒ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Safari ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๊ฒ€์ƒ‰ํ•˜๋˜ ์ค‘ ํฅ๋ฏธ๋กœ์šด ๊ธฐ์‚ฌ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ๋กœ HomeAssistant ๋ณดํ˜ธ(Safari/iOS์—์„œ ์ž‘๋™)
์ด๋Š” Nginx์šฉ Lua์˜ ์ฝ”๋“œ ์˜ˆ๋ฅผ ์„ค๋ช…ํ•˜๋ฉฐ, ํ•ด์‹ฑ์„ ์œ„ํ•œ hmac ์†”ํŒ… ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ์ด๋ฏธ ๊ตฌํ˜„ํ•œ ๊ตฌ์„ฑ ๋ถ€๋ถ„์˜ ๋…ผ๋ฆฌ๋ฅผ ๋งค์šฐ ๋งŽ์ด ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค( ์ด๋Š” Apache์—์„œ๋Š” ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค).

Lua๋Š” ๋…ผ๋ฆฌ๊ฐ€ ๋ช…ํ™•ํ•œ ์–ธ์–ด์ด๋ฉฐ Apache์— ๋Œ€ํ•ด ๊ฐ„๋‹จํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

Nginx์™€ Apache์˜ ์ฐจ์ด์ ์„ ์—ฐ๊ตฌํ•œ ๊ฒฐ๊ณผ:

๊ทธ๋ฆฌ๊ณ  Lua ์–ธ์–ด ์ œ์กฐ์—…์ฒด์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
22.1 โ€“ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„

์šฐ๋ฆฌ๋Š” ํ˜„์žฌ ๋‚ ์งœ์™€ ๋น„๊ตํ•  ๋ฏธ๋ž˜์˜ ๋‚ ์งœ๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์€ Lua ํŒŒ์ผ์— env ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ Lua ์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

require 'apache2'

function handler(r)
    local fmt = '%Y%m%d%H%M%S'
    local timeout = 3600 -- 1 hour

    r.notes['zt-cert-timeout'] = timeout
    r.notes['zt-cert-date-next'] = os.date(fmt,os.time()+timeout)
    r.notes['zt-cert-date-halfnext'] = os.date(fmt,os.time()+ (timeout/2))
    r.notes['zt-cert-date-now'] = os.date(fmt,os.time())

    return apache2.OK
end

์ฟ ํ‚ค ์ˆ˜๋ฅผ ์ตœ์ ํ™”ํ•˜๊ณ  ์ด์ „ ์ฟ ํ‚ค(ํ† ํฐ)๊ฐ€ ๋งŒ๋ฃŒ๋˜๊ธฐ ์ „ ์‹œ๊ฐ„์˜ ์ ˆ๋ฐ˜์ด ์ง€๋‚˜๋ฉด ํ† ํฐ์„ ๊ต์ฒดํ•˜์—ฌ ๋ชจ๋“  ๊ฒƒ์ด ์ „์ฒด์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

SSLVerifyClient optional

#LuaScope thread
#generate event variables zt-cert-date-next
LuaHookAccessChecker /usr/local/etc/apache24/sslincludes/websocket_token.lua handler early

#ะทะฐะฟั€ะตั‰ะฐะตะผ ะฑะตะท ัะตั€ั‚ะธั„ะธะบะฐั‚ะฐ ั‡ั‚ะพ-ั‚ะพ ะตั‰ั‘, ะบั€ะพะผะต webscoket
RewriteEngine on
RewriteCond %{SSL:SSL_CLIENT_VERIFY} !=SUCCESS
RewriteCond %{HTTP:Upgrade} !=websocket [NC]
RewriteRule     .? - [F]
#ErrorDocument 403 "You need a client side certificate issued by CAcert to access this site"

#websocket for safari without certauth
<If "%{SSL:SSL_CLIENT_VERIFY} != 'SUCCESS'">
<If "%{HTTP:Upgrade} = 'websocket'">
    SetEnvIf Cookie "zt-cert=([^,;]+),([^,;]+),[^,;]+,([^,;]+)" zt-cert-sha1=$1 zt-cert-date=$2 zt-cert-uid=$3

    <RequireAll>
        Require expr %{sha1:salt1%{env:zt-cert-date}salt3%{env:zt-cert-uid}salt2} == %{env:zt-cert-sha1}
        Require expr %{env:zt-cert-sha1} =~ /^.{40}$/
        Require expr %{env:zt-cert-date} -ge %{env:zt-cert-date-now}
    </RequireAll>
   
    #ะทะฐะผะตั‰ะฐะตะผ ะฐะฒั‚ะพั€ะธะทะฐั†ะธัŽ ะฟะพ ะฒะปะฐะดะตะปัŒั†ัƒ ัะตั€ั‚ะธั„ะธะบะฐั‚ะฐ ะฝะฐ ะฐะฒั‚ะพั€ะธะทะฐั†ะธัŽ ะฟะพ ะฝะพะผะตั€ัƒ ะฟั€ะพั‚ะพะบะพะปะฐ
    SSLUserName SSl_PROTOCOL
    SSLOptions -FakeBasicAuth
</If>
</If>

<If "%{SSL:SSL_CLIENT_VERIFY} = 'SUCCESS'">
<If "%{HTTP:Upgrade} != 'websocket'">
    SetEnvIf Cookie "zt-cert=([^,;]+),[^,;]+,([^,;]+)" HAVE_zt-cert-sha1=$1 HAVE_zt-cert-date-halfnow=$2
    SetEnvIfExpr "env('HAVE_zt-cert-date-halfnow') -ge %{TIME} && env('HAVE_zt-cert-sha1')=~/.{40}/" HAVE_zt-cert-sha1-found=1

    Define zt-cert "path=/;Max-Age=%{env:zt-cert-timeout};HttpOnly;Secure;SameSite=Strict"
    Define dates_user "%{env:zt-cert-date-next},%{env:zt-cert-date-halfnext},%{SSL_CLIENT_S_DN_CN}"
    Header set Set-Cookie "expr=zt-cert=%{sha1:salt1%{env:zt-cert-date-next}sal3%{SSL_CLIENT_S_DN_CN}salt2},${dates_user};${zt-cert}" env=!HAVE_zt-cert-sha1-found
</If>
</If>

SetEnvIfExpr "env('HAVE_zt-cert-date-halfnow') -ge %{TIME} && env('HAVE_zt-cert-sha1')=~/.{40}/" HAVE_zt-cert-sha1-found=1
ั€ะฐะฑะพั‚ะฐะตั‚,

ะฐ ั‚ะฐะบ ั€ะฐะฑะพั‚ะฐั‚ัŒ ะฝะต ะฑัƒะดะตั‚
SetEnvIfExpr "env('HAVE_zt-cert-date-halfnow') -ge  env('zt-cert-date-now') && env('HAVE_zt-cert-sha1')=~/.{40}/" HAVE_zt-cert-sha1-found=1 

LuaHookAccessChecker๋Š” Nginx์˜ ์ด ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์•ก์„ธ์Šค๋ฅผ ํ™•์ธํ•œ ํ›„์—๋งŒ ํ™œ์„ฑํ™”๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

ZeroTech์—์„œ Apple Safari์™€ ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ๋ฅผ ์›น์†Œ์ผ“์— ์—ฐ๊ฒฐํ•œ ๋ฐฉ๋ฒ•

์†Œ์Šค ๋งํฌ ์˜์ƒ.

๋˜ ๋‹ค๋ฅธ ํฌ์ธํŠธ.

์ผ๋ฐ˜์ ์œผ๋กœ Apache(์•„๋งˆ๋„ Nginx) ๊ตฌ์„ฑ์—์„œ ์ง€์‹œ๋ฌธ์ด ์–ด๋–ค ์ˆœ์„œ๋กœ ์ž‘์„ฑ๋˜๋Š”์ง€๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ๋ชจ๋“  ๊ฒƒ์€ ์ฒ˜๋ฆฌ ๊ณ„ํš์— ํ•ด๋‹นํ•˜๋Š” ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ ์ˆœ์„œ์— ๋”ฐ๋ผ ์ •๋ ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฃจ์•„ ์Šคํฌ๋ฆฝํŠธ.

์™„์„ฑ:

๊ตฌํ˜„ ํ›„ ํ‘œ์‹œ๋˜๋Š” ์ƒํƒœ(๋ชฉํ‘œ):
์ถ”๊ฐ€ ํ”„๋กœ๊ทธ๋žจ(VPN) ์—†์ด ํ†ตํ•ฉ๋˜๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ IOS์˜ ํœด๋Œ€ํฐ์—์„œ ์„œ๋น„์Šค ๋ฐ ์ธํ”„๋ผ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋ชฉํ‘œ๋Š” ๋‹ฌ์„ฑ๋˜์—ˆ์œผ๋ฉฐ ์›น์†Œ์ผ“์€ ์ž‘๋™ํ•˜๋ฉฐ ์ธ์ฆ์„œ ์ด์ƒ์˜ ๋ณด์•ˆ ์ˆ˜์ค€์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.

ZeroTech์—์„œ Apple Safari์™€ ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ๋ฅผ ์›น์†Œ์ผ“์— ์—ฐ๊ฒฐํ•œ ๋ฐฉ๋ฒ•

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€