Bidh an t-artaigil seo feumail dhaibhsan a tha:
- tha fios aige dè a th’ ann an Teisteanas Luchd-dèiligidh agus tha e a’ tuigsinn carson a dh’ fheumas e socaidean-lìn air Safari gluasadach;
- Bu toil leam seirbheisean lìn fhoillseachadh do chearcall cuibhrichte de dhaoine no dhomh fhìn a-mhàin;
- a’ smaoineachadh gu bheil a h-uile càil air a dhèanamh le cuideigin mu thràth, agus bu mhath leotha an saoghal a dhèanamh beagan nas goireasaiche agus nas sàbhailte.
Thòisich eachdraidh nan socaidean lìn mu ochd bliadhna air ais. Roimhe seo, chaidh dòighean mar iarrtasan HTTP fada (freagairtean dha-rìribh) a chleachdadh: chuireadh brabhsair an neach-cleachdaidh iarrtas chun an fhrithealaiche agus feitheamh ri freagairt, an uairsin ath-cheangal agus feitheamh às dèidh na freagairt. Ach an uairsin nochd socaidean lìn.

O chionn grunn bhliadhnaichean, leasaich sinn ar buileachadh fhèin ann am PHP fìor-ghlan, nach b’ urrainn dèiligeadh ri iarrtasan HTTPS, leis gur e sreath ceangail dàta a th’ ann. O chionn ghoirid, tha cha mhòr a h-uile frithealaiche lìn air ionnsachadh mar a nì iad proxy airson iarrtasan HTTPS agus taic a thoirt do connection:upgrade.
Nuair a thachair seo, thàinig socaidean-lìn gu bhith mar an t-seirbheis bunaiteach airson aplacaidean SPA, leis gu bheil e cho goireasach susbaint a thoirt don neach-cleachdaidh aig iomairt an fhrithealaiche (gus teachdaireachd a chuir air adhart bho neach-cleachdaidh eile no gus dreach ùr de ìomhaigh, sgrìobhainn no taisbeanadh a luchdachadh suas a tha cuideigin eile an-dràsta a’ deasachadh).
Ged a tha Client Cert air a bhith ann airson ùine mhòr, tha e fhathast air a dhroch thaic leis gu bheil e ag adhbhrachadh grunn dhuilgheadasan nuair a thathar a’ feuchainn ri a sheachnadh. Agus (’s dòcha :slightly_smiling_face: ) is e sin as coireach gu bheil brobhsairean iOS (a h-uile brobhsair ach a-mhàin Safari) a’ diùltadh a chleachdadh agus ga iarraidh bhon stòr teisteanasan ionadail. Tha teisteanasan a’ tabhann mòran bhuannachdan thairis air logadh a-steach/pas no iuchraichean SSH no dùnadh nam puirt riatanach tro bhalla-teine. Ach chan e sin a’ phuing.
Air iOS, tha am modh-obrach stàlaidh teisteanas gu math sìmplidh (ged nach eil e às aonais a shònrachaidhean), ach mar as trice bidh e a’ leantainn grunn stiùiridhean air-loidhne a tha rim faighinn a-mhàin airson brabhsair Safari. Gu mì-fhortanach, chan urrainn dha Safari Teisteanasan Luchd-dèiligidh a chleachdadh airson socaidean lìn, ach tha gu leòr stiùiridhean air-loidhne ann air mar a chruthaicheas tu teisteanas mar sin, ach ann an cleachdadh, chan eil e comasach a choileanadh.

