áá±á¬ááºážáá«ážááẠá¡á±á¬ááºáá«áá°áá»á¬ážá¡ááœáẠá¡áá¯á¶ážáááºáá«áááá·áºáááºá
- Client Cert á áá¬áá²ááá¯áᬠááááŒá®áž ááá¯ááá¯ááºáž Safari ááŸá¬ websocket ááœá± áá¬ááŒá±á¬áá·áº ááá¯á¡ááºáááºááá¯áᬠáá¬ážáááºáááºá
- áááºáááºáá±á¬ááºááŸá¯áá»á¬ážááᯠááá·áºáááºáá¬ážáá±á¬ áá°áá»á¬áž ááá¯á·ááá¯áẠááá¯ááºááá¯ááºá¡ááœááºáᬠáá¯ááºáá±ááá¯áá«áááºá
- á¡áá¬á¡á¬ážáá¯á¶ážááᯠáá áºáá±á¬ááºáá±á¬ááºá ááŒá®ážááœá¬ážááŒá®ááá¯á· áááºááŒá®áž ááá¹áá¬ááŒá®ážááᯠááá¯á¡áááºááŒá±ááŒá®áž ááá¯áá¯á¶ááŒá¯á¶á¡á±á¬áẠáá¯ááºáá»ááºáá«áááºá
Websockets áá»á¬ážááááá¯ááºážááẠááœááºáá²á·áá±á¬ 8 ááŸá
áºááá·áºáá
áááºáá²á·áááºá ááááºáá ááŸááºáá»á¬ážáá±á¬ http áá±á¬ááºážááá¯ááŸá¯áá¯á¶á
á¶ááŒáá·áº áááºážáááºážáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áá²á·ááẠ(á¡ááŸááºáááẠáá¯á¶á·ááŒááºááŸá¯áá»á¬áž)- á¡áá¯á¶ážááŒá¯áá°áááá±á¬ááºáá¬ááẠáá¬áá¬áᶠáá±á¬ááºážááá¯áá»ááºáá
áºáá¯áá±ážááá¯á·ááŒá®áž áá¯á¶á·ááŒááºááŸá¯ááᯠáááºáá¶áá»áááºáááºááŒá®ážáá±á¬áẠáá
áºá
á¯á¶áá
áºáá¬ááŒá±ááŒá¬ážááẠá
á±á¬áá·áºááá¯ááºážáá²á·áááºá áá«áá±ááá·áº áá±á¬ááºááá¯ááºážááŸá¬ websocket ááœá±áá±á«áºáá¬áááºá
ááœááºáá²á·áá±á¬ááŸá
áºá¡áááºážáááºáá á€áááºááŸá¬ ááá·áºá¡ááœáŸá¬ááŒá
áºáá±á¬ááŒá±á¬áá·áº https áá±á¬ááºážááá¯áá»ááºáá»á¬ážááá¯á¡áá¯á¶ážáááŒá¯ááá¯ááºáá±á¬ ááá·áºá
ááºáá±á¬ PHP ááœáẠáá»áœááºá¯ááºááá¯á·áááá¯ááºááá¯ááºá¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ááᯠáá®ááœááºáá²á·áááºá áááŒá¬áá±ážáá®áá áááºáá¬áá¬á¡á¬ážáá¯á¶ážáá®ážáá«ážááẠhttps ááŸáááá·áº ááá±á¬ááºá
á®áá±á¬ááºážááá¯ááŸá¯áá»á¬ážááŸáá·áº áá»áááºáááºááŸá¯áá¶á·ááá¯ážááŸá¯- á¡ááá·áºááŒáŸáá·áºáááºááẠáááºáá°áá²á·áááºá
ááá¯ááá¯á·ááŒá áºáá±á¬á¡áá«á websockets áá»á¬ážááẠSPA á¡ááá®áá±ážááŸááºážáá»á¬ážá¡ááœáẠáá°áááºážáááºáá±á¬ááºááŸá¯áá®ážáá«ážááŒá áºáá¬áááºá á¡áááºááŒá±á¬áá·áºááá¯áá±á¬áº áá¬áá¬áá¡á ááŒá¯ááŸá¯ááœáẠáá¯á¶ážá áœá²áá°á¡á¬áž á¡ááŒá±á¬ááºážá¡áá¬ááᯠáá±ážáá±á¬ááºááẠáááºáá»áŸá¡áááºááŒá±ááẠ(á¡ááŒá¬ážá¡áá¯á¶ážááŒá¯áá°áá¶á០áááºáá±á·áá»áºááá¯á·ááŒááºáž ááá¯á·ááá¯áẠáá¯á¶á á á¬ááœááºá á¬áááºážá áááºááŒááŸá¯áá¬ážááŸááºážá¡áá áºááᯠáá±á«ááºážáá¯ááºáá¯ááºááŒááºáž á¡ááŒá¬ážáá áºáá±á¬ááºáá±á¬ááºá áááºážááŒááºáá±áááº)á
Client Certificate ááẠá¡áá»áááºá¡áá±á¬áºááŒá¬áá±ááŒá®ááŒá áºáá±á¬áºáááºáž áááºážááᯠáá»á±á¬áºááŒááºááẠááŒáá¯ážáááºážáá¬ááœáẠááŒá¿áá¬áá»á¬ážá áœá¬ááᯠáááºáá®ážáá±ážáá±á¬ááŒá±á¬áá·áº áááºážááᯠáá¶á·ááá¯ážááŸá¯ áá¶á·áá»ááºážáá±áá²ááŒá áºáááºá ááŸáá·áº (ááŒá áºááá¯ááºááẠ:slightly_smiling_face: ) ááá¯á·ááŒá±á¬áá·áº IOS ááá±á¬ááºáá¬áá»á¬áž (Safari ááŸááœá²á á¡á¬ážáá¯á¶áž) ááẠáááºážááᯠá¡áá¯á¶ážáááŒá¯ááá¯áá² áá±áááœááºáž áááºááŸááºá ááá¯ážá០áá±á¬ááºážááá¯ááŒááºážááŒá áºáááºá áááºááŸááºáá»á¬ážááẠlogin/pass ááá¯á·ááá¯áẠssh áá±á¬á·áá»á¬áž ááá¯á·ááá¯áẠfirewall ááŸáááá·áº ááá¯á¡ááºáá±á¬ port áá»á¬ážááᯠááááºááŒááºážááẠá¡á¬ážáá¬áá»ááºáá»á¬ážá áœá¬ááŸááááºá áá«áá±ááá·áº áá«á á¡ááŒá±á¬ááºážááá¯ááºáá°ážá
iOS ááœááºá áááºááŸááºáá áºáá¯ááá·áºááœááºážááŒááºážá¡ááœááºáá¯ááºáá¯á¶ážáá¯ááºáááºážáááºá¡áá±á¬áºáá±ážááá¯ážááŸááºážááẠ(á¡ááá¡áá»áááŸááá«)á ááá¯á·áá±á¬áºáá±áá¯áá»á¡á¬ážááŒáá·áºáááºážáááºá¡ááºáá¬áááºáá±á«áºááœááºá¡áá»á¬ážá¡ááŒá¬ážááŸáááŒá®áž Safari browser á¡ááœááºáá¬áááŸáááá¯ááºáá±á¬ááœáŸááºááŒá¬ážáá»ááºáá»á¬ážá¡ááá¯ááºážáá¯ááºáá±á¬ááºáááºá áá¶ááá±á¬ááºážá áœá¬ááŒáá·áºá Safari ááẠweb sockets áá»á¬ážá¡ááœáẠClient Сert ááᯠáááºááá¯á·á¡áá¯á¶ážááŒá¯ááááºááᯠááááá±á¬áºáááºáž ááá¯ááá¯á·áá±á¬áááºááŸááºááá¯áááºáá®ážáááºážá¡ááœáẠá¡ááºáá¬áááºáá±á«áºááœáẠááœáŸááºááŒá¬ážáá»ááºáá»á¬ážá áœá¬ááŸááá±á¬áºáááºáž áááºááœá±á·ááœáẠáááºážááᯠááááŸáááá¯ááºáá«á
websocket áá»á¬ážááá¯áá¬ážáááºáááºá áá»áœááºá¯ááºááá¯á·ááẠá¡á±á¬ááºáá«á¡á
á®á¡á
ááºááᯠá¡áá¯á¶ážááŒá¯áá²á·áááº- ááŒá¿áá¬/áá°ááá»ááº/ááŒá±ááŸááºážáá»ááºá
ááŒá¿áá¬: Safari ááá¯ááá¯ááºážááá±á¬ááºáá¬ááŸá IOS ááŸáá·áº áááºááŸááºáá¶á·ááá¯ážááŸá¯ááœáá·áºáá¬ážááá·áº á¡ááŒá¬ážá¡ááºááºáá®áá±ážááŸááºážáá»á¬ážá¡ááœáẠáááá¯ááºážááá·áºáááºááŸááºááŒáá·áº áá¬ááœááºáá¬ážááá·áº á¡áááºážá¡ááŒá áºáá»á¬ážááá¯á· proxy áá±á¬ááºážááá¯ááá·áºá¡áá« áááºáá±á«ááºáá»á¬ážá¡ááœáẠáá¶á·ááá¯ážááŸá¯áááŸááá«á
áá°ááá»ááºáá»á¬áž-
- á¡ááœááºáž/ááŒááºá proxyed á¡áááºážá¡ááŒá áºáá»á¬ážá websockets áá»á¬ážááœáẠáááºááŸááºáá»á¬áž (áá áºáá¯áá»áŸáááŸááááºááᯠáááá»ááº) á¡áá¯á¶ážááŒá¯ááẠááá¯ááŒáœááºážáá»ááºá¡á¬áž ááŒááºáááºáááºááŸááºááá¯ááºáááºá
- websocket áá»á¬ážá¡ááœááºá áááºááẠáá¯á¶ááŸáẠ(websocket ááá¯ááºáá±á¬) browser áá±á¬ááºážááá¯ááŸá¯á¡ááœááºáž áá¯ááºáá±ážááá·áº áá¬áá®áááºááŸááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á áá°ážááŒá¬ážáá±á¬á áá¯á¶ááŒá¯á¶ááŒá®áž áá¯áá¶ááá¯ááºáá±á¬ áá»áááºáááºááŸá¯ááᯠááŒá¯áá¯ááºááá¯ááºáááºá
- áá¬áá®áááºááŸááºáá»á¬ážááᯠááá±á¬ááºá á®áááºáá¬áá¬áá áºáá¯ááŒáá·áº á¡áá±á¬ááºá¡áááºáá±á¬áºááá¯ááºááẠ(áá«áááºáá±á¬ áá±á¬áºáá»á°ážáá»á¬ážááŸáá·áº áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážáá¬)á
- áá¬áá®áááºááŸááºááá¯áááºáá»á¬ážááᯠá¡áááºááá·áºáá¯ááºáá¬ážáá±á¬ Apache áá±á¬áºáá»á°ážáá»á¬ážá¡ááŒá Ạá¡áá±á¬ááºá¡áááºáá±á¬áºááŒá®ážááŒá áºáááºá
- á¡ááŒááºá¡ááŸááºáááºááœááºááŸá¯ááœá²á·á ááºážáá¯á¶ááᯠáá¯áá¹áááááºážáá»áá» áá®ááá¯ááºážáá¯ááºááŒááºážááŒáá·áº áá¬áá®áááºááŸááºááá¯áááºáá»á¬ážááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááá¯ááºáááºá
á¡áá±á¬ááºá¡áááºáá±á¬áºááŒá®ážáá±á¬áẠááŒááºáá¬áá±á¬á¡ááŒá±á¡áá±á
á¡áá¯ááºááááºážááá¯ááº- áááºáá±á¬ááºááŸá¯áá»á¬ážááŸáá·áº á¡ááŒá±áá¶á¡áá±á¬ááºá¡áŠáá»á¬ážááᯠá á®áá¶ááá·áºááœá²ááŒááºážááẠá¡ááá¯áááá¯ááááºáá»á¬áž (á¥ááᬠ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. ááá¯á·ááá¯áẠdeveloper console ááœááº-
áá°ááá»áẠá
ááºážáááºááŒááºáž-
1. Internal/External proxyed á¡áááºážá¡ááŒá áºáá»á¬ážá áááºááá¯ááºáá»á¬ážááœáẠáááºááŸááºáá»á¬áž (áá áºáá¯áá»áŸáááŸááááºááᯠáááá»ááº) á¡áá¯á¶ážááŒá¯ááẠááŒáœááºážáá»ááºáá áºáá¯á¡á¬áž ááŒááºáááºáááºááŸááºááá¯ááºáááºá
ááŒá±ááŸááºážáá»áẠ2 áá¯ááᯠá€áá±áá¬ááœáẠááœá±á·ááŸááá²á·áááºá
á) á¡ááá·áºááŸá¬
<Location sock*> SSLVerifyClient optional </Location>
<Location /> SSLVerifyClient require </Location>
áááºáá±á¬ááºááŸá¯á¡ááá·áºááᯠááŒá±á¬ááºážáá²áá«á
á€áááºážáááºážááœáẠá¡á±á¬ááºáá« nuances áá»á¬ážááŸááááºá
- Proxyed áááºážááŒá áºáᶠáá±á¬ááºážááá¯áá»ááºáá áºáá¯á ááá¯ááá¯áááºááŸá¬ ááá¯á·á áºáááºááẠáá±á¬ááºážááá¯áá»ááºááᯠáááºááœá²ááŸá¯ááºáááºááŒá®ážáá±á¬áẠáááºáá±áá¶áááºááŸááºááᯠá¡áááºááŒá¯ááŒááºážááŒá áºáááºá ááá¯ááá¯áááºááŸá¬ ááá±á¬ááºá á®ááẠááááŠážá áœá¬ áááºááŒá®ážáá±á¬áẠáá¬ááœááºáá¬ážáá±á¬ áááºáá±á¬ááºááŸá¯ááá¯á· áá±á¬ááºážááá¯ááŸá¯ááᯠááŒááºáá±á¬ááºáááºááŒá áºáááºá á€áááºááŸá¬ ááá¯ážááœá¬ážáá±á¬áºáááºáž áá áá¯ážááááºááá«á
- http2 áááá¯ááá¯áá±á¬ááœááºá áááºážááẠáá°ááŒááºážááŒá
áºáá±áá²ááŒá
áºááŒá®áž ááá±á¬ááºáá¬áá¯ááºáá¯ááºáá°áá»á¬ážááẠáááºážá¡á¬áž áááºááá¯á·á¡áá±á¬ááºá¡áááºáá±á¬áºááááºááᯠááááá« # tls1.3 http2 ááá¯á·á
áºááᯠáááºááœá²ááŸá¯ááºáááºááŒááºážá¡ááŒá±á¬ááºáž #info (ááᯠá¡áá¯ááºááá¯ááºáá«)
RFC 8740 " HTTP/1.3 ááŒáá·áº TLS 2 ááá¯á¡áá¯á¶ážááŒá¯ááŒááºáž" ááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºáá«á ; - á€áá¯ááºáá±á¬ááºááŸá¯ááᯠáááºáá²á·ááá¯á· áá±á«ááºážá ááºážááááºááᯠáááŸááºážáááºážáá«á
á) á¡ááŒá±áá¶á¡ááá·áºááœááºá áááºááŸááºááá«áá² ssl ááá¯ááœáá·áºááŒá¯áá«á
SSLVerifyClient ááá¯á¡ááºááẠ=> SSLVerifyClient ááẠááœá±ážáá»ááºááá¯ááºáááºá ááá¯á·áá±á¬áº áááºážááẠááá±á¬ááºá á®áá¬áá¬á áá¯á¶ááŒá¯á¶áá±ážá¡ááá·áºááᯠáá»áŸá±á¬á·áá»áá±ážáááºá á¡áááºááŒá±á¬áá·áºááá¯áá±á¬áº ááá¯ááá¯á·áá±á¬áá»áááºáááºááŸá¯ááᯠáááºááŸááºááá«áá² áá¯ááºáá±á¬ááºááœá¬ážáááºááŒá áºáááºá ááá¯á·áá±á¬áºá á¡á±á¬ááºáá«ááœáŸááºááŒá¬ážáá»ááºááŒáá·áº proxyed áááºáá±á¬ááºááŸá¯áá»á¬ážááá¯á· áááºáá±á¬ááºááœáá·áºááᯠáááºááẠáááºáá¶ááŒááºážááá¯ááá¯ááºáááº-
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 á¡ááŒá±á¬ááºáž áá±á¬ááºážáá«ážááœáẠááœá±á·ááá¯ááºáááº-
ááœá±ážáá»ááºá áá¬ááŸá áºáá¯áá¯á¶ážááᯠá ááºážáááºáá²á·ááŒá®ážá ááœá±ážá áᬠâbâ ááᯠhttp2 protocol ááŸáá·áº áááºážá áááºá á¯á¶áá¯á¶ážááá¯ááºááŸá¯ááŸáá·áº ááá¯ááºáááºááŸá¯ááŸáá á±ááẠááœá±ážáá»ááºáá¬ážáááºá
á€áá°ááá»ááºá¡á¬áž á¡áááºááŒá¯ááŒááºážá¡á¬áž á¡ááŒá®ážáááºáááºá ááœá²á·á ááºážááŸá¯áá¯á¶á á¶ááŒáá·áº á ááºážáááºááŸá¯áá»á¬ážá áœá¬ááᯠááŒá¯áá¯ááºáá²á·áááŒá®áž á¡á±á¬ááºáá«áá®ááá¯ááºážáá»á¬ážááᯠá ááºážáááºáá²á·áááº-
if=require=ááŒááºáá±ážáá«á
Apache Core á¡ááºá¹áá«áááºáá»á¬áž Apache HTTP áá¬áá¬ááŸá á áá¬ážáááºáá»á¬áž
ááááºááŸá¬ á¡á±á¬ááºáá«á¡ááŒá±áá¶áá®ááá¯ááºážááŒá áºáááºá
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>
áááºááŸááºááá¯ááºááŸááºá áááºááŸáááœáá·áºááŒá¯áá»ááºááᯠááá·áºááœááºážá ááºážá á¬ážáá±á¬áºáááºáž áá»á±á¬ááºáá¯á¶ážáá±áá±á¬ áááºáá±áá¶áááºááŸááºááŒáá·áº áá»áœááºá¯ááºááẠáááŸáááá¯ááºáá±á¬ variable áá»á¬ážáá²á០áá áºáá¯ááŒá áºááá·áº SSl_PROTOCOL (SSL_CLIENT_S_DN_CN á¡á á¬áž)á á á¬ááœááºá á¬áááºážáá»á¬ážááœáẠáá±á¬ááºáááºá¡áá±ážá áááºá¡áá»ááºáá»á¬áž-
2. 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 áááºááá·áºá¡á¬áž conditional constructs áá»á¬ážááá¯áááºáá®ážáááºááœáá·áºááŒá¯áá±á¬á¡ááááá¯ááºáá±á¬ááºááá¯ááºá áœááºážáá»á¬ážá áœá¬ááŸááááºá ááá¯á·áá±á¬áºá áá»áœááºá¯ááºááá¯á·ááẠá¡áá¯á¶ážááŒá¯áá°áááá±á¬ááºáá¬ááœáẠááŸááá±á ááºááœáẠáá»áœááºá¯ááºááá¯á·áá¡áá»ááºá¡áááºáá»á¬ážááᯠáá¬ááœááºááẠáááºážáááºážáá»á¬áž ááá¯á¡ááºáááºá ááá¯á·ááŒá±á¬áá·áº áá»áœááºá¯ááºááá¯á·ááẠá¡áááºá¡áá¬ááᯠááááºážáááºážáááááºážá á¡áááºááŒá±á¬áá·áºááá¯áá±á¬áº áá»áœááºá¯ááºááá¯á·á¡áá¯á¶ážááŒá¯ááá·áº áá«áááºááá·áºáá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠáá±á¬áºáá¯ááºáááº-
- á¡ááœááºááá° áá¯ááºááŒá±á¬ááºážááááá±á¬ ááá¯áááºáá áºáᯠááá¯á¡ááºáá«áááºá
- áá»áœááºá¯ááºááá¯á·ááẠáááºážááœááºáááºáá±á¬ááºáá¬ážáá±á¬ áá±ááºáá±á¬ááºáá»áá»ááºáá²á·áá±á¬ ááá¯áááºáá áºáᯠááá¯á¡ááºááŒá®áž áá¬áá¬áá±á«áºááœáẠáá±á¬ááºážááœááºážááŸá¯ááᯠá á áºáá±ážááá¯ááºááá·áº á áœááºážáááºáá áºáᯠááá¯á¡ááºáá«áááºá
- áááºááŸááºááá¯ááºááŸááºááŸáá·áº áááºá ááºááá·áº ááá¯áááºáá áºáᯠááá¯á¡ááºáá«áááºá
áááºážááẠááá¯áááºááᯠáááºáááºážááá¯ážááẠhashing functioná áá¬ážááŸáá·áº áááºá
áœá²áá
áºáᯠááá¯á¡ááºáááºá á
á¬ááœááºá
á¬áááºážá¡áá±á«áºá¡ááŒá±áá¶áááºá
ááááºááŸá¬ á€áá®ááá¯ááºážá
#ÐœÐµÑ ÑеÑÑОÑОкаÑа, О ПбÑаÑеМОе к 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>
áááºááŸááºážáá»ááºááᯠá¡á±á¬ááºááŒááºááŒá®ážááŒá®á ááá¯á·áá±á¬áº áá¬áá¬áá±ááºááœááºááŸá¯ (áá áºááŸá áºáá¬áž ááœááºáá®ážááᯠáááºáá¯á¶ážááá¯ááºáááº)á ááá¯ááá¯áááºááŸá¬ á ááºááœááºážá¡áá¯á¶ážááŒá¯ááŸá¯á¡ááœáẠáá±ážáááºážáá±á¬áºáááºáž ááá¯áááºáá»á¬ážááẠá ááºááŸá¯áá¯ááºáááºáž (á¡á á¯ááá¯ááºá¡ááŒá¯á¶ááá¯ááº) á¡áá¯á¶ážááŒá¯ááŸá¯á¡ááœáẠááá¯á¶ááŒá¯á¶ááŒá±á¬ááºáž ááá¯ááá¯áááºá
4. áá¬áá®áááºááŸááºááá¯áááºáá»á¬ážááᯠá¡áááºááá·áºáá¯ááºáá¬ážáá±á¬ Apache áá±á¬áºáá»á°ážáá»á¬ážá¡ááŒá
Ạá¡áá±á¬ááºá¡áááºáá±á¬áºááŒá®ážááŒá
áºáááºá
áááá¬áááºááŸá¬ážáá±á¬ááŒá¿áá¬áá áºáá¯ááŸá¬ ááááºáááºáá¯ááºááŒááºážááŸáá»ááºáá²á·ááẠ- ááá¯áááºá¡áá¯áááºážááŒááºážááᯠááááºážáá»á¯ááºááá¯ááºá áœááºážáááŸáááŒááºážá
á áá¬ážáá¯á¶ážáá»á¬ážá¡á áááºážááá¯áá¯ááºáá±á¬ááºááẠá¡áááºááá·áºáá¯ááºáá¬ážáá±á¬ module áá áºáá¯ááᯠáá»áœááºá¯ááºááá¯á·ááŸá¬ááœá±áá±áááº- apache token json two factor auth
JSON áááºááá¯áááºáá»á¬ážááᯠá¡ááŒá±áá¶áá¬ážáá±á¬ ááá¯áááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á áá±á¬ááºááẠá á áºááŸááºááŒá±á¬ááºážá¡áá±á¬ááºá¡áá¬ážááŒááŒááºážá Apache Two-Factor (2FA) á á áºááŸááºááŒá±á¬ááºážá¡áá±á¬ááºá¡áá¬ážááŒááŒááºážá Apache ááœáẠTwo-Factor Authentication ááá·áºáááºáž ááá¯ážááŸááºážáá±á¬ module ááá·áºááœááºážááŒááºážááŒáá·áº ááá·áº Apache instance ááá¯á· two-factor authentication ááᯠáá°áá±á¬ááºáá¬áá«á
áá¯ááºáá²á·á á¡áááºááá·áºáá¯ááºáá¬ážáá²á· module ááœá±ááŸááá«áááºá áá«áá±ááá·áº áá°ááá¯á·á¡á¬ážáá¯á¶ážáᬠáááá»áá²á·áá¯ááºáá±á¬ááºáá»ááºááœá±áá²á· áááºá
ááºáá±ááŒá®áž session áá
áºáá¯á
áááºááŒááºážáá²á· áá±á¬ááºááẠcookies áá»á¬ážáá¯á¶á
á¶áá²á· artifacts ááœá±ááŸááá«áááºá á¡á²áá«á áááá¬ááá¯ááºáá°ážá
ááŸá¬ááœá±ááẠáá«ážáá¬áá®á¡áá»áááºáá°áá²á·áááŒá®áž áááá»áá±á¬ááááºááᯠááá±ážááá¯ááºáá²á·áá«á
5. á¡ááŒááºá¡ááŸááºáááºááœááºááŸá¯ááœá²á·á ááºážáá¯á¶ááᯠáá¯áá¹áááááºážáá»áá» áá®ááá¯ááºážáá¯ááºááŒááºážááŒáá·áº áá¬áá®áááºááŸááºááá¯áááºáá»á¬ážááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááá¯ááºáááºá
á¡áááºááá·áºáá¯ááºáá¬ážáá±á¬ module áá»á¬ážááẠááŸá¯ááºááœá±ážááœááºážáááºá á¡ááŒá±á¬ááºážááŸá¬ áá»áœááºá¯ááºááá¯á·ááẠáá¯ááºáá±á¬ááºáá»ááºá¡áá»áá¯á·áᬠááá¯á¡ááºáá±á¬ááŒá±á¬áá·áºááŒá áºáááºá
ááá¯ááá¯á·ááŒá±á¬áááŒááºážááŸá¬ áááºá áœá²ááŸáá·áº ááŒá¿áá¬ááŸá¬ Apache á built-in áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááẠá¡áá¬áááºá០áááºá áœá²áá áºáá¯áá¯ááºáá±ážááŒááºážá¡á¬áž ááœáá·áºáááŒá¯áá² ááœááºááœááºáá²áá²á á áºáá±ážááá·áºá¡áá« Built-in áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááœáẠáááºá¹áá»á¬ááá¯ááºáᬠáá±á«ááºáž/áá¯ááºááŒááºáž áááŸááá«á
ááá¯ááá¯áááºááŸá¬ áááºáá±ážááááá«á
(%{env:zt-cert-date} + 30) > %{DATE}
ááááºážááŸá áºáá¯á¶ážáᬠááŸáá¯ááºážááŸááºááá¯ááºáááºá
Safari ááŒá¿áá¬á¡ááœáẠááŒá±ááŸááºážáááºážááᯠááŸá¬ááœá±áá±á
ááºááœáẠá
áááºáááºá
á¬ážá
áá¬áá±á¬ááºážááá·áº áá±á¬ááºážáá«ážáá
áºáá¯ááºááᯠáá»áœááºá¯ááºááœá±á·ááŸááá²á·áááº-
áááºážááẠNginx á¡ááœáẠLua ááœáẠáá¯ááºáááá°áá¬ááᯠáá±á¬áºááŒáá¬ážááŒá®ážá áááºážááẠááœááºáá±á«áº áá¬áááºááŸáá·áºá¡áá»áŸá áá»áœááºá¯ááºááá¯á· á¡áá±á¬ááºá¡áááºáá±á¬áºááŒá®ážáá±á¬ ááœá²á·á
ááºážááŸá¯áá¯á¶á
á¶á á¡á
áááºá¡ááá¯ááºážá áá¯áá¹ááááᯠá¡ááœááºááŒááºááá¯á
á±áááºá áááºážááẠhashing á¡ááœáẠhmac salting áááºážáááºážááᯠá¡áá¯á¶ážááŒá¯ááŒááºážááŸááœá²á ( áááºážááᯠApache ááœááºáááœá±á·áá«á)
Lua ááẠááŸááºážáááºážáá±á¬ áá¯áá¹áááá±áááŸááá±á¬ áá¬áá¬á áá¬ážááŒá áºáááºá Apache á¡ááœáẠááá¯ážááŸááºážáá±á¬ á¡áá¬áá áºáá¯ááᯠáá¯ááºáá±á¬ááºááẠááŒá áºááá¯ááºáááº-
LuaHookAccessChecker ááœáŸááºááŒá¬ážáá»áẠUnsetEnv ááœáŸááºááŒá¬ážáá»ááº
Nginx ááŸáá·áº Apache ááá¯á·á ááŒá¬ážáá¬ážáá»ááºááᯠáá±á·áá¬ááŒá®ážá
Lua áá¬áá¬á
áá¬áž áá¯ááºáá¯ááºáá°á០áááŸáááá¯ááºáá±á¬ áá¯ááºáá±á¬ááºáá»ááºáá»á¬áž
áááºááŸááá áºáá¯ááŸáá·áº ááŸáá¯ááºážááŸááºááẠá¡áá¬áááºá០áááºá áœá²ááᯠáááºááŸááºááá¯ááºááẠá¡ááœáẠenv variable áá»á¬ážááᯠ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 á¡áá±á¡ááœááºááᯠááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬ááºááŒá¯áá¯ááºááŒá®áž 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 á០á€á¡áá»ááºá¡áááºááᯠá¡ááŒá±áá¶á áááºáá±á¬ááºá á áºáá±ážááŒá®ážáá±á¬ááºááŸáᬠá¡áááºáááºáá¬áááºááŒá áºáááºá
á¡áááºážá¡ááŒá
áºááá¯á· áá»áááºáááºáá«á
áá±á¬ááºáá áºáá¯á
áá±áá¯áá»á¡á¬ážááŒáá·áºá Apache (ááŒá áºáá±á¬ááºážááŒá áºááá¯ááºááẠNginx áááºážááŒá áºááá¯ááºáááº) á á®á ááºááœá²á·á ááºážááŸá¯ááœáẠááœáŸááºááŒá¬ážáá»ááºáá»á¬ážááᯠáááºááá·áºá¡á á®á á¥áºááœááºáá±ážáá¬ážáááºááŸá¬ á¡áá±ážáááŒá®ážáá«á á¡áááºááŒá±á¬áá·áºááá¯áá±á¬áº á¡áá¯á¶ážááœáẠá¡áá¬á¡á¬ážáá¯á¶ážááẠá¡áá¯á¶ážááŒá¯áá°áá¶á០áá±á¬ááºážááá¯ááŸá¯áá¡á á®á¡á á¥áºááᯠá á®á á¥áºáá¬ážáááºááŒá áºááŒá®ážá áá¯ááºáá±á¬ááºááẠá¡á á®á¡á ááºááŸáá·áº ááá¯ááºáá®áá±á¬á Lua áá¬ááºááœáŸááºážáá»á¬áž
ááŒá®ážá á®ážááŸá¯-
á¡áá±á¬ááºá¡áááºáá±á¬áºááŒá®ážáá±á¬áẠááŒááºááá¯ááºáá±á¬ á¡ááŒá±á¡áá± (áááºážááá¯ááº)-
áááºáá±á¬ááºááŸá¯áá»á¬ážááŸáá·áº á¡ááŒá±áá¶á¡áá±á¬ááºá¡áŠáá»á¬áž á
á®áá¶ááá·áºááœá²ááŸá¯á¡á¬áž á¡ááá¯áááá¯ááááºáá»á¬áž (VPN) ááá«áá²á áá
áºá
á¯áá
áºá
ááºážáááºážááŸáá·áº áá¯á¶ááŒá¯á¶áá±á¬ IOS áá±á«áºááŸá ááá¯ááá¯ááºážááºáá¯ááºážá០áááŸáááá¯ááºáá«áááºá
áááºážááá¯ááºááᯠá¡á±á¬ááºááŒááºááŒá®ážááŒá®á áááºá áá±ážáá»á¬áž á¡áá¯ááºáá¯ááºááŒá®áž áááºááŸááºááẠááááºážáá±á¬ áá¯á¶ááŒá¯á¶áá±ážá¡ááá·áºáá áºáá¯ááŸááááºá
source: www.habr.com