Чӣ тавр мо дар ZeroTech Apple Safari ва сертификатҳои муштариро бо вебсокетҳо пайваст кардем

Мақола барои онҳое, ки:

  • медонад, ки Client Cert чист ва мефаҳмад, ки чаро он ба вебсокетҳо дар Safari мобилӣ ниёз дорад;
  • Ман мехоҳам хидматҳои вебро барои доираи маҳдуди одамон ё танҳо ба худам нашр кунам;
  • фикр мекунад, ки ҳама корро аллакай касе анҷом додааст ва мехоҳад ҷаҳонро каме қулайтар ва бехатартар кунад.

Таърихи вебсокетҳо тақрибан 8 сол пеш оғоз ёфт. Пештар, усулҳо дар шакли дархостҳои тӯлонии http (воқеан посухҳо) истифода мешуданд: браузери корбар ба сервер дархост фиристод ва мунтазири он буд, ки ба чизе посух диҳад, пас аз посух дубора пайваст ва интизор мешуд. Аммо пас аз он вебсокетҳо пайдо шуданд.

Чӣ тавр мо дар ZeroTech Apple Safari ва сертификатҳои муштариро бо вебсокетҳо пайваст кардем

Чанд сол пеш, мо татбиқи худро дар PHP пок таҳия кардем, ки дархостҳои https-ро истифода бурда наметавонад, зеро ин қабати истинод аст. Чанде пеш, қариб ҳама серверҳои веб прокси дархостҳоро тавассути https ва дастгирии пайвастшавӣ: навсозӣ омӯхтанд.

Вақте ки ин рӯй дод, вебсокетҳо тақрибан хидмати пешфарз барои барномаҳои SPA шуданд, зеро то чӣ андоза қулай аст, ки мундариҷа ба корбар бо ташаббуси сервер интиқол дода шавад (интиқоли паём аз корбари дигар ё версияи нави тасвир, ҳуҷҷат, презентатсияро зеркашӣ кунед). ки каси дигар хозир тахрир карда истодааст).

Гарчанде ки Сертификати муштарӣ муддати тӯлонӣ вуҷуд дорад, он ҳанӯз ҳам суст дастгирӣ мешавад, зеро ҳангоми кӯшиши гузаштан аз он мушкилоти зиёд ба вуҷуд меорад. Ва (эҳтимолан :slightly_smiling_face: ) аз ин рӯ браузерҳои IOS (ҳама ба истиснои Safari) намехоҳанд, ки онро истифода баранд ва аз мағозаи сертификатҳои маҳаллӣ дархост кунанд. Шаҳодатномаҳо дар муқоиса бо калидҳои login/pass ё ssh ё пӯшидани бандарҳои зарурӣ тавассути девор бартариҳои зиёд доранд. Аммо ин дар бораи он нест.

Дар iOS, тартиби насби сертификат хеле содда аст (на бидуни мушаххас), аммо дар маҷмӯъ он мувофиқи дастурҳо иҷро карда мешавад, ки дар Интернет бисёр чизҳо мавҷуданд ва танҳо барои браузери Safari дастрасанд. Мутаассифона, Сафари намедонад, ки чӣ тавр Client Сert-ро барои веб-сокетҳо истифода барад, аммо дар Интернет дастурҳои зиёде дар бораи чӣ гуна сохтани чунин сертификат мавҷуд аст, аммо дар амал ин дастнорас аст.

Чӣ тавр мо дар ZeroTech Apple Safari ва сертификатҳои муштариро бо вебсокетҳо пайваст кардем

Барои фаҳмидани вебсокетҳо, мо нақшаи зеринро истифода мебарем: мушкилот/гипотеза/ҳалли.

Масъала: ҳангоми прокси-прокси дархостҳо ба захираҳое, ки бо сертификати муштарӣ дар браузери мобилии Safari барои IOS ва дигар барномаҳое, ки дастгирии сертификатро фаъол кардаанд, пуштибонӣ барои розеткаҳои веб вуҷуд надорад.

