ืื™ืš ืื ื—ื ื• ื‘-ZeroTech ื—ื™ื‘ืจื ื• ืืช Apple Safari ื•ืชืขื•ื“ื•ืช ืœืงื•ื— ืขื websockets

ื”ืžืืžืจ ื™ื”ื™ื” ืฉื™ืžื•ืฉื™ ืœืžื™:

  • ื™ื•ื“ืข ืžื”ื• Client Cert ื•ืžื‘ื™ืŸ ืžื“ื•ืข ื”ื•ื ื–ืงื•ืง ืœ-websockets ื‘-Safari ื ื™ื™ื“;
  • ื‘ืจืฆื•ื ื™ ืœืคืจืกื ืฉื™ืจื•ืชื™ ืื™ื ื˜ืจื ื˜ ืœืžืขื’ืœ ืžืฆื•ืžืฆื ืฉืœ ืื ืฉื™ื ืื• ืจืง ืœืขืฆืžื™;
  • ื—ื•ืฉื‘ ืฉื”ื›ืœ ื›ื‘ืจ ื ืขืฉื” ืขืœ ื™ื“ื™ ืžื™ืฉื”ื•, ื•ืจื•ืฆื” ืœืขืฉื•ืช ืืช ื”ืขื•ืœื ืงืฆืช ื™ื•ืชืจ ื ื•ื— ื•ื‘ื˜ื•ื—.

ื”ื”ื™ืกื˜ื•ืจื™ื” ืฉืœ websockets ื”ื—ืœื” ืœืคื ื™ ื›-8 ืฉื ื™ื. ื‘ืขื‘ืจ, ื ืขืฉื” ืฉื™ืžื•ืฉ ื‘ืฉื™ื˜ื•ืช ื‘ืฆื•ืจื” ืฉืœ ื‘ืงืฉื•ืช http ืืจื•ื›ื•ืช (ืœืžืขืฉื” ืชื’ื•ื‘ื•ืช): ื”ื“ืคื“ืคืŸ ืฉืœ ื”ืžืฉืชืžืฉ ืฉืœื— ื‘ืงืฉื” ืœืฉืจืช ื•ื—ื™ื›ื” ืฉื”ื•ื ื™ืขื ื” ืขืœ ืžืฉื”ื•, ืœืื—ืจ ื”ืชื’ื•ื‘ื” ื”ื•ื ื”ืชื—ื‘ืจ ืฉื•ื‘ ื•ื”ืžืชื™ืŸ. ืื‘ืœ ืื– ื”ื•ืคื™ืขื• ืฉืงืขื™ ืื™ื ื˜ืจื ื˜.

ืื™ืš ืื ื—ื ื• ื‘-ZeroTech ื—ื™ื‘ืจื ื• ืืช Apple Safari ื•ืชืขื•ื“ื•ืช ืœืงื•ื— ืขื websockets

ืœืคื ื™ ืžืกืคืจ ืฉื ื™ื ืคื™ืชื—ื ื• ื™ื™ืฉื•ื ืžืฉืœื ื• ื‘-PHP ื˜ื”ื•ืจ, ืฉืื™ื ื• ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ื‘ืงืฉื•ืช https, ืžื›ื™ื•ื•ืŸ ืฉื–ื• ืฉื›ื‘ืช ื”ืงื™ืฉื•ืจ. ืœืคื ื™ ื–ืžืŸ ืœื ืจื‘, ื›ืžืขื˜ ื›ืœ ืฉืจืชื™ ื”ืื™ื ื˜ืจื ื˜ ืœืžื“ื• ื‘ืงืฉื•ืช ืคืจื•ืงืกื™ ื“ืจืš https ื•ืชื•ืžื›ื™ื ื‘ื—ื™ื‘ื•ืจ:ืฉื“ืจื•ื’.

ื›ืฉื–ื” ืงืจื”, websockets ื”ืคืš ื›ืžืขื˜ ืœืฉื™ืจื•ืช ื‘ืจื™ืจืช ื”ืžื—ื“ืœ ืขื‘ื•ืจ ื™ื™ืฉื•ืžื™ SPA, ื›ื™ ื›ืžื” ื ื•ื— ืœืกืคืง ืชื•ื›ืŸ ืœืžืฉืชืžืฉ ื‘ื™ื•ื–ืžืช ื”ืฉืจืช (ืœืฉื“ืจ ื”ื•ื“ืขื” ืžืžืฉืชืžืฉ ืื—ืจ ืื• ืœื”ื•ืจื™ื“ ื’ืจืกื” ื—ื“ืฉื” ืฉืœ ืชืžื•ื ื”, ืžืกืžืš, ืžืฆื’ืช ืฉืžื™ืฉื”ื• ืื—ืจ ืขื•ืจืš ื›ืจื’ืข).

