ويب ساکٽس جي تاريخ اٽڪل 8 سال اڳ شروع ٿي. اڳي، طريقا استعمال ڪيا ويا ڊگھي http درخواستن جي صورت ۾ (حقيقت ۾ جواب): صارف جي برائوزر سرور ڏانهن هڪ درخواست موڪلي ۽ ان کي ڪجهه جواب ڏيڻ جو انتظار ڪيو، جواب کان پوء اهو ٻيهر ڳنڍيو ۽ انتظار ڪيو. پر پوءِ ويب ساکٽ ظاهر ٿيا.
ڪجھ سال اڳ، اسان خالص PHP ۾ پنھنجو عمل درآمد ڪيو، جيڪو https جي درخواستن کي استعمال نٿو ڪري سگھي، ڇو ته ھي لنڪ پرت آھي. گهڻو وقت اڳ نه، تقريبن سڀني ويب سرورن کي سکيو پراکسي درخواستن تي https ۽ سپورٽ ڪنيڪشن: upgrade.
جڏهن اهو ٿيو، ويب ساکٽس SPA ايپليڪيشنن لاءِ لڳ ڀڳ ڊفالٽ سروس بڻجي وئي، ڇاڪاڻ ته سرور جي شروعات تي صارف کي مواد مهيا ڪرڻ ڪيترو آسان آهي (ٻي صارف کان پيغام منتقل ڪرڻ يا تصوير، دستاويز، پيشڪش جو نئون نسخو ڊائون لوڊ ڪريو. جيڪو هن وقت ڪو ٻيو ايڊٽ ڪري رهيو آهي).
جيتوڻيڪ ڪلائنٽ سرٽيفڪيٽ ڪافي عرصي کان موجود آهي، پر اهو اڃا تائين ناقص طور تي سهڪاري رهيو آهي، ڇاڪاڻ ته ان کي بائي پاس ڪرڻ جي ڪوشش ۾ تمام گهڻا مسئلا پيدا ٿين ٿا. ۽ (ممڪن طور تي :slightly_smiling_face: ) اهو ئي سبب آهي ته IOS برائوزر (سڀني سفاري کانسواءِ) ان کي استعمال ڪرڻ نٿا چاهين ۽ مقامي سرٽيفڪيٽ اسٽور کان ان جي درخواست ڪن ٿا. لاگ ان/پاس يا ssh ڪيز جي مقابلي ۾ سرٽيفڪيٽن جا ڪيترائي فائدا آھن يا ضروري بندرگاھن کي فائر وال ذريعي بند ڪرڻ. پر اهو نه آهي ته اهو ڇا آهي.
iOS تي، سرٽيفڪيٽ کي نصب ڪرڻ جو طريقو بلڪل سادو آهي (خاص طور تي نه)، پر عام طور تي اهو هدايتن جي مطابق ڪيو ويو آهي، جن مان انٽرنيٽ تي تمام گهڻو آهن ۽ جيڪي صرف سفاري برائوزر لاء موجود آهن. بدقسمتي سان، سفاري کي خبر ناهي ته ڪلائنٽ سرٽيفڪيشن ويب ساکٽس لاءِ ڪيئن استعمال ڪجي، پر انٽرنيٽ تي ڪيتريون ئي هدايتون آهن ته اهڙي سرٽيفڪيٽ ڪيئن ٺاهجي، پر عملي طور تي اهو حاصل ڪرڻ ناممڪن آهي.
Websockets کي سمجھڻ لاء، اسان ھيٺ ڏنل منصوبو استعمال ڪيو: مسئلو/مفروضو/حل.
مسئلو ويب ساکٽس لاءِ ڪو به سهڪار نه آهي جڏهن وسيلن ڏانهن درخواستن جي پروڪسنگ ڪئي وئي آهي جيڪي ڪلائنٽ سرٽيفڪيٽ طرفان محفوظ آهن سفاري موبائل برائوزر تي IOS ۽ ٻين ايپليڪيشنن لاءِ جيڪي سرٽيفڪيٽ سپورٽ کي فعال ڪيون آهن.
مفروضا:
اهو ممڪن آهي ته اهڙي استثنا کي ترتيب ڏيڻ لاءِ سرٽيفڪيٽن کي استعمال ڪرڻ لاءِ (ڄاڻجي ته اتي ڪو به نه هوندو) اندروني/بيروني پراڪسائيڊ وسيلن جي ويب ساکٽس ۾.
ويب ساکٽس لاءِ، توهان عارضي سيشن استعمال ڪندي هڪ منفرد، محفوظ ۽ دفاعي ڪنيڪشن ٺاهي سگهو ٿا جيڪي عام (غير ويب ساکٽ) برائوزر جي درخواست دوران ٺاهيا ويندا آهن.
عارضي سيشن هڪ پراکسي ويب سرور استعمال ڪندي لاڳو ڪري سگھجن ٿا (صرف بلٽ ان ماڊلز ۽ افعال).
عارضي سيشن ٽوڪن اڳ ۾ ئي تيار ڪيل اپاچي ماڊلز جي طور تي لاڳو ڪيا ويا آهن.
عارضي سيشن ٽوڪن کي منطقي طور تي رابطي جي جوڙجڪ کي ترتيب ڏيڻ سان لاڳو ڪري سگهجي ٿو.
لاڳو ٿيڻ کان پوء ڏسڻ واري حالت.
ڪم جو مقصد: خدمتن ۽ انفراسٽرڪچر جو انتظام 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. اهڙي استثناءَ کي ترتيب ڏيڻ ممڪن آهي سرٽيفڪيٽن کي استعمال ڪرڻ لاءِ (ڄاڻڻ ته اتي ڪو به نه هوندو) اندروني/بيروني پراڪسائيڊ وسيلن جي ويب ساکٽس تي.
سرٽيفڪيٽ جي تصديق ٿيندي آهي هڪ درخواست کان پوءِ پراڪسائيڊ وسيلن جي، يعني پوسٽ جي درخواست هٿ ملائڻ. هن جو مطلب اهو آهي ته پراکسي پهريون ڀيرو لوڊ ڪندي ۽ پوء محفوظ ڪيل خدمت جي درخواست کي ڪٽيندو. هي خراب آهي، پر نازڪ ناهي؛
http2 پروٽوڪول ۾. اهو اڃا مسودو ۾ آهي، ۽ برائوزر ٺاهيندڙن کي خبر ناهي ته ان کي ڪيئن لاڳو ڪجي #info about 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"
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 جي بدران)، دستاويز ۾ وڌيڪ تفصيل:
3. عارضي سيشن ھڪڙي پراکسي ويب سرور (صرف بلٽ ان ماڊلز ۽ افعال) استعمال ڪندي لاڳو ڪري سگھجن ٿا.
جيئن ته اسان اڳ ۾ ئي معلوم ڪيو آهي، Apache ۾ ڪافي بنيادي ڪارڪردگي آهي جيڪا توهان کي مشروط تعميرات ٺاهڻ جي اجازت ڏئي ٿي. تنهن هوندي، اسان کي ضرورت آهي ته اسان جي معلومات کي تحفظ ڏيڻ لاءِ جڏهن اها صارف جي برائوزر ۾ آهي، تنهنڪري اسان اهو قائم ڪريون ٿا ته ڇا ذخيرو ڪجي ۽ ڇو، ۽ ڪهڙا بلٽ ان فنڪشن استعمال ڪنداسين:
اسان کي هڪ ٽوڪن جي ضرورت آهي جيڪا آساني سان ڊيڪوڊ نه ٿي سگهي.
اسان کي هڪ ٽوڪن جي ضرورت آهي جيڪا ان ۾ ٺاهيل فرسوده هجي ۽ سرور تي غير معمولي جانچڻ جي صلاحيت هجي.
اسان کي هڪ ٽوڪن جي ضرورت آهي جيڪا سند جي مالڪ سان لاڳاپيل هوندي.
ھن لاءِ ھشنگ فنڪشن، لوڻ، ۽ ٽوڪن جي عمر لاءِ تاريخ جي ضرورت آھي. دستاويز جي بنياد تي Apache 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>
مقصد حاصل ڪيو ويو آهي، پر سرور جي غير حاضري سان مسئلا آهن (توهان هڪ سال پراڻي ڪوڪي استعمال ڪري سگهو ٿا)، جنهن جو مطلب آهي ته ٽوڪن، جيتوڻيڪ اندروني استعمال لاء محفوظ آهن، صنعتي (ماس) استعمال لاء غير محفوظ آهن.
ها، تيار ڪيل ماڊلز موجود آهن، پر اهي سڀئي مخصوص عملن سان جڙيل آهن ۽ سيشن شروع ڪرڻ ۽ اضافي ڪوڪيز جي صورت ۾ نمونا آهن. يعني ٿوري دير لاءِ نه.
اسان کي ڳولڻ ۾ پنج ڪلاڪ لڳا، جنهن جو ڪو به نتيجو نه نڪتو.
5. عارضي سيشن ٽوڪن کي منطقي طور تي رابطي جي جوڙجڪ کي ترتيب ڏيڻ سان لاڳو ڪري سگھجي ٿو.
تيار ٿيل ماڊل تمام پيچيده آهن، ڇاڪاڻ ته اسان کي صرف چند ڪمن جي ضرورت آهي.
اهو چيو پيو وڃي، تاريخ سان مسئلو اهو آهي ته Apache جي تعمير ٿيل افعال مستقبل کان تاريخ پيدا ڪرڻ جي اجازت نه ڏيندا آهن، ۽ تعمير ٿيل افعال ۾ ڪو به رياضياتي اضافو/ذخيرو ناهي جڏهن غير معمولي جي جانچ ڪندي.
اهو آهي، توهان نٿا لکي سگهو:
(%{env:zt-cert-date} + 30) > %{DATE}
توھان صرف ٻن نمبرن جو مقابلو ڪري سگھو ٿا.
سفاري مسئلي جي حل جي ڳولا دوران، مون کي هڪ دلچسپ مضمون مليو: ڪلائنٽ سرٽيفڪيٽ سان هوم اسسٽنٽ کي محفوظ ڪرڻ (سفاري/iOS سان ڪم ڪري ٿو)
اهو Nginx لاءِ Lua ۾ ڪوڊ جو هڪ مثال بيان ڪري ٿو، ۽ جيڪو، جيئن اهو نڪتو، تمام گهڻو ورجائي ٿو ترتيب جي ان حصي جي منطق کي جيڪو اسان اڳ ۾ ئي لاڳو ڪيو آهي، هشنگ لاءِ hmac سالٽنگ جو طريقو استعمال ڪرڻ جي استثنا سان ( اهو Apache ۾ نه مليو).
عام طور تي، اهو فرق نٿو پوي ته هدايتون ڪهڙي ترتيب ۾ لکيل آهن Apache (شايد Nginx پڻ) ترتيب ۾، ڇو ته آخر ۾ هر شي کي ترتيب ڏني ويندي صارف جي درخواست جي ترتيب جي بنياد تي، جيڪو پروسيسنگ جي منصوبي سان ملندو آهي. لوا اسڪرپٽ.
مڪمل ٿيڻ:
عمل درآمد کان پوءِ ڏسڻ واري حالت (مقصد):
خدمتن ۽ انفراسٽرڪچر جو انتظام موبائل فون مان IOS تي موجود آهي بغير اضافي پروگرامن (VPN)، متحد ۽ محفوظ.
مقصد حاصل ڪيو ويو آهي، ويب ساکٽ ڪم ڪري ٿو ۽ سيڪيورٽي جي سطح کي سرٽيفڪيٽ کان گهٽ ناهي.