Гипотезаҳо:

  1. Чунин истисноро барои истифодаи сертификатҳо (донист, ки ҳеҷ кас вуҷуд нахоҳад дошт) ба вебсокетҳои захираҳои проксии дохилӣ/берунӣ танзим кардан мумкин аст.
  2. Барои вебсокетҳо, шумо метавонед бо истифода аз сеансҳои муваққатӣ, ки дар давоми дархости муқаррарии (ғайри websocket) браузер тавлид мешаванд, пайвасти беназир, бехатар ва муҳофизатшаванда созед.
  3. Сеансҳои муваққатиро бо истифода аз як веб-сервери прокси (танҳо модулҳо ва функсияҳои дарунсохт) амалӣ кардан мумкин аст.
  4. Токенҳои сессияи муваққатӣ аллакай ҳамчун модулҳои омодаи Apache амалӣ карда шудаанд.
  5. Токенҳои сессияи муваққатиро тавассути тарҳрезии мантиқии сохтори мутақобила амалӣ кардан мумкин аст.

Ҳолати намоён пас аз татбиқ.

Мақсади кор: идоракунии хадамот ва инфрасохтор бояд аз телефони мобилӣ дар IOS бе барномаҳои иловагӣ (ба монанди VPN), ягона ва бехатар дастрас бошад.

Мақсади иловагӣ: сарфаи вақт ва захираҳо/трафики телефонӣ (баъзе хадамот бе розеткаҳои интернетӣ дархостҳои нолозим эҷод мекунанд) бо интиқоли зудтари мундариҷа дар Интернети мобилӣ.

Чӣ тавр тафтиш кардан?

1. Кушодани саҳифаҳо:

— например, 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. Ё дар консоли таҳиякунанда:

Чӣ тавр мо дар ZeroTech Apple Safari ва сертификатҳои муштариро бо вебсокетҳо пайваст кардем

Санҷиши гипотеза:

1. Чунин истисноро барои истифодаи сертификатҳо (донист, ки ҳеҷ чиз вуҷуд надорад) ба веб-сокетҳои захираҳои проксии дохилӣ/берунӣ танзим кардан мумкин аст.

2 ҳалли ин ҷо пайдо шуд:

а) дар сатҳ

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

тағир додани сатҳи дастрасӣ.

Ин усул дорои нозукиҳои зерин аст:

  • Тафтиши сертификат пас аз дархост ба манбаи прокси, яъне дастфишори баъди дархост сурат мегирад. Ин маънои онро дорад, ки прокси аввал бор мекунад ва сипас дархостро ба хидмати муҳофизатшаванда қатъ мекунад. Ин бад аст, аммо муҳим нест;
  • Дар протоколи http2. Он ҳоло ҳам дар лоиҳа аст ва истеҳсолкунандагони браузер намедонанд, ки чӣ тавр онро татбиқ кунанд #info дар бораи tls1.3 http2 баъди дастфишорӣ (ҳоло кор намекунад) Татбиқи RFC 8740 "Истифодаи TLS 1.3 бо HTTP/2";
  • Маълум нест, ки ин коркардро чӣ гуна муттаҳид кардан мумкин аст.

б) Дар сатҳи асосӣ, ssl-ро бе шаҳодатнома иҷозат диҳед.

SSLVerifyClient => SSLVerifyClient ихтиёриро талаб мекунад, аммо ин сатҳи амнияти сервери проксиро коҳиш медиҳад, зеро чунин пайвастшавӣ бе сертификат коркард мешавад. Аммо, шумо метавонед минбаъд бо дастури зерин дастрасӣ ба хидматҳои проксиро рад кунед:

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"

Маълумоти муфассалро дар мақолаи ssl пайдо кардан мумкин аст: Аутентификатсияи сертификати муштарии сервери Apache

Ҳарду вариант санҷида шуданд, варианти "b" барои гуногунҷабҳа ва мутобиқат бо протоколи http2 интихоб карда шуд.