ืœืžืจื•ืช ืฉืชืขื•ื“ืช ืœืงื•ื— ืงื™ื™ืžืช ื›ื‘ืจ ื“ื™ ื”ืจื‘ื” ื–ืžืŸ, ื”ื™ื ืขื“ื™ื™ืŸ ื ืชืžื›ืช ื‘ืฆื•ืจื” ื’ืจื•ืขื”, ืžื›ื™ื•ื•ืŸ ืฉื”ื™ื ื™ื•ืฆืจืช ื”ืจื‘ื” ื‘ืขื™ื•ืช ื›ืืฉืจ ืžื ืกื™ื ืœืขืงื•ืฃ ืื•ืชื”. ื•(ืื•ืœื™ :slightly_smiling_face: ) ื–ื• ื”ืกื™ื‘ื” ืฉื“ืคื“ืคื ื™ IOS (ื›ื•ืœื ืžืœื‘ื“ ืกืคืืจื™) ืœื ืจื•ืฆื™ื ืœื”ืฉืชืžืฉ ื‘ื• ื•ืœื‘ืงืฉ ื–ืืช ืžื—ื ื•ืช ื”ืชืขื•ื“ื•ืช ื”ืžืงื•ืžื™ืช. ืœืื™ืฉื•ืจื™ื ื™ืชืจื•ื ื•ืช ืจื‘ื™ื ื‘ื”ืฉื•ื•ืื” ืœืžืคืชื—ื•ืช ื›ื ื™ืกื”/ืžืขื‘ืจ ืื• ssh ืื• ืกื’ื™ืจืช ื”ืคื•ืจื˜ื™ื ื”ื“ืจื•ืฉื™ื ื“ืจืš ื—ื•ืžืช ืืฉ. ืื‘ืœ ืœื ืขืœ ื–ื” ืžื“ื•ื‘ืจ.

ื‘-iOS, ื”ืœื™ืš ื”ืชืงื ืช ื”ืื™ืฉื•ืจ ื”ื•ื ื“ื™ ืคืฉื•ื˜ (ืœื ื‘ืœื™ ืคืจื˜ื™ื), ืื‘ืœ ื‘ืื•ืคืŸ ื›ืœืœื™ ื–ื” ื ืขืฉื” ืขืœ ืคื™ ื”ื•ืจืื•ืช, ืžื”ืŸ ื™ืฉ ื”ืจื‘ื” ื‘ืื™ื ื˜ืจื ื˜ ื•ืืฉืจ ื–ืžื™ื ื•ืช ืจืง ืขื‘ื•ืจ ื“ืคื“ืคืŸ Safari. ืœืžืจื‘ื” ื”ืฆืขืจ, Safari ืœื ื™ื•ื“ืข ืœื”ืฉืชืžืฉ ื‘-Client ะกert ืขื‘ื•ืจ ืฉืงืขื™ ืื™ื ื˜ืจื ื˜, ืืš ื™ืฉื ืŸ ื”ื ื—ื™ื•ืช ืจื‘ื•ืช ื‘ืื™ื ื˜ืจื ื˜ ื›ื™ืฆื“ ืœื™ืฆื•ืจ ืชืขื•ื“ื” ื›ื–ื•, ืืš ื‘ืคื•ืขืœ ื”ื“ื‘ืจ ืื™ื ื• ื‘ืจ ื”ืฉื’ื”.

ืื™ืš ืื ื—ื ื• ื‘-ZeroTech ื—ื™ื‘ืจื ื• ืืช Apple Safari ื•ืชืขื•ื“ื•ืช ืœืงื•ื— ืขื websockets

ื›ื“ื™ ืœื”ื‘ื™ืŸ ืืช websockets, ื”ืฉืชืžืฉื ื• ื‘ืชื•ื›ื ื™ืช ื”ื‘ืื”: ื‘ืขื™ื”/ื”ืฉืขืจื”/ืคืชืจื•ืŸ.

