څنګه موږ په زیرو ټیک کې د ایپل سفاري او پیرودونکي سندونه د ویب ساکټونو سره وصل کړل

مقاله به د هغو کسانو لپاره ګټوره وي څوک چې:

  • پوهیږي چې د پیرودونکي سند څه شی دی او پوهیږي چې ولې دا په ګرځنده سفاري کې ویب ساکټونو ته اړتیا لري؛
  • زه غواړم ویب خدمتونه د خلکو محدود حلقې یا یوازې ځان ته خپاره کړم؛
  • فکر کوي چې هرڅه دمخه د یو چا لخوا ترسره شوي ، او غواړي نړۍ یو څه اسانه او خوندي کړي.

د ویب ساکټونو تاریخ شاوخوا 8 کاله دمخه پیل شو. پخوا، میتودونه لکه اوږد HTTP غوښتنې (په حقیقت کې ځوابونه) ​​کارول شوي: د کارونکي براوزر سرور ته غوښتنه لیږلې او انتظار یې کاوه چې یو څه ځواب ورکړي، د ځواب وروسته دا بیا وصل شو او انتظار یې وکړ. مګر بیا ویب ساکټونه ښکاره شول.

څنګه موږ په زیرو ټیک کې د ایپل سفاري او پیرودونکي سندونه د ویب ساکټونو سره وصل کړل

څو کاله دمخه، موږ په خالص پی ایچ پی کې خپل تطبیق ته وده ورکړه، کوم چې نشي کولی د https غوښتنې وکاروي، ځکه چې دا د لینک پرت دی. ډیر وخت دمخه، نږدې ټولو ویب سرورونو د https په اړه د پراکسي غوښتنو زده کړه او د پیوستون ملاتړ: upgrade.

کله چې دا پیښ شي ، ویب ساکټونه د SPA غوښتنلیکونو لپاره نږدې ډیفالټ خدمت شو ، ځکه چې د سرور په نوښت کارونکي ته مینځپانګې چمتو کول څومره اسانه دي (د بل کارونکي څخه پیغام لیږدول یا د عکس ، سند ، پریزنټشن نوې نسخه ډاونلوډ کړئ) چې اوس بل څوک ترمیم کوي).

که څه هم د پیرودونکي سند د یو څه مودې لپاره شاوخوا و ، مګر دا لاهم په کمزوري ډول ملاتړ کیږي ، ځکه چې دا ډیری ستونزې رامینځته کوي کله چې د دې د تیرولو هڅه کوي. او (احتمالا :slightly_smiling_face: ) له همدې امله د IOS براوزرونه (ټول د سفاري پرته) نه غواړي دا وکاروي او د محلي سند پلورنځي څخه یې غوښتنه وکړي. سندونه د ننوتلو/پاس یا ssh کیلي یا د فایر وال له لارې اړین بندرونو بندولو په پرتله ډیرې ګټې لري. مګر دا د هغه څه په اړه ندي.

په iOS کې، د سند نصبولو پروسه خورا ساده ده (د مشخصاتو پرته نه)، مګر په عمومي توګه دا د لارښوونو سره سم ترسره کیږي، چې په انټرنیټ کې ډیری شتون لري او یوازې د سفاري براوزر لپاره شتون لري. له بده مرغه، سفاري نه پوهیږي چې څنګه د ویب ساکټونو لپاره د مراجعینو سرټ وکاروئ، مګر په انټرنیټ کې ډیری لارښوونې شتون لري چې دا ډول سند څنګه جوړ کړي، مګر په عمل کې دا ناشونی دی.

څنګه موږ په زیرو ټیک کې د ایپل سفاري او پیرودونکي سندونه د ویب ساکټونو سره وصل کړل

د ویب ساکټونو د پوهیدو لپاره، موږ لاندې پالن کارولی: ستونزه/ فرضیه/ حل.

ستونزه: د ویب ساکټونو لپاره هیڅ ملاتړ شتون نلري کله چې سرچینو ته د پراکسي کولو غوښتنه کوي چې د IOS او نورو غوښتنلیکونو لپاره چې د سند ملاتړ فعال کړی وي د سفاري ګرځنده براوزر کې د پیرودونکي سند لخوا خوندي شوي.

