Bawo ni a ṣe ni ZeroTech ti sopọ Apple Safari ati awọn iwe-ẹri alabara pẹlu awọn oju opo wẹẹbu

Nkan naa yoo wulo fun awọn ti o:

  • mọ kini Cert Client jẹ ati loye idi ti o nilo awọn oju opo wẹẹbu lori Safari alagbeka;
  • Emi yoo fẹ lati ṣe atẹjade awọn iṣẹ wẹẹbu si agbegbe ti o lopin ti awọn eniyan tabi fun ara mi nikan;
  • ro pe ohun gbogbo ti ṣe tẹlẹ nipasẹ ẹnikan, ati pe yoo fẹ lati jẹ ki agbaye rọrun diẹ sii ati ailewu.

Awọn itan ti websockets bẹrẹ nipa 8 ọdun sẹyin. Ni iṣaaju, awọn ọna ti a lo ni irisi awọn ibeere http gigun (awọn idahun ni otitọ): aṣawakiri olumulo naa firanṣẹ ibeere kan si olupin naa o duro de lati dahun ohunkan, lẹhin idahun o tun sopọ lẹẹkansi ati duro. Ṣugbọn lẹhinna awọn oju opo wẹẹbu han.

Bawo ni a ṣe ni ZeroTech ti sopọ Apple Safari ati awọn iwe-ẹri alabara pẹlu awọn oju opo wẹẹbu

Ni ọdun diẹ sẹhin, a ṣe agbekalẹ imuse tiwa ni PHP mimọ, eyiti ko le lo awọn ibeere https, nitori eyi ni Layer ọna asopọ. Laipẹ sẹhin, o fẹrẹ jẹ pe gbogbo awọn olupin wẹẹbu kọ ẹkọ si awọn ibeere aṣoju lori https ati asopọ atilẹyin: iṣagbega.

Nigbati eyi ba ṣẹlẹ, awọn websockets di fere iṣẹ aiyipada fun awọn ohun elo SPA, nitori bi o ṣe rọrun lati pese akoonu si olumulo ni ipilẹṣẹ ti olupin (gbejade ifiranṣẹ lati ọdọ olumulo miiran tabi ṣe igbasilẹ ẹya tuntun ti aworan kan, iwe aṣẹ, igbejade pe ẹlomiran n ṣatunkọ lọwọlọwọ) .

Botilẹjẹpe Iwe-ẹri Onibara ti wa ni ayika fun igba diẹ, o tun wa ni atilẹyin ti ko dara, nitori o ṣẹda awọn iṣoro pupọ nigbati o n gbiyanju lati fori rẹ. Ati (o ṣee ṣe :slightly_smiling_face: ) iyẹn ni idi ti awọn aṣawakiri IOS (gbogbo ayafi Safari) ko fẹ lati lo ati beere lati ile itaja ijẹrisi agbegbe. Awọn iwe-ẹri ni ọpọlọpọ awọn anfani ni akawe si iwọle / kọja tabi awọn bọtini ssh tabi pipade awọn ebute oko oju omi pataki nipasẹ ogiriina kan. Ṣugbọn iyẹn kii ṣe ohun ti eyi jẹ nipa.

Lori iOS, ilana fun fifi ijẹrisi jẹ ohun rọrun (kii ṣe laisi awọn pato), ṣugbọn ni gbogbogbo o ṣee ṣe ni ibamu si awọn ilana, eyiti eyiti o wa pupọ lori Intanẹẹti ati eyiti o wa fun aṣawakiri Safari nikan. Laanu, Safari ko mọ bi o ṣe le lo Client Cert fun awọn sockets wẹẹbu, ṣugbọn awọn itọnisọna pupọ wa lori Intanẹẹti lori bii o ṣe le ṣẹda iru ijẹrisi, ṣugbọn ni iṣe eyi ko ṣee ṣe.

Bawo ni a ṣe ni ZeroTech ti sopọ Apple Safari ati awọn iwe-ẹri alabara pẹlu awọn oju opo wẹẹbu

Lati loye awọn oju opo wẹẹbu, a lo ero atẹle yii: isoro / ilewq / ojutu.

Isoro: ko si atilẹyin fun awọn iho wẹẹbu nigbati awọn ibeere aṣoju si awọn orisun ti o ni aabo nipasẹ ijẹrisi alabara lori ẹrọ aṣawakiri alagbeka Safari fun IOS ati awọn ohun elo miiran ti o ti mu atilẹyin ijẹrisi ṣiṣẹ.