ื‘ืขื™ื”: ืื™ืŸ ืชืžื™ื›ื” ื‘ืฉืงืขื™ ืื™ื ื˜ืจื ื˜ ื‘ืขืช ื”ืขื‘ืจืช ื‘ืงืฉื•ืช ืœืคืจื•ืงืกื™ ืœืžืฉืื‘ื™ื ื”ืžื•ื’ื ื™ื ืขืœ ื™ื“ื™ ืื™ืฉื•ืจ ืœืงื•ื— ื‘ื“ืคื“ืคืŸ ื”ืกืœื•ืœืจื™ ืฉืœ Safari ืขื‘ื•ืจ IOS ื•ื™ื™ืฉื•ืžื™ื ืื—ืจื™ื ืฉืืคืฉืจื• ืชืžื™ื›ื” ื‘ืื™ืฉื•ืจื™ื.

ื”ืฉืขืจื•ืช:

  1. ืืคืฉืจ ืœื”ื’ื“ื™ืจ ื—ืจื™ื’ ื›ื–ื” ืœืฉื™ืžื•ืฉ ื‘ืชืขื•ื“ื•ืช (ื‘ื™ื“ื™ืขื” ืฉืœื ื™ื”ื™ื• ื›ืืœื”) ืœ-websockets ืฉืœ ืžืฉืื‘ื™ ืคืจื•ืงืกื™ ืคื ื™ืžื™ื™ื/ื—ื™ืฆื•ื ื™ื™ื.
  2. ืขื‘ื•ืจ websockets, ืืชื” ื™ื›ื•ืœ ืœื™ืฆื•ืจ ื—ื™ื‘ื•ืจ ื™ื™ื—ื•ื“ื™, ืžืื•ื‘ื˜ื— ื•ื‘ืจ ื”ื’ื ื” ื‘ืืžืฆืขื•ืช ื”ืคืขืœื•ืช ื–ืžื ื™ื•ืช ืฉื ื•ืฆืจื•ืช ื‘ืžื”ืœืš ื‘ืงืฉืช ื“ืคื“ืคืŸ ืจื’ื™ืœื” (ืฉืื™ื ื ื” websocket).
  3. ื ื™ืชืŸ ืœื™ื™ืฉื ื”ืคืขืœื•ืช ื–ืžื ื™ื•ืช ื‘ืืžืฆืขื•ืช ืฉืจืช ืื™ื ื˜ืจื ื˜ ืคืจื•ืงืกื™ ืื—ื“ (ืžื•ื“ื•ืœื™ื ื•ืคื•ื ืงืฆื™ื•ืช ืžื•ื‘ื ื™ื ื‘ืœื‘ื“).
  4. ืืกื™ืžื•ื ื™ ื”ืคืขืœื” ื–ืžื ื™ื™ื ื›ื‘ืจ ื™ื•ืฉืžื• ื›ืžื•ื“ื•ืœื™ื ืžื•ื›ื ื™ื ืฉืœ Apache.
  5. ื ื™ืชืŸ ืœื™ื™ืฉื ืืกื™ืžื•ื ื™ ื”ืคืขืœื” ื–ืžื ื™ื™ื ืขืœ ื™ื“ื™ ืชื›ื ื•ืŸ ื”ื’ื™ื•ื ื™ ืฉืœ ืžื‘ื ื” ื”ืื™ื ื˜ืจืืงืฆื™ื”.

ืžืฆื‘ ื’ืœื•ื™ ืœืื—ืจ ื™ื™ืฉื•ื.

ืžื˜ืจืช ื”ืขื‘ื•ื“ื”: ื ื™ื”ื•ืœ ื”ืฉื™ืจื•ืชื™ื ื•ื”ืชืฉืชื™ืช ืฆืจื™ืš ืœื”ื™ื•ืช ื ื’ื™ืฉ ืžื˜ืœืคื•ืŸ ื ื™ื™ื“ ื‘-IOS ืœืœื ืชื•ื›ื ื™ื•ืช ื ื•ืกืคื•ืช (ื›ื’ื•ืŸ VPN), ืžืื•ื—ื“ ื•ืžืื•ื‘ื˜ื—.

