ืืืืืจ ืืืื ืฉืืืืฉื ืืื:
- ืืืืข ืืื Client Cert ืืืืื ืืืืข ืืื ืืงืืง ื-websockets ื-Safari ื ืืื;
- ืืจืฆืื ื ืืคืจืกื ืฉืืจืืชื ืืื ืืจื ื ืืืขืื ืืฆืืืฆื ืฉื ืื ืฉืื ืื ืจืง ืืขืฆืื;
- ืืืฉื ืฉืืื ืืืจ ื ืขืฉื ืขื ืืื ืืืฉืื, ืืจืืฆื ืืขืฉืืช ืืช ืืขืืื ืงืฆืช ืืืชืจ ื ืื ืืืืื.
ืืืืกืืืจืื ืฉื websockets ืืืื ืืคื ื ื-8 ืฉื ืื. ืืขืืจ, ื ืขืฉื ืฉืืืืฉ ืืฉืืืืช ืืฆืืจื ืฉื ืืงืฉืืช http ืืจืืืืช (ืืืขืฉื ืชืืืืืช): ืืืคืืคื ืฉื ืืืฉืชืืฉ ืฉืื ืืงืฉื ืืฉืจืช ืืืืื ืฉืืื ืืขื ื ืขื ืืฉืื, ืืืืจ ืืชืืืื ืืื ืืชืืืจ ืฉืื ืืืืชืื. ืืื ืื ืืืคืืขื ืฉืงืขื ืืื ืืจื ื.
ืืคื ื ืืกืคืจ ืฉื ืื ืคืืชืื ื ืืืฉืื ืืฉืื ื ื-PHP ืืืืจ, ืฉืืื ื ืืืื ืืืฉืชืืฉ ืืืงืฉืืช https, ืืืืืื ืฉืื ืฉืืืช ืืงืืฉืืจ. ืืคื ื ืืื ืื ืจื, ืืืขื ืื ืฉืจืชื ืืืื ืืจื ื ืืืื ืืงืฉืืช ืคืจืืงืกื ืืจื https ืืชืืืืื ืืืืืืจ:ืฉืืจืื.
ืืฉืื ืงืจื, websockets ืืคื ืืืขื ืืฉืืจืืช ืืจืืจืช ืืืืื ืขืืืจ ืืืฉืืื SPA, ืื ืืื ื ืื ืืกืคืง ืชืืื ืืืฉืชืืฉ ืืืืืืช ืืฉืจืช (ืืฉืืจ ืืืืขื ืืืฉืชืืฉ ืืืจ ืื ืืืืจืื ืืจืกื ืืืฉื ืฉื ืชืืื ื, ืืกืื, ืืฆืืช ืฉืืืฉืื ืืืจ ืขืืจื ืืจืืข).
ืืืจืืช ืฉืชืขืืืช ืืงืื ืงืืืืช ืืืจ ืื ืืจืื ืืื, ืืื ืขืืืื ื ืชืืืช ืืฆืืจื ืืจืืขื, ืืืืืื ืฉืืื ืืืฆืจืช ืืจืื ืืขืืืช ืืืฉืจ ืื ืกืื ืืขืงืืฃ ืืืชื. ื(ืืืื :slightly_smiling_face: ) ืื ืืกืืื ืฉืืคืืคื ื IOS (ืืืื ืืืื ืกืคืืจื) ืื ืจืืฆืื ืืืฉืชืืฉ ืื ืืืืงืฉ ืืืช ืืื ืืช ืืชืขืืืืช ืืืงืืืืช. ืืืืฉืืจืื ืืชืจืื ืืช ืจืืื ืืืฉืืืื ืืืคืชืืืช ืื ืืกื/ืืขืืจ ืื ssh ืื ืกืืืจืช ืืคืืจืืื ืืืจืืฉืื ืืจื ืืืืช ืืฉ. ืืื ืื ืขื ืื ืืืืืจ.
ื-iOS, ืืืื ืืชืงื ืช ืืืืฉืืจ ืืื ืื ืคืฉืื (ืื ืืื ืคืจืืื), ืืื ืืืืคื ืืืื ืื ื ืขืฉื ืขื ืคื ืืืจืืืช, ืืื ืืฉ ืืจืื ืืืื ืืจื ื ืืืฉืจ ืืืื ืืช ืจืง ืขืืืจ ืืคืืคื Safari. ืืืจืื ืืฆืขืจ, Safari ืื ืืืืข ืืืฉืชืืฉ ื-Client ะกert ืขืืืจ ืฉืงืขื ืืื ืืจื ื, ืื ืืฉื ื ืื ืืืืช ืจืืืช ืืืื ืืจื ื ืืืฆื ืืืฆืืจ ืชืขืืื ืืื, ืื ืืคืืขื ืืืืจ ืืื ื ืืจ ืืฉืื.
ืืื ืืืืื ืืช websockets, ืืฉืชืืฉื ื ืืชืืื ืืช ืืืื: ืืขืื/ืืฉืขืจื/ืคืชืจืื.
ืืขืื: ืืื ืชืืืื ืืฉืงืขื ืืื ืืจื ื ืืขืช ืืขืืจืช ืืงืฉืืช ืืคืจืืงืกื ืืืฉืืืื ืืืืื ืื ืขื ืืื ืืืฉืืจ ืืงืื ืืืคืืคื ืืกืืืืจื ืฉื Safari ืขืืืจ IOS ืืืืฉืืืื ืืืจืื ืฉืืคืฉืจื ืชืืืื ืืืืฉืืจืื.
ืืฉืขืจืืช:
- ืืคืฉืจ ืืืืืืจ ืืจืื ืืื ืืฉืืืืฉ ืืชืขืืืืช (ืืืืืขื ืฉืื ืืืื ืืืื) ื-websockets ืฉื ืืฉืืื ืคืจืืงืกื ืคื ืืืืื/ืืืฆืื ืืื.
- ืขืืืจ websockets, ืืชื ืืืื ืืืฆืืจ ืืืืืจ ืืืืืื, ืืืืืื ืืืจ ืืื ื ืืืืฆืขืืช ืืคืขืืืช ืืื ืืืช ืฉื ืืฆืจืืช ืืืืื ืืงืฉืช ืืคืืคื ืจืืืื (ืฉืืื ื ื websocket).
- ื ืืชื ืืืืฉื ืืคืขืืืช ืืื ืืืช ืืืืฆืขืืช ืฉืจืช ืืื ืืจื ื ืคืจืืงืกื ืืื (ืืืืืืื ืืคืื ืงืฆืืืช ืืืื ืื ืืืื).
- ืืกืืืื ื ืืคืขืื ืืื ืืื ืืืจ ืืืฉืื ืืืืืืืื ืืืื ืื ืฉื Apache.
- ื ืืชื ืืืืฉื ืืกืืืื ื ืืคืขืื ืืื ืืื ืขื ืืื ืชืื ืื ืืืืื ื ืฉื ืืื ื ืืืื ืืจืืงืฆืื.
ืืฆื ืืืื ืืืืจ ืืืฉืื.
ืืืจืช ืืขืืืื: ื ืืืื ืืฉืืจืืชืื ืืืชืฉืชืืช ืฆืจืื ืืืืืช ื ืืืฉ ืืืืคืื ื ืืื ื-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. ืื ืืืกืืฃ ืืืคืชืืื:
ืืืืงืช ืืฉืขืจืืช:
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:
ืฉืชื ืืืคืฉืจืืืืช ื ืืืงื, ืืคืฉืจืืช "ื" ื ืืืจื ืืฉื ืืจืืืื ืืืช ืฉืื ืืชืืืืืชื ืืคืจืืืืงืื 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), ืคืจืืื ื ืืกืคืื ืืชืืขืื:
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 ืืฉ ืื ืืจืื ืคืื ืงืฆืืื ืืืืช ืืืื ืืืืคืฉืจืช ืื ืืืฆืืจ ืืื ืื ืืืชื ืื. ืขื ืืืช, ืื ื ืืงืืงืื ืืืืฆืขืื ืืื ืืืื ืขื ืืืืืข ืฉืื ื ืืืื ืฉืืื ื ืืฆื ืืืคืืคื ืฉื ืืืฉืชืืฉ, ืื ืื ื ืงืืืขืื ืื ืืืืกื ืืืื, ืืืืืื ืคืื ืงืฆืืืช ืืืื ืืช ื ืฉืชืืฉ:
- ืื ืื ื ืฆืจืืืื ืืกืืืื ืฉืื ื ืืชื ืืคืขื ื ืืงืืืช.
- ืื ืื ื ืฆืจืืืื ืืกืืืื ืฉืืฉ ืื ืืชืืืฉื ืืช ืืืื ืืช ืืืืืืช ืืืืืง ืืชืืืฉื ืืช ืืฉืจืช.
- ืื ืื ื ืฆืจืืืื ืืกืืืื ืฉืืฉืืื ืืืขื ืืชืขืืื.
ืื ืืืจืฉ ืคืื ืงืฆืืืช ืืืืื, ืืื ืืชืืจืื ืืื ืืืืฉื ืืช ืืืกืืืื. ืืืืกืก ืขื ืืชืืขืื
ืืชืืฆืื ืืืืชื ืืขืืฆืื ืืื:
#ะฝะตั ัะตััะธัะธะบะฐัะฐ, ะธ ะพะฑัะฐัะตะฝะธะต ะบ 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.
ืืขืื ืืฉืืขืืชืืช ืืืช ื ืืชืจื ืืืืืืจืฆืื ืืงืืืืช - ืืืกืจ ืืืืืืช ืืฉืืื ืืืืืงื ืืช ืืืกืืืื ืื.
ืื ืื ื ืืืคืฉืื ืืืืื ืืืื ืฉืขืืฉื ืืืช, ืืคื ืืืืืื: apache token json two factor auth
ืืืืืช ืืงืื ืืืืฆืขืืช ืืกืืืื ืื ืืืืืกืกืื ืขื JSON Web Tokens ืืืืืช ืื-ืืืจืื ืฉื Apache (2FA). ืืืฆื ืืืืกืืฃ ืืืืืช ืื-ืืืจืื ื- Apache ืืื ืืืืืช ืื-ืืืจืื ืืืืคืข ื-Apache ืฉืื โโืขื ืืชืงื ืช ืืืืื ืคืฉืืื
ืื, ืืฉ ืืืืืืื ืืืื ืื, ืืื ืืืื ืงืฉืืจืื ืืคืขืืืืช ืกืคืฆืืคืืืช ืืืฉ ืืื ืืคืฆืื ืืฆืืจืช ืืชืืืช ืืคืขืื ืืงืืืฆื Cookie ื ืืกืคืื. ืืืืืจ, ืื ืืืื ืื.
ืืงื ืื ื ืืืฉ ืฉืขืืช ืืืคืฉ, ืื ืฉืื ื ืชื ืชืืฆืื ืงืื ืงืจืืืช.
5. ื ืืชื ืืืืฉื ืืกืืืื ื ืืคืขืื ืืื ืืื ืขื ืืื ืชืื ืื ืืืืื ื ืฉื ืืื ื ืืืื ืืจืืงืฆืืืช.
ืืืืืืื ืืืื ืื ืื ืืืจืืืื ืืื, ืื ืื ืื ื ืฆืจืืืื ืจืง ืืื ืคืื ืงืฆืืืช.
ืขื ืืืช, ืืืขืื ืขื ืืชืืจืื ืืื ืฉืืคืื ืงืฆืืืช ืืืืื ืืช ืฉื Apache ืืื ื ืืืคืฉืจืืช ืืืฆืืจ ืชืืจืื ืืืขืชืื, ืืืื ืืืืืจ/ืืืกืืจ ืืชืืื ืืคืื ืงืฆืืืช ืืืืื ืืช ืืขืช ืืืืงืช ืืชืืืฉื ืืช.
ืืืืืจ, ืืชื ืื ืืืื ืืืชืื:
(%{env:zt-cert-date} + 30) > %{DATE}
ืืชื ืืืื ืืืฉืืืช ืจืง ืฉื ื ืืกืคืจืื.
ืชืื ืืื ืืืคืืฉ ืืืจ ืคืชืจืื ืืืขืืืช ืืกืคืืจื, ืืฆืืชื ืืืืจ ืืขื ืืื:
ืืื ืืชืืจ ืืืืื ืืงืื ื-Lua ืขืืืจ Nginx, ืืืฉืจ, ืืคื ืฉืืชืืจืจ, ืืืืจ ืืืื ืขื ืืืืืืื ืฉื ืืืชื ืืืง ืืชืฆืืจื ืฉืืืจ ืืืฉืื ื, ืืืขื ืืฉืืืืฉ ืืฉืืืช hmac salting ืขืืืจ hashing ( ืื ืื ื ืืฆื ืืืคืฆ'ื).
ืืชืืจืจ ืฉืืืื ืืื ืฉืคื ืขื ืืืืืื ืืจืืจ, ืืืคืฉืจ ืืขืฉืืช ืืฉืื ืคืฉืื ืขืืืจ ืืคืืฆ'ื:
ืืืืจ ืฉืืืืชื ืืช ืืืืื ืขื Nginx ื- Apache:
ืืคืื ืงืฆืืืช ืืืื ืืช ืืืฆืจื ืฉืคืช Lua:
ืืฆืื ื ืืจื ืืืืืืจ ืืฉืชื ื 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.
ืงืืฉืืจ ืืืงืืจ
ืขืื ืจืืข ืืื.
ืืืืคื ืืืื, ืื ืืฉื ื ืืืืื ืกืืจ ืืื ืืืืช ื ืืชืืืช ืืชืฆืืจืช Apache (ืื ืจืื ืื Nginx), ืฉืื ืืกืืคื ืฉื ืืืจ ืืื ืืกืืืจ ืืคื ืกืืจ ืืืงืฉื ืืืืฉืชืืฉ, ืืชืืื ืืช ืืกืืืื ืืขืืืื ืชืกืจืืื ืืืื.
ืกึดืืึผื:
ืืฆื ืืืื ืืืืจ ืืืฉืื (ืืขื):
ื ืืืื ืืฉืืจืืชืื ืืืชืฉืชืืืช ืืืื ืืืืคืื ื ืืื ื-IOS ืืื ืชืืื ืืืช ื ืืกืคืืช (VPN), ืืืืื ืืืืืืื.
ืืืืจื ืืืฉืื, ืฉืงืขื ืืื ืืจื ื ืขืืืืื ืืืขืื ืจืืช ืืืืื ืื ืคืืืช ืืชืขืืื.
ืืงืืจ: www.habr.com