Awọn arosọ:

  1. O ṣee ṣe lati tunto iru imukuro lati lo awọn iwe-ẹri (mọ pe kii yoo si) si awọn oju opo wẹẹbu ti awọn orisun isunmọ inu / ita.
  2. Fun awọn oju opo wẹẹbu, o le ṣe alailẹgbẹ, aabo ati asopọ aabo ni lilo awọn akoko igba diẹ ti o ṣe ipilẹṣẹ lakoko ibeere aṣawakiri deede (ti kii ṣe oju opo wẹẹbu).
  3. Awọn akoko igba diẹ le ṣe imuse nipa lilo olupin wẹẹbu aṣoju kan (awọn modulu ti a ṣe sinu ati awọn iṣẹ nikan).
  4. Awọn ami igba igba diẹ ti ni imuse tẹlẹ bi awọn modulu Apache ti a ti ṣetan.
  5. Awọn ami igba akoko igba diẹ le ṣe imuse nipasẹ ṣiṣe apẹrẹ ọgbọn ti eto ibaraenisepo.

Ipo ti o han lẹhin imuse.

Idi ti iṣẹ naa: iṣakoso awọn iṣẹ ati awọn amayederun yẹ ki o wa lati foonu alagbeka lori IOS laisi awọn eto afikun (bii VPN), iṣọkan ati aabo.

Afikun ibi-afẹde: fifipamọ akoko ati awọn orisun / ijabọ foonu (diẹ ninu awọn iṣẹ laisi awọn iho wẹẹbu n ṣe awọn ibeere ti ko wulo) pẹlu ifijiṣẹ akoonu yiyara lori Intanẹẹti alagbeka.

Bawo ni lati ṣayẹwo?

1. Awọn oju-iwe ṣiṣi:

— например, 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. Tabi ni awọn Olùgbéejáde console:

Bawo ni a ṣe ni ZeroTech ti sopọ Apple Safari ati awọn iwe-ẹri alabara pẹlu awọn oju opo wẹẹbu

Idanwo arosọ:

1. O ṣee ṣe lati tunto iru imukuro lati lo awọn iwe-ẹri (mọ pe kii yoo si) si awọn iho wẹẹbu ti awọn orisun proxied ti inu / ita.

Awọn ojutu 2 ni a rii nibi:

a) Ni ipele

<Location sock*> SSLVerifyClient optional </Location>
<Location /> SSLVerifyClient require </Location>

ayipada wiwọle ipele.

Ọna yii ni awọn nuances wọnyi:

  • Ijẹrisi ijẹrisi waye lẹhin ibeere kan si orisun isunmọ, iyẹn ni, fifun ọwọ ibeere ifiweranṣẹ. Eyi tumọ si pe aṣoju yoo kọkọ kojọpọ lẹhinna ge ibeere naa kuro si iṣẹ to ni aabo. Eyi jẹ buburu, ṣugbọn kii ṣe pataki;
  • Ninu ilana http2. O tun wa ni apẹrẹ, ati pe awọn aṣelọpọ ẹrọ aṣawakiri ko mọ bi a ṣe le ṣe imuse rẹ #info nipa tls1.3 http2 fifi ọwọ ọwọ (ko ṣiṣẹ ni bayi) Ṣiṣe RFC 8740 "Lilo TLS 1.3 pẹlu HTTP/2";
  • Ko ṣe kedere bi o ṣe le ṣọkan sisẹ yii.

b) Ni ipele ipilẹ, gba ssl laisi iwe-ẹri.

SSLVerifyClient nilo => SSLVerifyClient iyan, ṣugbọn eyi dinku ipele aabo ti olupin aṣoju, niwọn igba ti iru asopọ bẹ yoo jẹ ilọsiwaju laisi ijẹrisi kan. Sibẹsibẹ, o le kọ siwaju si iraye si awọn iṣẹ aṣoju pẹlu itọsọna atẹle:

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"

Alaye alaye diẹ sii ni a le rii ninu nkan nipa ssl: Ijeri ijẹrisi Onibara Olupin Apache

Awọn aṣayan mejeeji ni idanwo, aṣayan “b” ni a yan fun ilopọ ati ibamu pẹlu ilana http2.