ืžื˜ืจื” ื ื•ืกืคืช: ื—ื™ืกื›ื•ืŸ ื‘ื–ืžืŸ ื•ืžืฉืื‘ื™ื/ืชืขื‘ื•ืจืช ื˜ืœืคื•ืŸ (ื—ืœืง ืžื”ืฉื™ืจื•ืชื™ื ืœืœื ืฉืงืขื™ ืื™ื ื˜ืจื ื˜ ืžื™ื™ืฆืจื™ื ื‘ืงืฉื•ืช ืžื™ื•ืชืจื•ืช) ืขื ืืกืคืงื” โ€‹โ€‹ืžื”ื™ืจื” ื™ื•ืชืจ ืฉืœ ืชื•ื›ืŸ ื‘ืื™ื ื˜ืจื ื˜ ื”ืกืœื•ืœืจื™.

ื›ื™ืฆื“ ืœื‘ื“ื•ืง?

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 ื•ืชืขื•ื“ื•ืช ืœืงื•ื— ืขื websockets

ื‘ื“ื™ืงืช ื”ืฉืขืจื•ืช:

1. ืืคืฉืจ ืœื”ื’ื“ื™ืจ ื—ืจื™ื’ ื›ื–ื” ืœืฉื™ืžื•ืฉ ื‘ืชืขื•ื“ื•ืช (ื‘ื™ื“ื™ืขื” ืฉืœื ื™ื”ื™ื• ื›ืืœื”) ืœืฉืงืขื™ ืื™ื ื˜ืจื ื˜ ืฉืœ ืžืฉืื‘ื™ ืคืจื•ืงืกื™ ืคื ื™ืžื™ื™ื/ื—ื™ืฆื•ื ื™ื™ื.

ื ืžืฆืื• ื›ืืŸ 2 ืคืชืจื•ื ื•ืช:

ื) ื‘ืจืžื”

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

ืœืฉื ื•ืช ืืช ืจืžืช ื”ื’ื™ืฉื”.

ืœืฉื™ื˜ื” ื–ื• ื™ืฉ ืืช ื”ื ื™ื•ืื ืกื™ื ื”ื‘ืื™ื:

  • ืื™ืžื•ืช ื”ืื™ืฉื•ืจ ืžืชืจื—ืฉ ืœืื—ืจ ื‘ืงืฉื” ืœืžืฉืื‘ ื”ืฉืจืช, ื›ืœื•ืžืจ, ืœื—ื™ืฆืช ื™ื“ ืฉืœ ืคื•ืกื˜ ื‘ืงืฉื”. ื”ืžืฉืžืขื•ืช ื”ื™ื ืฉื”ืคืจื•ืงืกื™ ื™ื˜ืขืŸ ืชื—ื™ืœื” ื•ืœืื—ืจ ืžื›ืŸ ื™ื ืชืง ืืช ื”ื‘ืงืฉื” ืœืฉื™ืจื•ืช ื”ืžื•ื’ืŸ. ื–ื” ืจืข, ืื‘ืœ ืœื ืงืจื™ื˜ื™;
  • ื‘ืคืจื•ื˜ื•ืงื•ืœ http2. ื–ื” ืขื“ื™ื™ืŸ ื‘ื˜ื™ื•ื˜ื”, ื•ื™ืฆืจื ื™ ื”ื“ืคื“ืคื ื™ื ืœื ื™ื•ื“ืขื™ื ืื™ืš ืœื™ื™ืฉื ืื•ืชื• # info about tls1.3 http2 post ืœื—ื™ืฆืช ื™ื“ (ืœื ืขื•ื‘ื“ ืขื›ืฉื™ื•) ื”ื˜ืžืขืช RFC 8740 "ืฉื™ืžื•ืฉ ื‘-TLS 1.3 ืขื HTTP/2";
  • ืœื ื‘ืจื•ืจ ื›ื™ืฆื“ ืœืื—ื“ ืืช ื”ืขื™ื‘ื•ื“ ื”ื–ื”.

ื‘) ื‘ืจืžื” ื‘ืกื™ืกื™ืช ืืคืฉืจ ssl ืœืœื ืชืขื•ื“ื”.

SSLVerifyClient require => SSLVerifyClient ืื•ืคืฆื™ื•ื ืœื™, ืืš ื–ื” ืžืคื—ื™ืช ืืช ืจืžืช ื”ืื‘ื˜ื—ื” ืฉืœ ืฉืจืช ื”-proxy, ืžื›ื™ื•ื•ืŸ ืฉื—ื™ื‘ื•ืจ ื›ื–ื” ื™ืขื•ื‘ื“ ืœืœื ืื™ืฉื•ืจ. ืขื ื–ืืช, ืืชื” ื™ื›ื•ืœ ืขื•ื“ ืœืžื ื•ืข ื’ื™ืฉื” ืœืฉื™ืจื•ืชื™ proxy ื‘ืืžืฆืขื•ืช ื”ื”ื ื—ื™ื” ื”ื‘ืื”:

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 Server