Gus tuigse fhaighinn air socaidean lìn, chleachd sinn am plana a leanas: duilgheadas/beachd-bharail/fuasgladh.
Problem: Chan eil taic ann airson socaidean lìn nuair a thathar a’ cur iarrtasan gu goireasan a tha fo dhìon teisteanas teachdaiche ann am brabhsair gluasadach Safari airson iOS agus aplacaidean eile aig a bheil taic teisteanas air a chomasachadh.
Barailean:
- Tha e comasach eisgeachd mar sin a rèiteachadh gus teisteanasan a chleachdadh (le fios nach bi iad an làthair) airson socaidean lìn de ghoireasan progsaidh a-staigh/a-muigh.
- Airson socaidean lìn, faodar ceangal sònraichte, tèarainte agus dìonta a chruthachadh le bhith a’ cleachdadh seiseanan sealach a thèid a chruthachadh le iarrtas brabhsair cunbhalach (nach e socaid lìn a th’ ann).
- Faodar seiseanan sealach a chur an gnìomh le bhith a’ cleachdadh aon fhrithealaiche lìn progsaidh (modalan agus gnìomhan togte a-mhàin).
- Chaidh comharran seisein sealach a chur an gnìomh mu thràth mar mhodalan Apache deiseil.
- Faodar comharran seisein sealach a chur an gnìomh le bhith a’ dealbhadh structar an eadar-obrachaidh gu loidsigeach.
Staid ri fhaicinn às dèidh a chur an gnìomh.
Amas na h-obrach: Bu chòir gum biodh e comasach riaghladh sheirbheisean is bun-structair a dhèanamh bho fhòn-làimhe le iOS gun phrògraman a bharrachd (leithid VPN), ann an dòigh aonaichte is tèarainte.
Amas a bharrachd: A’ sàbhaladh ùine agus ghoireasan/trafaic fòn (bidh cuid de sheirbheisean às aonais socaidean lìn a’ gineadh iarrtasan neo-riatanach) le lìbhrigeadh susbaint nas luaithe air an eadar-lìon gluasadach.
Mar a nì thu sgrùdadh?
1. Duilleagan fosglaidh:
— например, 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. No ann an consol an leasaiche:

Deuchainn barail:
1. Tha e comasach eisgeachd mar sin a rèiteachadh airson teisteanasan a chleachdadh (le fios nach bi iad an làthair) airson socaidean lìn de ghoireasan progsaidh a-staigh/a-muigh.
Chaidh 2 fhuasgladh a lorg an seo:
a) Aig an ìre
<Location sock*> SSLVerifyClient optional </Location>
<Location /> SSLVerifyClient require </Location>
atharraich an ìre ruigsinneachd.
Tha na nuances a leanas aig an dòigh seo:
- Bidh dearbhadh teisteanais a’ tachairt an dèidh iarrtas chun ghoireas progsaidh, i.e., crathadh-làimhe às dèidh an iarrtais. Tha seo a’ ciallachadh gun luchdaich am progsaidh an t-iarrtas chun na seirbheis fo dhìon an toiseach agus an uairsin gun diùlt e e. Tha seo dona, ach chan eil e deatamach;
- Anns a’ phròtacal HTTP2. Tha e fhathast ann an cruth dreachd, agus chan eil fios aig luchd-reic bhrabhsairean ciamar a chuireas iad an gnìomh e. #info mu chrathadh-làimhe post http2 tls1.3 (chan eil e ag obair an-dràsta) ;
- Chan eil e soilleir ciamar a thèid an giullachd seo aonachadh.
b) Aig an ìre bhunasach, leig le SSL gun teisteanas.
Tha SSLVerifyClient riatanach => SSLVerifyClient roghainneil, ach tha seo a’ lughdachadh ìre tèarainteachd an fhrithealaiche proxy, leis gun tèid ceangal mar sin a phròiseasadh às aonais teisteanas. Ach, faodaidh tu ruigsinneachd do sheirbheisean proxies a dhiùltadh tuilleadh leis an stiùireadh a leanas:
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"
Airson tuilleadh fiosrachaidh, faic an artaigil mu SSL:
Chaidh an dà roghainn a dhearbhadh, chaidh roghainn "b" a thaghadh air sgàth cho ioma-chruthach 's a bha e agus cho co-chòrdail 's a bha e ris a' phròtacal http2.
Gus dearbhadh a dhèanamh air a’ bharail seo, bha feum air mòran dheuchainnean leis an rèiteachadh; chaidh na dealbhaidhean a leanas a dhearbhadh:
ma tha = feum = ath-sgrìobh
B’ e seo an dealbhadh bunaiteach a thàinig às:
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>
Leis an ùghdarras a th’ ann mar-thà leis an t-sealbhadair teisteanais, ach le teisteanas a dhìth, b’ fheudar sealbhadair teisteanais nach robh ann a chur ris ann an cruth aon de na caochladairean SSl_PROTOCOL a bha rim faighinn (an àite SSL_CLIENT_S_DN_CN), barrachd fiosrachaidh anns na sgrìobhainnean:

2. Airson socaidean lìn, faodaidh tu ceangal sònraichte, tèarainte agus dìonta a chruthachadh le bhith a’ cleachdadh seiseanan sealach a thèid a chruthachadh rè iarrtas brabhsair cunbhalach (nach e socaid lìn a th’ ann).
Stèidhichte air eòlas a bh’ ann roimhe, tha e riatanach earrann a bharrachd a chur ris an rèiteachadh gus am bi comharran sealach airson ceanglaichean socaid lìn air an ullachadh airson iarrtas cunbhalach (nach eil mar socaid lìn).
#подготовка передача себе С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>
Sheall deuchainnean gu bheil seo ag obair. Tha e comasach briosgaidean a thar-chur gu brabhsair an neach-cleachdaidh.
3. Faodar seiseanan sealach a chur an gnìomh le bhith a’ cleachdadh aon fhrithealaiche lìn progsaidh (modalan agus gnìomhan togte a-mhàin).
Mar a dh’ionnsaich sinn roimhe, tha tòrr phrìomh ghnìomhan aig Apache a leigeas leinn bun-bheachdan cumhach a chruthachadh. Ach, feumaidh sinn ar fiosrachadh a dhìon fhad ‘s a tha e ann am brabhsair an neach-cleachdaidh, agus mar sin bidh sinn a’ mìneachadh dè a stòras sinn agus airson dè an adhbhar, agus dè na gnìomhan togte a chleachdas sinn:
- Feumaidh sinn comharra nach gabh a dhì-chòdachadh gu furasta.
- Feumaidh sinn comharra aig a bheil crìoch-ama togte a-steach dha agus a’ chomas sgrùdadh a dhèanamh air an fhrithealaiche airson crìoch-ama.
- Feumaidh sinn comharra a bhios co-cheangailte ri sealbhadair an teisteanais.
Feumaidh seo gnìomh hashing, salann, agus ceann-latha crìochnachaidh comharra. A rèir an sgrìobhainneachd, Tha a h-uile rud againn a-mach às a’ bhogsa sha1 agus %{TIME}.
B’ e seo an dealbhadh a thàinig às:
#нет сертификата, и обращение к 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>
Chaidh an amas a choileanadh, ach tha cùisean ann le aois an fhrithealaiche (faodaidh tu briosgaid bliadhna a dh'aois a chleachdadh), a tha a’ ciallachadh, ged a tha comharran sàbhailte airson an cleachdadh a-staigh, nach eil iad sàbhailte airson an cleachdadh gu gnìomhachais (mòr-chleachdadh).

4. Tha comharran seisein sealach air an cur an gnìomh mu thràth mar mhodalan Apache deiseil.
Tha aon dhuilgheadas mòr ann fhathast bhon dreach roimhe: an neo-chomas smachd a chumail air crìoch nan comharran.
Tha sinn a’ coimhead airson modúl deiseil a nì seo, a rèir an leanas: apache token json two-factor auth
Seadh, tha modalan deiseil ann, ach tha iad uile ceangailte ri gnìomhan sònraichte agus tha nithean neo-àbhaisteach aca leithid toiseach seisein agus briosgaidean a bharrachd. ’S e sin, chan eil iad sealach.
Thug e còig uairean a thìde dhuinn a bhith a’ lorg, ach cha d’ fhuair sinn toradh cinnteach sam bith.
5. Faodar comharran seisein sealach a chur an gnìomh le bhith a’ dealbhadh structar an eadar-obrachaidh gu loidsigeach.
Tha na modalan deiseil ro iom-fhillte, oir chan eil feum againn ach air dà ghnìomh.
Is e an duilgheadas leis a’ cheann-latha nach eil gnìomhan togte Apache a’ leigeil le ceann-latha a chruthachadh bhon àm ri teachd, agus chan eil cur-ris/toirt-air-falbh matamataigeach ann nuair a thathar a’ sgrùdadh airson crìochnachaidh anns na gnìomhan togte.
'S e sin, chan urrainn dhut sgrìobhadh:
(%{env:zt-cert-date} + 30) > %{DATE}
Chan urrainnear ach dà àireamh a choimeas.
Fhad ’s a bha mi a’ lorg fuasgladh airson duilgheadas Safari, lorg mi an artaigil inntinneach seo:
Tha e a’ toirt cunntas air còd sampall ann an Lua airson Nginx, agus a tha, mar a tha e a’ tionndadh a-mach, a’ leantainn gu dlùth ri loidsig a’ phàirt den rèiteachadh a bha sinn air a chur an gnìomh mu thràth, ach a-mhàin a bhith a’ cleachdadh an dòigh hmac airson salann a shuidheachadh airson hashing (cha deach seo a lorg ann an Apache).
Dh’fhàs e soilleir gur e cànan le loidsig shoilleir a th’ ann an Lua, agus gu bheil e comasach rudeigin sìmplidh a chruthachadh airson Apache:
Às dèidh sgrùdadh a dhèanamh air na h-eadar-dhealachaidhean eadar Nginx agus Apache:
Agus na gnìomhan a tha rim faighinn bhon riochdaire cànain Lua:
Chaidh dòigh a lorg airson caochladairean env a shuidheachadh ann am faidhle beag Lua gus ceann-latha san àm ri teachd a shuidheachadh airson coimeas a dhèanamh ris an fhear làithreach.
Seo mar a tha sgriobt Lua sìmplidh a’ coimhead:
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
Agus seo mar a tha e uile ag obair còmhla, le bhith a’ leasachadh àireamh nam briosgaidean agus a’ cur an àite an tòcan nuair a thachras leth na h-ùine mus tig crìoch air a’ bhriosgaid (tòcan) a bh’ ann roimhe:
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
Leis nach tèid LuaHookAccessChecker a ghnìomhachadh ach an dèidh sgrùdaidhean ruigsinneachd stèidhichte air an fhiosrachadh seo bho Nginx.

Ceangal stòrais.
Aon phuing eile.
San fharsaingeachd, chan eil e gu diofar dè an òrdugh anns a bheil na stiùiridhean air an sgrìobhadh ann an rèiteachadh Apache (agus is dòcha Nginx cuideachd), leis gun tèid a h-uile càil a sheòrsachadh mu dheireadh a rèir an òrdugh anns a bheil iarrtas an neach-cleachdaidh air a phròiseasadh, a tha a’ freagairt ris an sgeama airson sgriobtaichean Lua a phròiseasadh.
Crìochnachadh:
Staid ri fhaicinn às dèidh a chur an gnìomh (targaid):
Tha riaghladh seirbheis is bun-structair ri fhaighinn bho fhòn-làimhe iOS gun bathar-bog a bharrachd (VPN), aonaichte agus tèarainte.
Chaidh an amas a choileanadh, tha socaidean lìn ag obair agus chan eil ìre tèarainteachd nas ìsle aca na teisteanas.

Source: www.habr.com
