Quomodo apud ZeroTech connexum Apple Safari et clientium libellorum cum websockets

Articulus iis qui usui erunt;

  • scit quid Client Cert est et intellegit cur telae in mobili Safari indigeat;
  • Velim operas interretiales evulgare in circulis limitum hominum vel tantum ad me ipsum;
  • putat omnia iam ab aliquo facta esse, et facturum esse mundum paulo commodius et tutius.

Historia telarum inter annos circiter VIII incepit. Antea methodi adhibitae sunt in forma longarum petitionum (actu respondendi): navigatrum utentis rogaverunt servo suo exspectaverunt ut aliquid responderet, post responsionem coniunctam iterum et expectavit. Sed tunc interretis apparuit.

Quomodo apud ZeroTech connexum Apple Safari et clientium libellorum cum websockets

Paucis abhinc annis, exsecutionem nostram in puro PHP elaboravimus, quae petitionibus https uti non potest, cum haec sit nexus iacuit. Non ita pridem, omnes fere servientes interretiales postulationes in https interreti didicerunt et nexum sustentant: upgrade.

Cum hoc factum est, telae telae fere factae sunt servitium pro applicationibus SPA, quod quam commodum sit providere contentum usori incepto servientis (transmittere nuntium ab alio usore vel novam versionem imaginis, documenti, praesentationis emittere quod aliquis nunc edit) .

Quamvis Client certificatorium circa aliquod tempus fuerit, tamen male sustinetur, quod multum difficultates creat, cum eam praeterire conatur. Et (fortasse :smiling_face: ) ideo IOS navigatores (omnes praeter Safari) ea uti nolunt et e copia certificarii loci id petunt. Testimonia multa commoda ad login/transeuntes vel claves ssh comparatas habent vel portas necessarias per firewall claudentes. Sed id ipsum non est.

In iOS, ratio institutionis certificandi est omnino simplex (non sine speciali), sed generaliter fit secundum instructiones, quarum multa in interreti sunt et quae tantum in navigatro Safari praesto sunt. Infeliciter, Safari nescit uti Client ert pro basibus interretialibus, sed multae sunt instructiones in Interreti quomodo tale libellum creare, sed in praxi hoc esse non potest.

Quomodo apud ZeroTech connexum Apple Safari et clientium libellorum cum websockets

Ut schedae intelligantur, hoc consilio usi sumus; problem/hypothesis/solutione.

problema: nullum subsidium est basibus interretialibus cum procurare petitiones ad facultates quae tutantur per libellum clientis de navigatro Safari mobilis pro IOS et aliis applicationibus quae auxilium testimonium pertulerunt.

Hypotheses:

  1. Talem exceptionem configurare possibile est ut testimonialibus utantur (scio quod nullus erit) ad telas opum internorum/externorum proximarum.
  2. Pro interretis, singularem, securam et defensabilem nexum facere potes utentibus sessionibus temporariis, quae per normalem (non-websocket) petitionem navigantium generantur.
  3. Sessiones temporariae perfici possunt utens unus procurator interretialis (in modulis et functionibus constructus).
  4. Sessionis temporalis signa iam ad effectum apache modulorum praeparatorum impleta sunt.
  5. Sessionis temporariae indicia perfici possunt logice designando structuram commercii.

Status visibilis post exsecutionem.

Finis operis: administratio officiorum et infrastructurae accessibilis e telephono mobili in IOS sine programmatibus additis (ut VPN) unita et secura debet esse.

Additional finis: salvis tempus et facultates / telephonicas mercaturae (aliqua officia sine basibus interretialibus petitiones necessarias gignunt) cum velociore traditione contentorum in interreti mobili.

Quam ut reprehendo?

Paginae 1. dedicatio:

— например, 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. Aut in elit console:

Quomodo apud ZeroTech connexum Apple Safari et clientium libellorum cum websockets

Hypothesis probatio;

1. Configurare potest talem exceptionem uti testimonialibus (scio quod nullus erit) ad internam basibus facultatum internae/externae proximse.

2 solutiones hic inventae sunt:

a) In gradu

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

aditum mutare gradu.

Haec methodus sequentes nuances habet:

  • Verificationis certificatio fit post petitionem ad resource proxied, id est, post petitionem handshake. Id est, quod procuratorem primum onere faciet, et postea petitioni conservatae servitutis abscidit. Malum est, sed non criticum;
  • In http2 protocollo. Adhuc in captura est, et artifices navigatores nesciunt efficere id #info de tls1.3 http2 post handshake (non nunc operatur) Implementum RFC 8740 "Usus TLS 1.3 cum HTTP/2";
  • Quomodo hunc processum uniendum non liquet.

b) In gradu fundamentali, sine certificatorio SSl admitte.

SSLVerifyClient require => SSLVerifyClient optional, sed hoc reducit securitatem gradu procuratoris servi, cum talis connexio sine certificatorio processit. Nihilominus negare potes accessum ad officia proxiua cum sequenti directiva:

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"

Plures informationes inveniri possunt in articulo de ssl: Apache Servo Client certificatorium authenticitate

Utraque optiones probata sunt, optio "b" pro sua mobilitate et compatibilitate cum http2 protocollo electa est.