ืฉืชื™ ื”ืืคืฉืจื•ื™ื•ืช ื ื‘ื“ืงื•, ืืคืฉืจื•ืช "ื‘" ื ื‘ื—ืจื” ื‘ืฉืœ ื”ืจื‘ื’ื•ื ื™ื•ืช ืฉืœื” ื•ืชืื™ืžื•ืชื” ืœืคืจื•ื˜ื•ืงื•ืœ http2.

ื›ื“ื™ ืœื”ืฉืœื™ื ืืช ื”ืื™ืžื•ืช ืฉืœ ื”ืฉืขืจื” ื–ื•, ื ื“ืจืฉื• ื”ืจื‘ื” ื ื™ืกื•ื™ื™ื ืขื ื”ืชืฆื•ืจื”; ื”ืขื™ืฆื•ื‘ื™ื ื”ื‘ืื™ื ื ื‘ื“ืงื•:

ืื = ื“ื•ืจืฉ = ืฉื›ืชื•ื‘

ื”ืชื•ืฆืื” ื”ื™ื ื”ืขื™ืฆื•ื‘ ื”ื‘ืกื™ืกื™ ื”ื‘ื:

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), ืคืจื˜ื™ื ื ื•ืกืคื™ื ื‘ืชื™ืขื•ื“:

Apache Module mod_ssl

ืื™ืš ืื ื—ื ื• ื‘-ZeroTech ื—ื™ื‘ืจื ื• ืืช Apple Safari ื•ืชืขื•ื“ื•ืช ืœืงื•ื— ืขื websockets

2. ืขื‘ื•ืจ websockets, ื ื™ืชืŸ ืœื™ืฆื•ืจ ื—ื™ื‘ื•ืจ ื™ื™ื—ื•ื“ื™, ืžืื•ื‘ื˜ื— ื•ืžื•ื’ืŸ ื‘ืืžืฆืขื•ืช ื”ืคืขืœื•ืช ื–ืžื ื™ื•ืช ืฉื ื•ืฆืจื•ืช ื‘ืžื”ืœืš ื‘ืงืฉืช ื“ืคื“ืคืŸ ืจื’ื™ืœื” (ืฉืื™ื ื ื” websocket).

ื‘ื”ืชื‘ืกืก ืขืœ ื ื™ืกื™ื•ืŸ ืงื•ื“ื, ืขืœื™ืš ืœื”ื•ืกื™ืฃ ืกืขื™ืฃ ื ื•ืกืฃ ืœืชืฆื•ืจื” ืขืœ ืžื ืช ืœื”ื›ื™ืŸ ืืกื™ืžื•ื ื™ื ื–ืžื ื™ื™ื ืœื—ื™ื‘ื•ืจื™ ืฉืงืข ืื™ื ื˜ืจื ื˜ ื‘ืžื”ืœืš ื‘ืงืฉื” ืจื’ื™ืœื” (ืฉืื™ื ื ืฉืงืข ืื™ื ื˜ืจื ื˜).

#ะฟะพะดะณะพั‚ะพะฒะบะฐ ะฟะตั€ะตะดะฐั‡ะฐ ัะตะฑะต ะก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>

ื‘ื“ื™ืงื•ืช ื”ืจืื• ืฉื–ื” ืขื•ื‘ื“. ืืคืฉืจ ืœื”ืขื‘ื™ืจ ืœืขืฆืžืš Cookies ื“ืจืš ื”ื“ืคื“ืคืŸ ืฉืœ ื”ืžืฉืชืžืฉ.

3. ื ื™ืชืŸ ืœื™ื™ืฉื ื”ืคืขืœื•ืช ื–ืžื ื™ื•ืช ื‘ืืžืฆืขื•ืช ืฉืจืช ืื™ื ื˜ืจื ื˜ ืคืจื•ืงืกื™ ืื—ื“ (ืจืง ืžื•ื“ื•ืœื™ื ื•ืคื•ื ืงืฆื™ื•ืช ืžื•ื‘ื ื™ื).