Lati pari iṣeduro iṣeduro yii, o gba ọpọlọpọ awọn idanwo pẹlu iṣeto ni; awọn apẹrẹ wọnyi ni idanwo:

ti o ba ti = beere = atunko

Abajade jẹ apẹrẹ ipilẹ atẹle:

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>

Ni akiyesi aṣẹ ti o wa tẹlẹ nipasẹ oniwun ijẹrisi, ṣugbọn pẹlu ijẹrisi ti o padanu, Mo ni lati ṣafikun oniwun ijẹrisi ti ko si ni irisi ọkan ninu awọn oniyipada SSl_PROTOCOL (dipo SSL_CLIENT_S_DN_CN), awọn alaye diẹ sii ninu iwe naa:

Module Apache mod_ssl

Bawo ni a ṣe ni ZeroTech ti sopọ Apple Safari ati awọn iwe-ẹri alabara pẹlu awọn oju opo wẹẹbu

2. Fun websockets, o le ṣe kan oto, aabo ati idaabobo asopọ lilo igba die ti o ti wa ni ti ipilẹṣẹ nigba kan deede (ti kii-websocket) kiri ìbéèrè.

Da lori iriri iṣaaju, o nilo lati ṣafikun apakan afikun si iṣeto ni lati mura awọn ami igba diẹ fun awọn asopọ iho oju opo wẹẹbu lakoko ibeere deede (ibọsẹ ti kii ṣe oju opo wẹẹbu).

#подготовка передача себе С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>

Idanwo fihan pe o ṣiṣẹ. O ṣee ṣe lati gbe awọn kuki lọ si ara rẹ nipasẹ ẹrọ aṣawakiri olumulo.

3. Awọn akoko igba diẹ le ṣe imuse nipa lilo olupin wẹẹbu aṣoju kan (awọn modulu ati awọn iṣẹ ti a ṣe sinu nikan).

Gẹgẹbi a ti rii tẹlẹ, Apache ni ọpọlọpọ iṣẹ ṣiṣe pataki ti o fun ọ laaye lati ṣẹda awọn igbelewọn ipo. Sibẹsibẹ, a nilo awọn ọna lati daabobo alaye wa lakoko ti o wa ninu ẹrọ aṣawakiri olumulo, nitorinaa a ṣe agbekalẹ kini lati fipamọ ati idi, ati kini awọn iṣẹ itumọ ti a yoo lo:

  • A nilo aami ti ko le ṣe iyipada ni rọọrun.
  • A nilo ami-ami ti o ni arugbo ti a ṣe sinu rẹ ati agbara lati ṣayẹwo isọdọtun lori olupin naa.
  • A nilo aami kan ti yoo ni nkan ṣe pẹlu oniwun ijẹrisi naa.

Eyi nilo iṣẹ hashing, iyọ kan, ati ọjọ kan lati di ọjọ ori ami ami naa. Da lori awọn iwe aṣẹ Awọn ikosile ni Apache HTTP Server a ni gbogbo rẹ kuro ninu apoti sha1 ati %{TIME}.

Abajade jẹ apẹrẹ yii:

#нет сертификата, и обращение к 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>

A ti ṣaṣeyọri ibi-afẹde naa, ṣugbọn awọn iṣoro wa pẹlu aiṣedeede olupin (o le lo kuki ọdun kan), eyiti o tumọ si pe awọn ami, botilẹjẹpe ailewu fun lilo inu, jẹ ailewu fun lilo ile-iṣẹ (ibi-pupọ).

Bawo ni a ṣe ni ZeroTech ti sopọ Apple Safari ati awọn iwe-ẹri alabara pẹlu awọn oju opo wẹẹbu

4. Awọn ami igba igba diẹ ti ni imuse tẹlẹ bi awọn modulu Apache ti a ti ṣetan.

Iṣoro pataki kan wa lati aṣetunṣe iṣaaju - ailagbara lati ṣakoso ti ogbo àmi.

A n wa module ti o ṣetan ti o ṣe eyi, ni ibamu si awọn ọrọ: apache token json two factor auth

Bẹẹni, awọn modulu ti a ti ṣetan, ṣugbọn gbogbo wọn ni a so si awọn iṣe kan pato ati pe wọn ni awọn ohun-ọṣọ ni irisi ibẹrẹ igba ati awọn kuki afikun. Iyẹn ni, kii ṣe fun igba diẹ.
Ó gba wákàtí márùn-ún láti wá a, èyí tí kò fún wa ní àbájáde ojúlówó.

