ProHoster > blog > Utawala > Jinsi sisi katika ZeroTech tuliunganisha Apple Safari na vyeti vya mteja na soketi za wavuti
Jinsi sisi katika ZeroTech tuliunganisha Apple Safari na vyeti vya mteja na soketi za wavuti
Nakala hiyo itakuwa muhimu kwa wale ambao:
anajua Cert ya Mteja ni nini na inaelewa kwa nini inahitaji soketi za wavuti kwenye Safari ya rununu;
Ningependa kuchapisha huduma za wavuti kwa mduara mdogo wa watu au kwangu tu;
anadhani kwamba kila kitu tayari kimefanywa na mtu, na angependa kufanya ulimwengu kuwa rahisi zaidi na salama zaidi.
Historia ya soketi za wavuti ilianza kama miaka 8 iliyopita. Hapo awali, mbinu zilitumiwa kwa namna ya maombi ya muda mrefu ya http (kwa kweli majibu): kivinjari cha mtumiaji kilituma ombi kwa seva na kusubiri kujibu kitu, baada ya majibu iliunganisha tena na kusubiri. Lakini basi soketi za wavuti zilionekana.
Miaka michache iliyopita, tulitengeneza utekelezaji wetu wenyewe katika PHP safi, ambayo haiwezi kutumia maombi ya https, kwani hii ndiyo safu ya kiungo. Si muda mrefu uliopita, karibu seva zote za wavuti zilijifunza kutuma maombi ya seva mbadala kupitia https na muunganisho wa usaidizi:boresha.
Wakati hii ilifanyika, soketi za wavuti zikawa karibu huduma chaguo-msingi kwa programu za SPA, kwa sababu jinsi inavyofaa kutoa yaliyomo kwa mtumiaji kwa mpango wa seva (kusambaza ujumbe kutoka kwa mtumiaji mwingine au kupakua toleo jipya la picha, hati, uwasilishaji. ambayo mtu mwingine anaihariri kwa sasa) .
Ingawa Cheti cha Mteja kimekuwepo kwa muda mrefu, bado kinasalia kuwa na msaada duni, kwani huleta shida nyingi wakati wa kujaribu kukipita. Na (inawezekana :slightly_smiling_face: ) ndiyo sababu vivinjari vya IOS (zote isipokuwa Safari) hazitaki kuitumia na kuiomba kutoka kwa duka la cheti la karibu. Vyeti vina manufaa mengi ikilinganishwa na funguo za kuingia/kupita au ssh au kufunga milango muhimu kupitia ngome. Lakini hii sivyo inahusu.
Kwenye iOS, utaratibu wa kufunga cheti ni rahisi sana (sio bila maalum), lakini kwa ujumla hufanywa kulingana na maagizo, ambayo kuna mengi kwenye mtandao na ambayo yanapatikana tu kwa kivinjari cha Safari. Kwa bahati mbaya, Safari hajui jinsi ya kutumia Mteja Π‘ert kwa soketi za wavuti, lakini kuna maagizo mengi kwenye mtandao juu ya jinsi ya kuunda cheti kama hicho, lakini kwa mazoezi hii haipatikani.
Ili kuelewa soketi za wavuti, tulitumia mpango ufuatao: tatizo/dhahania/suluhisho.
Tatizo: hakuna msaada kwa soketi za wavuti wakati wa kutuma maombi ya seva mbadala kwa rasilimali ambazo zinalindwa na cheti cha mteja kwenye kivinjari cha simu cha Safari cha IOS na programu zingine ambazo zimewezesha usaidizi wa cheti.
Nadharia:
Inawezekana kusanidi ubaguzi kama huu ili kutumia vyeti (kwa kujua kuwa hakutakuwa na chochote) kwa soketi za wavuti za rasilimali za proksi za ndani/nje.
Kwa soketi za wavuti, unaweza kufanya muunganisho wa kipekee, salama na unaoweza kutetewa kwa kutumia vipindi vya muda ambavyo vinatolewa wakati wa ombi la kawaida la kivinjari (isiyo ya tundu la wavuti).
Vipindi vya muda vinaweza kutekelezwa kwa kutumia seva moja ya seva mbadala (moduli na vitendakazi vilivyojengwa ndani pekee).
Tokeni za kikao cha muda tayari zimetekelezwa kama moduli za Apache zilizotengenezwa tayari.
Ishara za kikao cha muda zinaweza kutekelezwa kwa kubuni kimantiki muundo wa mwingiliano.
Hali inayoonekana baada ya utekelezaji.
Lengo la kazi: usimamizi wa huduma na miundombinu inapaswa kupatikana kutoka kwa simu ya mkononi kwenye IOS bila programu za ziada (kama vile VPN), zilizounganishwa na salama.
Lengo la ziada: kuokoa muda na rasilimali/trafiki ya simu (baadhi ya huduma bila soketi za wavuti hutoa maombi yasiyo ya lazima) kwa uwasilishaji wa haraka wa yaliyomo kwenye Mtandao wa simu.
1. Inawezekana kusanidi ubaguzi kama huo ili kutumia vyeti (kwa kujua kuwa hakutakuwepo) kwenye soketi za wavuti za rasilimali za ndani/nje zilizowekwa seva mbadala.
Uthibitishaji wa cheti hutokea baada ya ombi kwa rasilimali iliyotumwa, yaani, kupeana mkono kwa ombi la chapisho. Hii inamaanisha kuwa proksi itapakia kwanza na kisha kukata ombi kwa huduma iliyolindwa. Hii ni mbaya, lakini sio muhimu;
Katika itifaki ya http2. Bado iko kwenye rasimu, na watengenezaji wa vivinjari hawajui jinsi ya kuitekeleza #maelezo kuhusu tls1.3 http2 postshake handshake (haifanyi kazi sasa) Tekeleza RFC 8740 "Kwa kutumia TLS 1.3 na HTTP/2";
Haijulikani wazi jinsi ya kuunganisha uchakataji huu.
b) Katika kiwango cha msingi, ruhusu ssl bila cheti.
SSLVerifyClient need => SSLVerifyClient ni hiari, lakini hii inapunguza kiwango cha usalama cha seva mbadala, kwani muunganisho kama huo utachakatwa bila cheti. Hata hivyo, unaweza kukataa zaidi ufikiaji wa huduma za wakala kwa maelekezo yafuatayo:
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>
Kwa kuzingatia uidhinishaji uliopo wa mwenye cheti, lakini cheti ambacho hakipo, ilinibidi kuongeza mmiliki wa cheti ambaye hayupo katika mfumo wa mojawapo ya vibadala vinavyopatikana SSl_PROTOCOL (badala ya SSL_CLIENT_S_DN_CN), maelezo zaidi katika hati:
2. Kwa soketi za wavuti, unaweza kufanya muunganisho wa kipekee, salama na unaolindwa kwa kutumia vipindi vya muda ambavyo vinatolewa wakati wa ombi la kawaida la kivinjari (lisilo la mtandao).
Kulingana na uzoefu uliopita, unahitaji kuongeza sehemu ya ziada kwenye usanidi ili kuandaa tokeni za muda za miunganisho ya soketi za wavuti wakati wa ombi la kawaida (isiyo ya mtandao).
Upimaji ulionyesha kuwa inafanya kazi. Inawezekana kuhamisha Vidakuzi kwako kupitia kivinjari cha mtumiaji.
3. Vipindi vya muda vinaweza kutekelezwa kwa kutumia seva moja ya wakala ya wavuti (moduli na vitendaji vilivyojengwa pekee).
Kama tulivyogundua hapo awali, Apache ina utendakazi mwingi wa msingi ambao hukuruhusu kuunda muundo wa masharti. Hata hivyo, tunahitaji njia za kulinda maelezo yetu yakiwa katika kivinjari cha mtumiaji, ili tubaini tutakachohifadhi na kwa nini, na ni vitendaji gani vilivyojumuishwa tutatumia:
Tunahitaji ishara ambayo haiwezi kutatuliwa kwa urahisi.
Tunahitaji ishara ambayo imepitwa na wakati ndani yake na uwezo wa kuangalia uchakavu kwenye seva.
Tunahitaji tokeni ambayo itahusishwa na mmiliki wa cheti.
Hii inahitaji utendakazi wa hashing, chumvi, na tarehe ya kuzeeka tokeni. Kulingana na nyaraka Maneno katika Seva ya Apache HTTP tunayo yote nje ya boksi sha1 na %{TIME}.
Lengo limefikiwa, lakini kuna matatizo na kutokuwepo kwa seva (unaweza kutumia Cookie ya umri wa miaka), ambayo ina maana kwamba ishara, ingawa ni salama kwa matumizi ya ndani, si salama kwa matumizi ya viwanda (molekuli).
4. Tokeni za kikao cha muda tayari zimetekelezwa kama moduli za Apache zilizotengenezwa tayari.
Tatizo moja kubwa lilibaki kutoka kwa marudio ya awali - kutokuwa na uwezo wa kudhibiti kuzeeka kwa ishara.
Tunatafuta moduli iliyotengenezwa tayari ambayo hufanya hivi, kulingana na maneno: ishara ya apache json two factor auth
Ndiyo, kuna moduli zilizopangwa tayari, lakini zote zimefungwa kwa vitendo maalum na zina mabaki kwa namna ya kuanzisha kikao na Vidakuzi vya ziada. Hiyo ni, sio kwa muda.
Ilituchukua saa tano kutafuta, ambayo haikutoa matokeo halisi.
5. Ishara za kikao cha muda zinaweza kutekelezwa kwa kubuni kimantiki muundo wa mwingiliano.
Moduli zilizotengenezwa tayari ni ngumu sana, kwa sababu tunahitaji vitendaji kadhaa tu.
Hiyo inasemwa, shida na tarehe ni kwamba kazi za kujengwa za Apache haziruhusu kutoa tarehe kutoka siku zijazo, na hakuna kuongeza / kutoa hisabati katika kazi zilizojengwa wakati wa kuangalia uchakavu.
Hiyo ni, huwezi kuandika:
(%{env:zt-cert-date} + 30) > %{DATE}
Unaweza kulinganisha nambari mbili tu.
Wakati nikitafuta suluhisho la shida ya Safari, nilipata nakala ya kupendeza: Kulinda Msaidizi wa Nyumbani na cheti cha mteja (hufanya kazi na Safari/iOS)
Inaelezea mfano wa nambari katika Lua kwa Nginx, na ambayo, kama ilivyotokea, inarudia sana mantiki ya sehemu hiyo ya usanidi ambayo tayari tumetekeleza, isipokuwa matumizi ya njia ya chumvi ya hmac kwa hashing ( hii haikupatikana katika Apache).
Ilibainika kuwa Lua ni lugha yenye mantiki wazi, na inawezekana kufanya jambo rahisi kwa Apache:
Na vipengele vinavyopatikana kutoka kwa mtengenezaji wa lugha ya Lua: 22.1 - Tarehe na Wakati
Tulipata njia ya kuweka vigezo vya env katika faili ndogo ya Lua ili kuweka tarehe kutoka siku zijazo ili kulinganisha na ya sasa.
Hivi ndivyo hati rahisi ya Lua inaonekana kama:
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
Na hivi ndivyo inavyofanya kazi kwa jumla, na uboreshaji wa idadi ya Vidakuzi na uingizwaji wa ishara wakati nusu ya wakati inakuja kabla ya Cookie ya zamani (ishara) kuisha:
Kwa ujumla, haijalishi ni kwa mpangilio gani maagizo yameandikwa katika usanidi wa Apache (labda pia Nginx), kwani mwishowe kila kitu kitapangwa kulingana na agizo la ombi kutoka kwa mtumiaji, ambalo linalingana na mpango wa usindikaji. Maandishi ya Lua.
Kukamilika:
Hali inayoonekana baada ya utekelezaji (lengo):
usimamizi wa huduma na miundombinu inapatikana kutoka kwa simu ya mkononi kwenye IOS bila programu za ziada (VPN), zilizounganishwa na salama.
Lengo limefikiwa, soketi za wavuti hufanya kazi na kuwa na kiwango cha usalama sio chini ya cheti.