ื›ืคื™ ืฉื’ื™ืœื™ื ื• ืงื•ื“ื ืœื›ืŸ, ืœ- Apache ื™ืฉ ื“ื™ ื”ืจื‘ื” ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช ืœื™ื‘ื” ื”ืžืืคืฉืจืช ืœืš ืœื™ืฆื•ืจ ืžื‘ื ื™ื ืžื•ืชื ื™ื. ืขื ื–ืืช, ืื ื• ื–ืงื•ืงื™ื ืœืืžืฆืขื™ื ื›ื“ื™ ืœื”ื’ืŸ ืขืœ ื”ืžื™ื“ืข ืฉืœื ื• ื‘ื–ืžืŸ ืฉื”ื•ื ื ืžืฆื ื‘ื“ืคื“ืคืŸ ืฉืœ ื”ืžืฉืชืžืฉ, ืื– ืื ื• ืงื•ื‘ืขื™ื ืžื” ืœืื—ืกืŸ ื•ืœืžื”, ื•ื‘ืื™ืœื• ืคื•ื ืงืฆื™ื•ืช ืžื•ื‘ื ื•ืช ื ืฉืชืžืฉ:

  • ืื ื—ื ื• ืฆืจื™ื›ื™ื ืืกื™ืžื•ืŸ ืฉืœื ื ื™ืชืŸ ืœืคืขื ื— ื‘ืงืœื•ืช.
  • ืื ื—ื ื• ืฆืจื™ื›ื™ื ืืกื™ืžื•ืŸ ืฉื™ืฉ ื‘ื• ื”ืชื™ื™ืฉื ื•ืช ืžื•ื‘ื ื™ืช ื•ื™ื›ื•ืœืช ืœื‘ื“ื•ืง ื”ืชื™ื™ืฉื ื•ืช ื‘ืฉืจืช.
  • ืื ื—ื ื• ืฆืจื™ื›ื™ื ืืกื™ืžื•ืŸ ืฉื™ืฉื•ื™ืš ืœื‘ืขืœ ื”ืชืขื•ื“ื”.

ื–ื” ื“ื•ืจืฉ ืคื•ื ืงืฆื™ื™ืช ื’ื™ื‘ื•ื‘, ืžืœื— ื•ืชืืจื™ืš ื›ื“ื™ ืœื™ื™ืฉืŸ ืืช ื”ืืกื™ืžื•ืŸ. ืžื‘ื•ืกืก ืขืœ ื”ืชื™ืขื•ื“ ื‘ื™ื˜ื•ื™ื™ื ื‘ืฉืจืช HTTP ืฉืœ Apache ื™ืฉ ืœื ื• ื”ื›ืœ ืžื—ื•ืฅ ืœืงื•ืคืกื” 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>

ื”ืžื˜ืจื” ื”ื•ืฉื’ื”, ืื‘ืœ ื™ืฉ ื‘ืขื™ื•ืช ืขื ื”ืชื™ื™ืฉื ื•ืช ื”ืฉืจืช (ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ืขื•ื’ื™ื™ื” ื‘ืช ืฉื ื”), ืžื” ืฉืื•ืžืจ ืฉื”ื˜ื•ืงื ื™ื, ืœืžืจื•ืช ืฉื”ื ื‘ื˜ื•ื—ื™ื ืœืฉื™ืžื•ืฉ ืคื ื™ืžื™, ืื™ื ื ื‘ื˜ื•ื—ื™ื ืœืฉื™ืžื•ืฉ ืชืขืฉื™ื™ืชื™ (ื”ืžื•ื ื™).

ืื™ืš ืื ื—ื ื• ื‘-ZeroTech ื—ื™ื‘ืจื ื• ืืช Apple Safari ื•ืชืขื•ื“ื•ืช ืœืงื•ื— ืขื websockets

4. ืืกื™ืžื•ื ื™ ื”ืคืขืœื” ื–ืžื ื™ื™ื ื›ื‘ืจ ื™ื•ืฉืžื• ื›ืžื•ื“ื•ืœื™ื ืžื•ื›ื ื™ื ืฉืœ Apache.

ื‘ืขื™ื” ืžืฉืžืขื•ืชื™ืช ืื—ืช ื ื•ืชืจื” ืžื”ืื™ื˜ืจืฆื™ื” ื”ืงื•ื“ืžืช - ื—ื•ืกืจ ื”ื™ื›ื•ืœืช ืœืฉืœื•ื˜ ื‘ื”ื–ื“ืงื ื•ืช ื”ืืกื™ืžื•ื ื™ื.