Барои ба итмом расонидани санҷиши ин гипотеза таҷрибаҳои зиёдеро бо конфигуратсия талаб карданд; тарҳҳои зерин санҷида шуданд:

агар = талаб кунед = аз нав нависед

Дар натиҷа тарҳи асосии зерин аст:

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>

Бо дарназардошти иҷозати мавҷуда аз ҷониби соҳиби сертификат, аммо бо шаҳодатномаи гумшуда, ман маҷбур будам соҳиби шаҳодатномаи мавҷудбуда дар шакли яке аз тағирёбандаҳои дастрас SSl_PROTOCOL (ба ҷои SSL_CLIENT_S_DN_CN), тафсилоти бештар дар ҳуҷҷатҳо:

Модули Apache mod_ssl

Чӣ тавр мо дар ZeroTech Apple Safari ва сертификатҳои муштариро бо вебсокетҳо пайваст кардем

2. Барои websockets, шумо метавонед бо истифода аз сеансҳои муваққатӣ, ки дар давоми дархости муқаррарии (ғайри websocket) браузер тавлид мешаванд, пайвасти беназир, бехатар ва муҳофизатшуда созед.

Дар асоси таҷрибаи қаблӣ, шумо бояд ба конфигуратсия як бахши иловагӣ илова кунед, то токенҳои муваққатӣ барои пайвастҳои интернетӣ ҳангоми дархости муқаррарӣ (васлаки ғайри веб) омода карда шаванд.

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

Санҷиш нишон дод, ки он кор мекунад. Ба воситаи браузери корбар кукиҳоро ба худ интиқол додан мумкин аст.

3. Сеансҳои муваққатиро бо истифода аз як веб-сервери прокси (танҳо модулҳо ва функсияҳои дарунсохт) амалӣ кардан мумкин аст.

Тавре ки мо қаблан фаҳмидем, Apache дорои бисёр функсияҳои асосӣ мебошад, ки ба шумо имкон медиҳад конструксияҳои шартӣ эҷод кунед. Бо вуҷуди ин, ба мо воситаҳо лозим аст, ки иттилооти худро ҳангоми дар браузери корбар буданаш муҳофизат кунем, аз ин рӯ мо муайян мекунем, ки чиро нигоҳ дорем ва чаро ва кадом функсияҳои дарунсохтро истифода хоҳем бурд:

  • Ба мо аломате лозим аст, ки онро ба осонӣ рамзкушоӣ кардан мумкин нест.
  • Ба мо аломате лозим аст, ки дар он кӯҳна ва қобилияти тафтиш кардани кӯҳна дар сервер мавҷуд аст.
  • Ба мо нишонае лозим аст, ки бо соҳиби сертификат алоқаманд бошад.

Ин функсияи ҳашинг, намак ва санаи пиршавии нишонаро талаб мекунад. Дар асоси ҳуҷҷатҳо Ифодаҳо дар Apache HTTP Server мо ҳама чизро аз қуттии sha1 ва %{TIME} дорем.

Натиҷа ин тарҳ буд:

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

Ҳадаф ба даст омад, аммо мушкилот бо фарсудашавии сервер вуҷуд доранд (шумо метавонед кукии соларо истифода баред), ин маънои онро дорад, ки нишонаҳо, гарчанде ки барои истифодаи дохилӣ бехатаранд, барои истифодаи саноатӣ (оммавӣ) хатарноканд.

Чӣ тавр мо дар ZeroTech Apple Safari ва сертификатҳои муштариро бо вебсокетҳо пайваст кардем

4. Токенҳои сессияи муваққатӣ аллакай ҳамчун модулҳои омодаи Apache амалӣ карда шудаанд.

Як мушкили муҳим аз итератсияи қаблӣ боқӣ монд - қобилияти назорат кардани пиршавии нишонаҳо.

