ProHoster > Blog > Administrazioa > ZeroTech-en nola konektatu genuen Apple Safari eta bezeroen ziurtagiriak websocketekin
ZeroTech-en nola konektatu genuen Apple Safari eta bezeroen ziurtagiriak websocketekin
Artikulua erabilgarria izango da:
badaki zer den Client Cert eta ulertzen du zergatik behar dituen websocket-ak Safari mugikorrean;
Web zerbitzuak argitaratu nahiko nituzke jende zirkulu mugatu bati edo nire buruari bakarrik;
uste du dagoeneko dena norbaitek egin duela, eta mundua apur bat erosoago eta seguruago egin nahiko luke.
Websocketen historia duela 8 urte inguru hasi zen. Aurretik, http eskaera luzeen (egia esan, erantzunak) moduan erabiltzen ziren metodoak: erabiltzailearen nabigatzaileak eskaera bat bidali zion zerbitzariari eta hark zerbait erantzuteko itxaron zuen, erantzunaren ondoren berriro konektatu eta itxaron zuen. Baina gero websocketak agertu ziren.
Duela urte batzuk, gure inplementazio propioa garatu genuen PHP hutsean, zeinak ezin ditu https eskaerak erabili, hau esteka geruza baita. Duela gutxi, ia web zerbitzari guztiek https-ren bidez proxy-eskaerak eta konexioa onartzen: berritzea ikasi zuten.
Hori gertatu zenean, websocket-ak SPA aplikazioetarako ia zerbitzu lehenetsia bihurtu ziren, zeren erosoa den erabiltzaileari zerbitzariaren ekimenez edukia eskaintzea (beste erabiltzaile baten mezu bat bidali edo irudi, dokumentu, aurkezpen baten bertsio berri bat deskargatu). beste norbait une honetan editatzen ari dela) .
Bezeroaren Ziurtagiria denbora dezente egon bada ere, oraindik gaizki onartzen da, arazo asko sortzen baititu saihesten saiatzean. Eta (baliteke :slightly_smiling_face: ) horregatik IOS arakatzaileek (Safari izan ezik) ez dute erabili nahi eta tokiko ziurtagiri dendatik eskatu. Ziurtagiriek abantaila asko dituzte login/pass edo ssh gakoekin edo beharrezko atakak suebaki baten bidez ixtearekin alderatuta. Baina hori ez da hori.
iOS-en, ziurtagiri bat instalatzeko prozedura nahiko sinplea da (ez dago zehaztasunik gabe), baina, oro har, argibideen arabera egiten da, Interneten asko daude eta Safari nabigatzailerako bakarrik daude eskuragarri. Zoritxarrez, Safari-k ez daki nola erabili Client Π‘ert web socketetarako, baina Interneten argibide asko daude ziurtagiri hori nola sortu jakiteko, baina praktikan hori ezinezkoa da.
Websocketak ulertzeko, plan hau erabili dugu: arazoa/hipotesia/konponbidea.
Arazoa: ez dago laguntzarik web socketetarako Safari mugikorreko IOSrako eta ziurtagirien euskarria gaitu duten beste aplikazioetarako bezero-ziurtagiri batek babestuta dauden baliabideetara eskaerak proxyz bidaltzean.
Hipotesiak:
Posible da horrelako salbuespen bat konfiguratu ziurtagiriak erabiltzeko (jakinduta ez dela egongo) barne/kanpo proxy baliabideen websocketetan.
Websocketetarako, konexio bakarra, segurua eta defendagarria egin dezakezu arakatzailearen eskaera arrunt batean (websocket ez dena) sortzen diren aldi baterako saioak erabiliz.
Aldi baterako saioak proxy web zerbitzari bakarra erabiliz inplementa daitezke (modulu eta funtzio integratuak soilik).
Aldi baterako saio-tokenak prest dauden Apache modulu gisa inplementatu dira.
Aldi baterako saio-tokenak interakzio-egitura logikoki diseinatuz inplementa daitezke.
Ezarpenaren ondoren ikusgai dagoen egoera.
Lanaren helburua: zerbitzuen eta azpiegituren kudeaketa IOSeko telefono mugikor batetik eskuragarri egon behar da programa gehigarririk gabe (adibidez, VPN), bateratua eta segurua.
Helburu gehigarria: denbora eta baliabideak/telefono trafikoa aurreztea (web socket gabeko zerbitzu batzuek alferrikako eskaerak sortzen dituzte) Internet mugikorrean edukia azkarrago bidaltzearekin.
Ziurtagiriaren egiaztapena proxy baliabideari egindako eskaeraren ondoren gertatzen da, hau da, eskaeraren esku-ematearen ondoren. Horrek esan nahi du proxyak lehenik kargatuko duela eta ondoren babestutako zerbitzurako eskaera moztuko duela. Hau txarra da, baina ez da kritikoa;
http2 protokoloan. Zirriborroan dago oraindik, eta arakatzaileen fabrikatzaileek ez dakite nola inplementatu #info info tls1.3 http2 post handshake (orain ez da funtzionatzen) Inplementatu RFC 8740 "TLS 1.3 erabiltzea HTTP/2-rekin";
Ez dago argi prozesamendu hori nola bateratu.
b) Oinarrizko mailan, ssl baimendu ziurtagiririk gabe.
SSLVerifyClient require => SSLVerifyClient aukerakoa, baina honek proxy zerbitzariaren segurtasun maila murrizten du, konexio hori ziurtagiririk gabe prozesatuko baita. Hala ere, proxy zerbitzuetarako sarbidea uka dezakezu honako zuzentarau honekin:
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"
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>
Ziurtagiriaren jabeak dagoen baimena kontuan hartuta, baina ziurtagiri bat falta zenez, existitzen ez den ziurtagiriaren jabea gehitu behar izan dut eskuragarri dauden aldagaietako SSl_PROTOCOL (SSL_CLIENT_S_DN_CNren ordez), xehetasun gehiago dokumentazioan:
2. Websocketetarako, konexio bakarra, segurua eta babestua egin dezakezu arakatzaile-eskaera arrunt batean (ez-websocket) sortzen diren aldi baterako saioak erabiliz.
Aurreko esperientzian oinarrituta, atal gehigarri bat gehitu behar diozu konfigurazioari web socket konexioetarako aldi baterako tokenak prestatzeko ohiko eskaera batean (web ez den socket).
Probak frogatu du funtzionatzen duela. Posible da Cookieak transferitzea erabiltzailearen nabigatzailearen bidez.
3. Aldi baterako saioak proxy web zerbitzari bakarra erabiliz inplementa daitezke (modulu eta funtzio integratuak soilik).
Lehenago jakin genuenez, Apache-k baldintzazko eraikuntzak sortzeko aukera ematen duen oinarrizko funtzionalitate asko ditu. Hala ere, gure informazioa babesteko baliabideak behar ditugu erabiltzailearen nabigatzailean dagoen bitartean, beraz, zer eta zergatik gorde behar dugun eta zer funtzio integratuak erabiliko ditugun zehaztuko dugu:
Erraz deskodetu ezin den token bat behar dugu.
Zaharkitzea eta zerbitzarian zaharkitzea egiaztatzeko gaitasuna duen token bat behar dugu.
Ziurtagiriaren jabearekin elkartuko den token bat behar dugu.
Horretarako hashing funtzioa, gatza eta data behar dira tokena zahartzeko. Dokumentazioan oinarrituta Adierazpenak Apache HTTP zerbitzarian dena kaxatik kanpo daukagu ββsha1 eta %{TIME}.
Helburua lortu da, baina zerbitzariaren zaharkitzearekin arazoak daude (urte bateko Cookie bat erabil dezakezu), hau da, tokenak, barne erabilerarako seguruak izan arren, ez dira seguruak industriarako (masa) erabilerarako.
4. Aldi baterako saio-tokenak prest dauden Apache modulu gisa inplementatu dira.
Aurreko iteraziotik arazo esanguratsu bat geratu zen: tokenen zahartzea kontrolatzeko ezintasuna.
Hau egiten duen prest egindako modulu baten bila gabiltza, hitzen arabera: apache token json two factor auth
Bai, badaude prest egindako moduluak, baina denak ekintza zehatzei lotuta daude eta saio bat hasteko eta Cookie osagarriak dituzte. Hau da, ez denbora baterako.
Bost ordu behar izan ditugu bilaketak egiteko, eta horrek ez du emaitza zehatzik eman.
5. Aldi baterako saio-tokenak inplementa daitezke interakzioen egitura logikoki diseinatuz.
Prest egindako moduluak konplexuegiak dira, funtzio pare bat baino ez ditugulako behar.
Hori esanda, dataren arazoa da Apache-ren funtzio integratuek ez dutela etorkizuneko datarik sortzen uzten, eta ez dago batuketa/kenketa matematikorik integratutako funtzioetan zaharkituta dagoen egiaztatzean.
Hau da, ezin duzu idatzi:
(%{env:zt-cert-date} + 30) > %{DATE}
Bi zenbaki bakarrik konparatu ditzakezu.
Safari arazoari irtenbide bat bilatzen ari nintzela, artikulu interesgarri bat aurkitu dut: HomeAssistant bezeroaren ziurtagiriekin ziurtatzea (Safari/iOS-ekin funtzionatzen du)
Nginx-erako Lua-n kode-adibide bat deskribatzen du, eta, ondorioz, dagoeneko inplementatu dugun konfigurazioaren zati horren logika oso errepikatzen du, hasherako hmac salting metodoa erabiltzea izan ezik ( hau ez zen Apache-n aurkitu).
Argi geratu zen Lua logika argia duen hizkuntza bat dela, eta posible dela zerbait sinplea egitea Apacherentzat:
Lua fitxategi txiki batean env aldagaiak ezartzeko modu bat aurkitu dugu etorkizuneko data bat ezartzeko egungoarekin alderatzeko.
Hau da Lua script sinple baten itxura:
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
Eta horrela funtzionatzen du guztiak guztira, Cookie-kopurua optimizatuz eta tokena ordezkatuz Cookie zaharra (token) iraungi baino denboraren erdia igarotzen denean:
Oro har, ez du axola zuzentarauak Apache (ziurrenik Nginx) konfigurazioan idazten diren zer ordenatan idazten diren, azkenean dena erabiltzailearen eskaeraren ordenaren arabera ordenatuko baita, prozesatzeko eskemarekin bat datorrena. Lua gidoiak.
Osatzea:
Inplementatu ondoren ikusgai dagoen egoera (helburua):
zerbitzuen eta azpiegituren kudeaketa IOSeko telefono mugikor batetik eskuragarri dago programa gehigarririk (VPN), bateratua eta segurua.
Helburua lortu da, web socket-ek funtzionatzen dute eta segurtasun maila dute ziurtagiri bat baino gutxiago.