ืื ื—ื ื• ืžื—ืคืฉื™ื ืžื•ื“ื•ืœ ืžื•ื›ืŸ ืฉืขื•ืฉื” ื–ืืช, ืœืคื™ ื”ืžื™ืœื™ื: apache token json two factor auth

ื›ืŸ, ื™ืฉ ืžื•ื“ื•ืœื™ื ืžื•ื›ื ื™ื, ืื‘ืœ ื›ื•ืœื ืงืฉื•ืจื™ื ืœืคืขื•ืœื•ืช ืกืคืฆื™ืคื™ื•ืช ื•ื™ืฉ ืœื”ื ื—ืคืฆื™ื ื‘ืฆื•ืจืช ื”ืชื—ืœืช ื”ืคืขืœื” ื•ืงื•ื‘ืฆื™ Cookie ื ื•ืกืคื™ื. ื›ืœื•ืžืจ, ืœื ืœื–ืžืŸ ืžื”.
ืœืงื— ืœื ื• ื—ืžืฉ ืฉืขื•ืช ืœื—ืคืฉ, ืžื” ืฉืœื ื ืชืŸ ืชื•ืฆืื” ืงื•ื ืงืจื˜ื™ืช.

5. ื ื™ืชืŸ ืœื™ื™ืฉื ืืกื™ืžื•ื ื™ ื”ืคืขืœื” ื–ืžื ื™ื™ื ืขืœ ื™ื“ื™ ืชื›ื ื•ืŸ ื”ื’ื™ื•ื ื™ ืฉืœ ืžื‘ื ื” ื”ืื™ื ื˜ืจืืงืฆื™ื•ืช.

ืžื•ื“ื•ืœื™ื ืžื•ื›ื ื™ื ื”ื ืžื•ืจื›ื‘ื™ื ืžื“ื™, ื›ื™ ืื ื—ื ื• ืฆืจื™ื›ื™ื ืจืง ื›ืžื” ืคื•ื ืงืฆื™ื•ืช.

ืขื ื–ืืช, ื”ื‘ืขื™ื” ืขื ื”ืชืืจื™ืš ื”ื™ื ืฉื”ืคื•ื ืงืฆื™ื•ืช ื”ืžื•ื‘ื ื•ืช ืฉืœ Apache ืื™ื ืŸ ืžืืคืฉืจื•ืช ืœื™ืฆื•ืจ ืชืืจื™ืš ืžื”ืขืชื™ื“, ื•ืื™ืŸ ื—ื™ื‘ื•ืจ/ื—ื™ืกื•ืจ ืžืชืžื˜ื™ ื‘ืคื•ื ืงืฆื™ื•ืช ื”ืžื•ื‘ื ื•ืช ื‘ืขืช ื‘ื“ื™ืงืช ื”ืชื™ื™ืฉื ื•ืช.

ื›ืœื•ืžืจ, ืืชื” ืœื ื™ื›ื•ืœ ืœื›ืชื•ื‘:

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

ืืชื” ื™ื›ื•ืœ ืœื”ืฉื•ื•ืช ืจืง ืฉื ื™ ืžืกืคืจื™ื.