فرضیه:

  1. دا ممکنه ده چې دا ډول استثنا د داخلي / خارجي پراکسي سرچینو ویب ساکټونو لپاره د سندونو کارولو لپاره تنظیم کړئ (په دې پوهیدل چې هیڅ به نه وي).
  2. د ویب ساکټونو لپاره، تاسو کولی شئ د لنډمهاله غونډو په کارولو سره یو ځانګړی، خوندي او د دفاع وړ اړیکه جوړه کړئ چې د نورمال (غیر ویب ساکټ) براوزر غوښتنې په جریان کې رامینځته کیږي.
  3. لنډمهاله ناستې د یو پراکسي ویب سرور په کارولو سره پلي کیدی شي (یوازې جوړ شوي ماډلونه او دندې).
  4. د لنډمهاله ناستې ټیکونه لا دمخه د چمتو شوي اپاچي ماډلونو په توګه پلي شوي.
  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. یا د پراختیا کونکي کنسول کې:

څنګه موږ په زیرو ټیک کې د ایپل سفاري او پیرودونکي سندونه د ویب ساکټونو سره وصل کړل

د فرضیې ازموینه:

1. دا ممکنه ده چې دا ډول استثنا د داخلي/بهرني پراکسي سرچینو ویب ساکټونو لپاره د سندونو کارولو لپاره ترتیب کړئ (په دې پوهیدل چې هیڅ به نه وي).

دلته دوه حلونه وموندل شول:

a) په کچه

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

د لاسرسي کچه بدل کړئ.

دا طريقه د لاندې nuances لري:

  • د سند تصدیق د پراکسي سرچینې ته د غوښتنې وروسته پیښیږي ، دا د غوښتنې وروسته لاس ملایم دی. دا پدې مانا ده چې پراکسي به لومړی بار کړي او بیا به خوندي شوي خدمت ته غوښتنه قطع کړي. دا خراب دی، مګر مهم ندی؛
  • په http2 پروتوکول کې. دا لاهم په مسوده کې دی ، او د براوزر جوړونکي نه پوهیږي چې دا څنګه پلي کړي #info په اړه tls1.3 http2 پوسټ هینډ شیک (اوس کار نه کوي) RFC 8740 پلي کړئ "د HTTP/1.3 سره د TLS 2 کارول";
  • دا روښانه نده چې دا پروسس څنګه یوځای شي.

b) په بنسټیزه کچه، د سند پرته 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 په اړه مقاله کې موندل کیدی شي: د اپاچی سرور پیرودونکي سند تصدیق

دواړه اختیارونه ازمول شوي، اختیار "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 پرځای) په بڼه د غیر موجود سند مالک اضافه کړم، نور توضیحات په اسنادو کې:

د اپاچی ماډل mod_ssl

څنګه موږ په زیرو ټیک کې د ایپل سفاري او پیرودونکي سندونه د ویب ساکټونو سره وصل کړل

2. د ویب ساکټونو لپاره، تاسو کولی شئ د لنډمهاله غونډو په کارولو سره یو ځانګړی، خوندي او خوندي پیوستون جوړ کړئ چې د نورمال (غیر ویب ساکټ) براوزر غوښتنې په جریان کې رامینځته کیږي.

د پخوانۍ تجربې پراساس ، تاسو اړتیا لرئ په ترتیب کې اضافي برخه اضافه کړئ ترڅو د منظم (غیر ویب ساکټ) غوښتنې په جریان کې د ویب ساکټ اتصال لپاره لنډمهاله ټوکن چمتو کړئ.

#подготовка передача себе С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. لنډمهاله ناستې د یو پراکسي ویب سرور په کارولو سره پلي کیدی شي (یوازې جوړ شوي ماډلونه او دندې).

لکه څنګه چې موږ مخکې وموندله، اپاچي خورا ډیر اصلي فعالیت لري چې تاسو ته اجازه درکوي مشروط جوړښتونه رامینځته کړئ. په هرصورت، موږ وسیلو ته اړتیا لرو ترڅو زموږ معلومات خوندي کړو پداسې حال کې چې دا د کارونکي براوزر کې وي، نو موږ تاسیس کوو چې څه شی ذخیره کړو او ولې، او کوم جوړ شوي افعال به یې وکاروو:

  • موږ داسې نښې ته اړتیا لرو چې په اسانۍ سره کوډ نشي کولی.
  • موږ یو داسې نښه ته اړتیا لرو چې په دې کې ناڅرګندتیا جوړه شوې وي او په سرور کې د ناڅرګندتیا چک کولو وړتیا لري.
  • موږ یوه نښه ته اړتیا لرو چې د سند مالک سره تړاو ولري.

دا د هش کولو فنکشن، مالګه، او د نښه کولو لپاره نیټې ته اړتیا لري. د اسنادو پر بنسټ په اپاچي HTTP سرور کې څرګندونې موږ دا ټول د بکس څخه بهر لرو 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>