Ad confirmationem huius hypothesis perficiendam, multa experimenta cum configuratione sumpsit, et sequentia consilia probata sunt;

sin = require = RESCRIBO

Ita fit ut haec praecipua intentio:

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>

Inspecta auctoritate possessoris certificamenti existentem, sed cum certificatorio absentis, habui addere libellum possessorem non existentem in forma unius ex variabilium notabilium SSl_PROTOCOL (pro SSL_CLIENT_S_DN_CN), plura in documentis:

Apache amet mod_ssl

Quomodo apud ZeroTech connexum Apple Safari et clientium libellorum cum websockets

2. Pro interretis, unicum, securum ac munitum nexum facere potes sessionibus temporalibus utens, quae per normalem (non-websocket) petitionem navigantium generantur.

Ex praecedente experientia, debes sectionem additam ad configurationem addere ut signa temporalia ad nexus nervum interretialem per iustam petitionem (non-textae nervum) praeparare debeas.

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

Testis ostendit quod operatur. Liceat tibi crustulas transferre per navigatrum usoris.

3. Sessiones temporariae perfici possunt utens unus procurator interretialis (tantum in modulis et muneribus constructus).

Ut antea invenimus, Apache multum habet nuclei functionis quae te permittit construere conditionales creare. Sed modo opus est informationes nostras tueri dum est in navigatro utentis, sic statuimus quid condere et quare, et quid aedificatum in muneribus utemur:

  • Indicium nobis opus est quod facile decoqui non potest.
  • Indicium nobis opus est quod obsolescentiam in illam aedificatam habet et facultatem obsolescentiam in servo reprimendam.
  • Indicium nobis opus est quod dominus certificationis associatus erit.

Hoc munus harundinem, salem, et aetatem aetati inditium requirit. Ex documentis Expressiones in Apache HTTP Servo nos omnes ex arca sha1 et %{TIME} habemus.

Ex quo consilio hoc factum est;

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

Metam consecutus est, sed problemata sunt obsolescentiae cum servo (uti crustulum anniculum uti potes), quod significat signa, etsi ad usum internum tuta, non tuta ad usum industriae (massa) esse.

Quomodo apud ZeroTech connexum Apple Safari et clientium libellorum cum websockets

4. Signa sessionis temporariae iam ad effectum Apache modulorum promptorum facta sunt.

Una quaestio notabilis manebat ex iteratione antecedente - non posse refrenare indicium senescit.

Quaerimus moduli prompti qui hoc facit, secundum verba: apache signum json duo factor auth

Ita moduli parati facti sunt, sed omnes actionibus specificis alligati sunt et artificia habent in modum sessionis et additi Crustulae incipiendi. Id est non ad tempus.
Quinque horas ad nos quaerendum sumpsit, quod certum exitum non dedit.

5. Signa sessionis temporariae perfici possunt logice designando structuram interactionum.

Moduli facti parati nimis implicati sunt, quia duobus functionibus tantum indigemus.

Id quod dixit, quaestio data est quod Apache aedificatur in functionibus diem ex futuro generare non patitur, nec mathematica adiectio/detractio in structo-in functionibus obsolescentiam reprehendo.

Hoc est, scribere non potes;

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

Numeros duos tantum comparare potes.

Dum quaerens quem habemus problema Safari, an interesting articulum inveni: Impetrandum HomeAssistant apud clientem libellorum (opera cum Safari / iOS)
Exemplum codicis Luae pro Nginx describit, quod, ut evenit, logicam illius partis configurationis, quam iam perduximus, valde repetit, excepto usu hmac salsurae methodi ad hashing (a. hoc non est inventum in Apache).

Patuit Luam linguam cum logica perspicua esse et posse aliquid simplex facere pro Apache:

Discrimen studuit cum Nginx et Apache:

Munera praesto sunt ex fabrica linguae Luae:
22.1 - Date et tempus

Viam invenimus variabiles env in parva Luae lima ut tempus a futuro ad comparandum cum praesenti constituamus.

Hoc est quod simplex Luae scriptor similis est:

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

Et hoc est quomodo omnia operatur in summa, cum optimizatione numeri Crustulae et signum substitutionis, cum dimidium temporis venit antequam vetus Cookie (signum) exspirat;

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 

Quia LuaHookAccessChecker solum moveri post accessum compescit, in hac informatione ab Nginx fundatur.

Quomodo apud ZeroTech connexum Apple Safari et clientium libellorum cum websockets

Link to source imagini.

Una res plus.

Fere non refert quo ordine praescriptiones in Apache (probabiliter etiam Nginx) scriptae sint, cum in fine omnia disponantur in ordine petitionis utentis, quae rationi ad expediendas respondet. lUae Scriptor.

Perfectio:

Status visibilis post exsecutionem (metam);
administratio servitiorum et infrastructurae praesto est ex telephonio mobili in IOS sine programs additis (VPN), una et tuta.

Propositum consecutum est, bases interreti laborant et securitatem planam habent non minus quam libellum.

Quomodo apud ZeroTech connexum Apple Safari et clientium libellorum cum websockets

Source: www.habr.com

Add a comment