Мо як модули тайёреро меҷӯем, ки мувофиқи калимаҳо ин корро мекунад: apache token json two factor auth

Бале, модулҳои тайёр мавҷуданд, аммо онҳо ҳама ба амалҳои мушаххас алоқаманданд ва артефактҳо дар шакли оғози сессия ва кукиҳои иловагӣ доранд. Яъне барои муддате не.
Барои чустучуи мо панч соат вакт сарф шуд, ки ин натичаи конкретй надод.

5. Токенҳои сессияи муваққатиро тавассути тарҳрезии мантиқии сохтори мутақобила амалӣ кардан мумкин аст.

Модулҳои тайёр хеле мураккабанд, зеро ба мо танҳо якчанд функсия лозим аст.

Гуфта мешавад, мушкили сана дар он аст, ки функсияҳои дарунсохтаи Apache имкон намедиҳад, ки санаи оянда тавлид шавад ва ҳангоми тафтиши кӯҳнашавӣ дар функсияҳои дарунсохт илова/тарҳи математикӣ вуҷуд надорад.

Яъне шумо наметавонед нависед:

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

Шумо метавонед танҳо ду рақамро муқоиса кунед.

Ҳангоми ҷустуҷӯи ҳалли мушкилоти Сафари ман як мақолаи ҷолибро пайдо кардам: Амнияти HomeAssistant бо сертификатҳои муштарӣ (бо Safari/iOS кор мекунад)
Он як мисоли кодро дар Lua барои Nginx тавсиф мекунад ва он тавре ки маълум шуд, мантиқи он қисми конфигуратсияро, ки мо аллакай амалӣ кардаем, хеле такрор мекунад, ба истиснои истифодаи усули намаки hmac барои хэш ( ин дар Apache ёфт нашуд).

Маълум шуд, ки Луа забони дорои мантиқи равшан аст ва барои Апачи як кори оддӣ кардан мумкин аст:

Пас аз омӯхтани фарқият бо Nginx ва Apache:

Ва вазифаҳои дастрас аз истеҳсолкунандаи забони Lua:
22.1 — Сана ва соат

Мо роҳи муқаррар кардани тағирёбандаҳои env-ро дар файли хурди Lua ёфтем, то санаи ояндаро бо санаи ҳозир муқоиса кунем.

Ин аст скрипти оддии Lua чунин менамояд:

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

Ва ин аст, ки ҳама чиз дар маҷмӯъ бо оптимизатсияи шумораи кукиҳо ва иваз кардани токен вақте кор мекунад, вақте ки нисфи вақт пеш аз ба охир расидани мӯҳлати кукии кӯҳна (токен) фаро мерасад:

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 

Зеро LuaHookAccessChecker танҳо пас аз санҷиши дастрасӣ дар асоси ин маълумот аз Nginx фаъол карда мешавад.

Чӣ тавр мо дар ZeroTech Apple Safari ва сертификатҳои муштариро бо вебсокетҳо пайваст кардем

Истинод ба манбаъ Садо.

Як чизи дигар.

Умуман, муҳим нест, ки дастурҳо дар конфигуратсияи Apache (шояд инчунин Nginx) бо кадом тартиб навишта шаванд, зеро дар ниҳоят ҳама чиз дар асоси тартиби дархости корбар, ки ба схемаи коркард мувофиқ аст, мураттаб карда мешавад. скриптҳои Lua.

Анҷом:

Ҳолати намоён пас аз татбиқ (ҳадаф):
идоракунии хадамот ва инфрасохтор аз телефони мобилӣ дар IOS бе барномаҳои иловагӣ (VPN), ягона ва бехатар дастрас аст.

Ҳадаф ба даст омад, розеткаҳои веб кор мекунанд ва сатҳи амният на камтар аз сертификат доранд.

Чӣ тавр мо дар ZeroTech Apple Safari ва сертификатҳои муштариро бо вебсокетҳо пайваст кардем

Манбаъ: will.com

Илова Эзоҳ