ืชื•ืš ื›ื“ื™ ื—ื™ืคื•ืฉ ืื—ืจ ืคืชืจื•ืŸ ืœื‘ืขื™ื™ืช ื”ืกืคืืจื™, ืžืฆืืชื™ ืžืืžืจ ืžืขื ื™ื™ืŸ: ืื‘ื˜ื—ืช HomeAssistant ืขื ืื™ืฉื•ืจื™ ืœืงื•ื— (ืขื•ื‘ื“ ืขื Safari/iOS)
ื”ื•ื ืžืชืืจ ื“ื•ื’ืžื” ืœืงื•ื“ ื‘-Lua ืขื‘ื•ืจ Nginx, ื•ืืฉืจ, ื›ืคื™ ืฉื”ืชื‘ืจืจ, ื—ื•ื–ืจ ืžืื•ื“ ืขืœ ื”ื”ื™ื’ื™ื•ืŸ ืฉืœ ืื•ืชื• ื—ืœืง ื‘ืชืฆื•ืจื” ืฉื›ื‘ืจ ื™ื™ืฉืžื ื•, ืœืžืขื˜ ื”ืฉื™ืžื•ืฉ ื‘ืฉื™ื˜ืช hmac salting ืขื‘ื•ืจ hashing ( ื–ื” ืœื ื ืžืฆื ื‘ืืคืฆ'ื™).

ื”ืชื‘ืจืจ ืฉืœื•ืื” ื”ื™ื ืฉืคื” ืขื ื”ื™ื’ื™ื•ืŸ ื‘ืจื•ืจ, ื•ืืคืฉืจ ืœืขืฉื•ืช ืžืฉื”ื• ืคืฉื•ื˜ ืขื‘ื•ืจ ืืคืืฆ'ื™:

ืœืื—ืจ ืฉืœืžื“ืชื™ ืืช ื”ื”ื‘ื“ืœ ืขื Nginx ื•- Apache:

ื•ืคื•ื ืงืฆื™ื•ืช ื–ืžื™ื ื•ืช ืžื™ืฆืจืŸ ืฉืคืช Lua:
22.1 - ืชืืจื™ืš ื•ืฉืขื”

ืžืฆืื ื• ื“ืจืš ืœื”ื’ื“ื™ืจ ืžืฉืชื ื™ env ื‘ืงื•ื‘ืฅ Lua ืงื˜ืŸ ืขืœ ืžื ืช ืœืงื‘ื•ืข ืชืืจื™ืš ืžื”ืขืชื™ื“ ืœื”ืฉื•ื•ืื” ืขื ื”ื ื•ื›ื—ื™.

ื›ืš ื ืจืื” ืกืงืจื™ืคื˜ ืคืฉื•ื˜ ืฉืœ 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

ื•ื›ื›ื” ื”ื›ืœ ืขื•ื‘ื“ ื‘ืกืš ื”ื›ืœ, ืขื ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืฉืœ ืžืกืคืจ ื”ืขื•ื’ื™ื•ืช ื•ื”ื—ืœืคืช ื”ืืกื™ืžื•ืŸ ื›ืฉืžื—ืฆื™ืช ืžื”ื–ืžืŸ ืžื’ื™ืข ืœืคื ื™ ืฉื”-Cookie (ืืกื™ืžื•ืŸ) ื”ื™ืฉืŸ ื™ืคื•ื’:

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 ื•ืชืขื•ื“ื•ืช ืœืงื•ื— ืขื websockets

ืงื™ืฉื•ืจ ืœืžืงื•ืจ ืชืžื•ื ื”.

ืขื•ื“ ืจื’ืข ืื—ื“.

ื‘ืื•ืคืŸ ื›ืœืœื™, ืœื ืžืฉื ื” ื‘ืื™ื–ื” ืกื“ืจ ื”ื”ื ื—ื™ื•ืช ื ื›ืชื‘ื•ืช ื‘ืชืฆื•ืจืช Apache (ื›ื ืจืื” ื’ื Nginx), ืฉื›ืŸ ื‘ืกื•ืคื• ืฉืœ ื“ื‘ืจ ื”ื›ืœ ื™ืกื•ื“ืจ ืœืคื™ ืกื“ืจ ื”ื‘ืงืฉื” ืžื”ืžืฉืชืžืฉ, ื”ืชื•ืื ืืช ื”ืกื›ื™ืžื” ืœืขื™ื‘ื•ื“ ืชืกืจื™ื˜ื™ ืœื•ืื”.

ืกึดื™ื•ึผื:

ืžืฆื‘ ื’ืœื•ื™ ืœืื—ืจ ื™ื™ืฉื•ื (ื™ืขื“):
ื ื™ื”ื•ืœ ื”ืฉื™ืจื•ืชื™ื ื•ื”ืชืฉืชื™ื•ืช ื–ืžื™ืŸ ืžื˜ืœืคื•ืŸ ื ื™ื™ื“ ื‘-IOS ืœืœื ืชื•ื›ื ื™ื•ืช ื ื•ืกืคื•ืช (VPN), ืžืื•ื—ื“ ื•ืžืื•ื‘ื˜ื—.

ื”ืžื˜ืจื” ื”ื•ืฉื’ื”, ืฉืงืขื™ ืื™ื ื˜ืจื ื˜ ืขื•ื‘ื“ื™ื ื•ื‘ืขืœื™ ืจืžืช ืื‘ื˜ื—ื” ืœื ืคื—ื•ืช ืžืชืขื•ื“ื”.

ืื™ืš ืื ื—ื ื• ื‘-ZeroTech ื—ื™ื‘ืจื ื• ืืช Apple Safari ื•ืชืขื•ื“ื•ืช ืœืงื•ื— ืขื websockets

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”