5. Awọn ami igba akoko igba diẹ le ṣe imuse nipasẹ apẹrẹ ti o ni imọran ti eto awọn ibaraẹnisọrọ.

Awọn modulu ti a ti ṣetan jẹ eka pupọ, nitori a nilo awọn iṣẹ meji nikan.

Ti a sọ pe, iṣoro pẹlu ọjọ naa ni pe awọn iṣẹ ti a ṣe sinu Apache ko gba laaye lati ṣẹda ọjọ kan lati ọjọ iwaju, ati pe ko si afikun / iyokuro mathematiki ninu awọn iṣẹ ti a ṣe sinu nigbati o ṣayẹwo fun isọdọtun.

Iyẹn ni, o ko le kọ:

(%{env:zt-cert-date} + 30) > %{DATE}

O le ṣe afiwe awọn nọmba meji nikan.

Lakoko ti o n wa ibi iṣẹ fun iṣoro Safari, Mo rii nkan ti o nifẹ si: Ṣe aabo Oluranlọwọ Ile pẹlu awọn iwe-ẹri alabara (ṣiṣẹ pẹlu Safari/iOS)
O ṣapejuwe apẹẹrẹ koodu kan ni Lua fun Nginx, ati eyiti, bi o ti tan-an, tun ṣe atunṣe ọgbọn ti apakan yẹn ti iṣeto ti a ti ṣe imuse tẹlẹ, laisi lilo ọna iyọ hmac fun hashing ( eyi ko ri ni Apache).

Ó wá ṣe kedere pé Lua jẹ́ èdè kan tí ó ní ọgbọ́n inú ṣíṣe kedere, ó sì ṣeé ṣe láti ṣe ohun kan tí ó rọrùn fún Apache:

Lehin ti o kẹkọọ iyatọ pẹlu Nginx ati Apache:

Ati awọn iṣẹ to wa lati ọdọ olupese ede Lua:
22.1 - Ọjọ ati Aago

A wa ọna lati ṣeto awọn oniyipada env sinu faili Lua kekere kan lati le ṣeto ọjọ kan lati ọjọ iwaju lati ṣe afiwe pẹlu eyiti lọwọlọwọ.

Eyi ni ohun ti iwe afọwọkọ Lua ti o rọrun kan dabi:

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

Ati pe eyi ni bii gbogbo rẹ ṣe n ṣiṣẹ ni apapọ, pẹlu iṣapeye ti nọmba awọn kuki ati rirọpo ami ami nigbati idaji akoko ba de ṣaaju Kuki atijọ (aami) dopin:

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 

Nitori LuaHookAccessChecker yoo ṣiṣẹ nikan lẹhin awọn sọwedowo wiwọle ti o da lori alaye yii lati ọdọ Nginx.

Bawo ni a ṣe ni ZeroTech ti sopọ Apple Safari ati awọn iwe-ẹri alabara pẹlu awọn oju opo wẹẹbu

Ọna asopọ si orisun Awọn aworan.

Ohun kan diẹ sii.

Ni gbogbogbo, ko ṣe pataki ni aṣẹ wo ni a ti kọ awọn itọsọna naa sinu iṣeto Apache (boya tun Nginx), nitori ni ipari ohun gbogbo yoo jẹ lẹsẹsẹ da lori aṣẹ ti ibeere lati ọdọ olumulo, eyiti o baamu si ero fun sisẹ. Awọn iwe afọwọkọ Lua.

Ipari:

Ipo ti o han lẹhin imuse (afojusun):
iṣakoso awọn iṣẹ ati awọn amayederun wa lati foonu alagbeka lori IOS laisi awọn eto afikun (VPN), iṣọkan ati aabo.

Ibi-afẹde naa ti ṣaṣeyọri, awọn iho oju opo wẹẹbu ṣiṣẹ ati ni ipele aabo ti ko kere ju ijẹrisi lọ.

Bawo ni a ṣe ni ZeroTech ti sopọ Apple Safari ati awọn iwe-ẹri alabara pẹlu awọn oju opo wẹẹbu

orisun: www.habr.com

Fi ọrọìwòye kun