ZeroTech میں ہم نے Apple Safari اور کلائنٹ سرٹیفکیٹس کو ویب ساکٹ کے ساتھ کیسے جوڑا

مضمون ان لوگوں کے لیے مفید ہو گا جو:

  • جانتا ہے کہ کلائنٹ سرٹیفکیٹ کیا ہے اور سمجھتا ہے کہ اسے موبائل سفاری پر ویب ساکٹ کی ضرورت کیوں ہے؛
  • میں ویب سروسز کو لوگوں کے محدود حلقے یا صرف اپنے لیے شائع کرنا چاہوں گا؛
  • سوچتا ہے کہ سب کچھ پہلے ہی کسی نے کیا ہے، اور دنیا کو کچھ زیادہ آسان اور محفوظ بنانا چاہتا ہے۔

ویب ساکٹس کی تاریخ تقریباً 8 سال پہلے شروع ہوئی تھی۔ اس سے پہلے، طریقوں کو طویل HTTP درخواستوں (دراصل جوابات) کی شکل میں استعمال کیا جاتا تھا: صارف کے براؤزر نے سرور کو ایک درخواست بھیجی اور اس کے کچھ جواب دینے کا انتظار کیا، جواب کے بعد وہ دوبارہ جڑ گیا اور انتظار کیا۔ لیکن پھر ویب ساکٹس نمودار ہوئے۔

ZeroTech میں ہم نے Apple Safari اور کلائنٹ سرٹیفکیٹس کو ویب ساکٹ کے ساتھ کیسے جوڑا

کچھ سال پہلے، ہم نے خالص پی ایچ پی میں اپنا نفاذ تیار کیا، جو https کی درخواستوں کو استعمال نہیں کر سکتا، کیونکہ یہ لنک لیئر ہے۔ کچھ عرصہ پہلے، تقریباً تمام ویب سرورز نے https اور سپورٹ کنکشن: اپ گریڈ پر پراکسی درخواستیں سیکھ لیں۔

جب ایسا ہوا تو، ویب ساکٹس SPA ایپلی کیشنز کے لیے تقریباً ڈیفالٹ سروس بن گئی، کیونکہ سرور کی پہل پر صارف کو مواد فراہم کرنا کتنا آسان ہے (کسی دوسرے صارف سے پیغام بھیجنا یا تصویر، دستاویز، پریزنٹیشن کا نیا ورژن ڈاؤن لوڈ کرنا۔ کہ کوئی اور فی الحال ترمیم کر رہا ہے)۔

اگرچہ کلائنٹ سرٹیفکیٹ کافی عرصے سے موجود ہے، لیکن یہ اب بھی ناقص طور پر تعاون یافتہ ہے، کیونکہ جب اسے نظرانداز کرنے کی کوشش کی جاتی ہے تو یہ کافی مسائل پیدا کرتا ہے۔ اور (ممکنہ طور پر :slightly_smiling_face: ) اسی لیے IOS براؤزرز (سبھی سفاری کے علاوہ) اسے استعمال نہیں کرنا چاہتے اور مقامی سرٹیفکیٹ اسٹور سے اس کی درخواست کرنا چاہتے ہیں۔ لاگ ان/پاس یا ssh کیز یا فائر وال کے ذریعے ضروری بندرگاہوں کو بند کرنے کے مقابلے میں سرٹیفکیٹس کے بہت سے فوائد ہیں۔ لیکن یہ وہی نہیں ہے جس کے بارے میں ہے۔

iOS پر، سرٹیفکیٹ کو انسٹال کرنے کا طریقہ کار کافی آسان ہے (بغیر تفصیلات کے نہیں)، لیکن عام طور پر یہ ہدایات کے مطابق کیا جاتا ہے، جن میں سے انٹرنیٹ پر بہت کچھ ہے اور جو صرف سفاری براؤزر کے لیے دستیاب ہے۔ بدقسمتی سے، Safari ویب ساکٹ کے لیے Client Сert استعمال کرنے کا طریقہ نہیں جانتا، لیکن انٹرنیٹ پر اس طرح کے سرٹیفکیٹ کو بنانے کے بارے میں بہت سی ہدایات موجود ہیں، لیکن عملی طور پر یہ ناقابل حصول ہے۔

ZeroTech میں ہم نے Apple Safari اور کلائنٹ سرٹیفکیٹس کو ویب ساکٹ کے ساتھ کیسے جوڑا

ویب ساکٹس کو سمجھنے کے لیے، ہم نے مندرجہ ذیل پلان استعمال کیا: مسئلہ/مفروضہ/حل۔

مسئلہ: 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. یا ڈویلپر کنسول میں:

ZeroTech میں ہم نے Apple Safari اور کلائنٹ سرٹیفکیٹس کو ویب ساکٹ کے ساتھ کیسے جوڑا

مفروضے کا امتحان:

1. داخلی/بیرونی پراکسیڈ وسائل کے ویب ساکٹ میں سرٹیفکیٹ (یہ جانتے ہوئے کہ وہاں کوئی نہیں ہوگا) استعمال کرنے کے لیے اس طرح کے استثناء کو ترتیب دینا ممکن ہے۔

2 حل یہاں پائے گئے:

a) سطح پر

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

رسائی کی سطح کو تبدیل کریں۔