هدف ترلاسه شوی ، مګر د سرور ناڅرګندتیا سره ستونزې شتون لري (تاسو کولی شئ یو کلن کوکي وکاروئ) ، پدې معنی چې ټوکنونه ، که څه هم د داخلي کارونې لپاره خوندي دي ، د صنعتي (ډلې) کارونې لپاره غیر خوندي دي.

څنګه موږ په زیرو ټیک کې د ایپل سفاري او پیرودونکي سندونه د ویب ساکټونو سره وصل کړل

4. د لنډمهاله ناستې ټیکونه لا دمخه د چمتو شوي اپاچي ماډلونو په توګه پلي شوي.

یوه د پام وړ ستونزه د تیر تکرار څخه پاتې شوه - د نښه کولو عمر کنټرولولو کې پاتې راتلل.

موږ د چمتو شوي ماډل په لټه کې یو چې دا کار کوي، د کلمو سره سم: apache token json two factor auth

هو، چمتو شوي ماډلونه شتون لري، مګر دا ټول د ځانګړو کړنو سره تړلي دي او د ناستې پیل کولو او اضافي کوکیز په بڼه کې آثار لري. دا د یو څه وخت لپاره نه دی.
موږ په لټون کې پنځه ساعته وخت ونیو، کوم چې سمه پایله یې نه درلوده.

5. د لنډمهاله ناستې نښې د تعاملاتو جوړښت په منطقي ډول ډیزاین کولو سره پلي کیدی شي.

چمتو شوي ماډلونه خورا پیچلي دي، ځکه چې موږ یوازې یو څو دندو ته اړتیا لرو.

دا ویل کیږي، د نیټې سره ستونزه دا ده چې د اپاچي جوړ شوي فنکشنونه اجازه نه ورکوي چې د راتلونکي څخه نیټه تولید کړي، او په جوړ شوي فنکشن کې هیڅ ریاضیاتی اضافه / تخفیف شتون نلري کله چې د ناڅرګندتیا لپاره چک کوي.

دا، تاسو نشئ لیکلی:

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

تاسو کولی شئ یوازې دوه شمیرې پرتله کړئ.

پداسې حال کې چې د سفاري ستونزې لپاره د حل لارې لټولو، ما یو په زړه پورې مقاله وموندله: د پیرودونکي سندونو سره د کور اسسټنټ خوندي کول (د سفاري/iOS سره کار کوي)
دا د نګینکس لپاره په لوا کې د کوډ مثال بیانوي، او کوم چې، لکه څنګه چې دا معلومه شوه، د ترتیب د هغې برخې منطق ډیر تکراروي چې موږ دمخه پلي کړی، د هش کولو لپاره د hmac مالګې میتود کارولو استثنا سره ( دا په اپاچي کې ونه موندل شو).

دا څرګنده شوه چې لوا د روښانه منطق سره ژبه ده، او دا ممکنه ده چې د اپاچي لپاره یو څه ساده کړئ:

د Nginx او Apache سره توپیر مطالعه کول:

او د لوا ژبې جوړونکي څخه شتون لري:
22.1 - نیټه او وخت

موږ په یوه کوچني لوا فایل کې د env متغیرونو تنظیم کولو لپاره یوه لاره وموندله ترڅو د راتلونکي تاریخ سره پرتله کولو لپاره نیټه وټاکو.

دا هغه څه دي چې یو ساده لوا سکریپټ ورته ښکاري:

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 څخه د دې معلوماتو پراساس د لاسرسي چیکونو وروسته فعال شي.

څنګه موږ په زیرو ټیک کې د ایپل سفاري او پیرودونکي سندونه د ویب ساکټونو سره وصل کړل

سرچینې ته لینک انځور.

یو بل شی.

په عموم کې ، دا مهمه نده چې لارښوونې په اپاچي (شاید نګینکس هم) ترتیب کې په کوم ترتیب کې لیکل شوي ، ځکه چې په پای کې به هرڅه د کارونکي غوښتنې حکم پراساس ترتیب شي ، کوم چې د پروسس کولو سکیم سره مطابقت لري. لوا سکریپټ.

بشپړول:

د پلي کیدو وروسته د لید حالت (هدف):
د خدماتو او زیربنا مدیریت د ګرځنده تلیفون څخه په IOS کې پرته له اضافي برنامو (VPN) څخه شتون لري ، متحد او خوندي.

هدف ترلاسه شوی ، ویب ساکټونه کار کوي او د امنیت کچه ​​له سند څخه کم نه لري.

څنګه موږ په زیرو ټیک کې د ایپل سفاري او پیرودونکي سندونه د ویب ساکټونو سره وصل کړل

سرچینه: www.habr.com

Add a comment