اس طریقہ کار میں درج ذیل باریکیاں ہیں:

  • سرٹیفکیٹ کی توثیق پراکسیڈ وسیلہ کی درخواست کے بعد ہوتی ہے، یعنی پوسٹ ریکوئسٹ ہینڈ شیک۔ اس کا مطلب یہ ہے کہ پراکسی پہلے لوڈ کرے گی اور پھر محفوظ سروس کی درخواست کو کاٹ دے گی۔ یہ برا ہے، لیکن تنقیدی نہیں؛
  • HTTP2 پروٹوکول میں۔ یہ ابھی بھی مسودہ میں ہے، اور براؤزر مینوفیکچررز نہیں جانتے کہ اسے کیسے نافذ کیا جائے #info about tls1.3 http2 پوسٹ ہینڈ شیک (اب کام نہیں کر رہا) RFC 8740 لاگو کریں "HTTP/1.3 کے ساتھ TLS 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"

مزید تفصیلی معلومات ایس ایس ایل کے بارے میں مضمون میں مل سکتی ہیں: اپاچی سرور کلائنٹ سرٹیفکیٹ کی توثیق

دونوں اختیارات کی جانچ کی گئی، آپشن "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

ZeroTech میں ہم نے Apple Safari اور کلائنٹ سرٹیفکیٹس کو ویب ساکٹ کے ساتھ کیسے جوڑا

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 سرور میں تاثرات ہمارے پاس یہ سب باکس شا1 اور %{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 token json two factor auth

ہاں، ریڈی میڈ ماڈیولز موجود ہیں، لیکن وہ تمام مخصوص اعمال سے منسلک ہیں اور سیشن شروع کرنے اور اضافی کوکیز کی شکل میں نمونے رکھتے ہیں۔ یعنی تھوڑی دیر کے لیے نہیں۔
ہمیں تلاش کرنے میں پانچ گھنٹے لگے جس کا کوئی ٹھوس نتیجہ نہیں نکلا۔

5. عارضی سیشن ٹوکن کو منطقی طور پر تعاملات کے ڈھانچے کو ڈیزائن کر کے لاگو کیا جا سکتا ہے۔

ریڈی میڈ ماڈیولز بہت پیچیدہ ہیں، کیونکہ ہمیں صرف چند فنکشنز کی ضرورت ہے۔

یہ کہا جا رہا ہے کہ، تاریخ کے ساتھ مسئلہ یہ ہے کہ اپاچی کے بلٹ ان فنکشنز مستقبل سے تاریخ پیدا کرنے کی اجازت نہیں دیتے ہیں، اور متروک ہونے کی جانچ کرتے وقت بلٹ ان فنکشنز میں کوئی ریاضیاتی اضافہ/گھٹاؤ نہیں ہوتا ہے۔

یعنی آپ لکھ نہیں سکتے:

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

آپ صرف دو نمبروں کا موازنہ کر سکتے ہیں۔

سفاری کے مسئلے کے حل کی تلاش کے دوران، مجھے ایک دلچسپ مضمون ملا: کلائنٹ سرٹیفکیٹ کے ساتھ ہوم اسسٹنٹ کو محفوظ بنانا (سفاری/آئی او ایس کے ساتھ کام کرتا ہے)
یہ Nginx کے لیے Lua میں کوڈ کی ایک مثال بیان کرتا ہے، اور جو کہ جیسا کہ یہ نکلا، بہت زیادہ کنفیگریشن کے اس حصے کی منطق کو دہراتا ہے جسے ہم پہلے ہی لاگو کر چکے ہیں، سوائے ہیشنگ کے لیے hmac سالٹنگ کے طریقہ کار کے استعمال کے۔ یہ اپاچی میں نہیں ملا)۔

یہ واضح ہو گیا کہ Lua ایک واضح منطق والی زبان ہے، اور اپاچی کے لیے کچھ آسان کرنا ممکن ہے:

Nginx اور Apache کے ساتھ فرق کا مطالعہ کرنے کے بعد:

اور Lua زبان بنانے والے سے دستیاب افعال:
22.1 - تاریخ اور وقت

ہم نے ایک چھوٹی Lua فائل میں 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 سے اس معلومات کی بنیاد پر رسائی کی جانچ پڑتال کے بعد چالو کیا جائے گا۔

ZeroTech میں ہم نے Apple Safari اور کلائنٹ سرٹیفکیٹس کو ویب ساکٹ کے ساتھ کیسے جوڑا

ماخذ سے لنک تصویر.

ایک اور بات.

عام طور پر، اس سے کوئی فرق نہیں پڑتا کہ اپاچی (شاید Nginx بھی) کنفیگریشن میں ہدایات کس ترتیب سے لکھی جاتی ہیں، کیونکہ آخر میں ہر چیز کو صارف کی درخواست کے حکم کی بنیاد پر ترتیب دیا جائے گا، جو کہ پروسیسنگ کی اسکیم کے مطابق ہے۔ لوا اسکرپٹس۔

تکمیل:

نفاذ کے بعد مرئی حالت (مقصد):
سروسز اور انفراسٹرکچر کا انتظام موبائل فون سے بغیر اضافی پروگراموں (VPN) کے IOS پر دستیاب ہے، متحد اور محفوظ۔

مقصد حاصل کر لیا گیا ہے، ویب ساکٹ کام کرتے ہیں اور سیکیورٹی کی سطح کسی سرٹیفکیٹ سے کم نہیں ہے۔

ZeroTech میں ہم نے Apple Safari اور کلائنٹ سرٹیفکیٹس کو ویب ساکٹ کے ساتھ کیسے جوڑا

ماخذ: www.habr.com

نیا تبصرہ شامل کریں