ProHoster > Blog > Ma'muriyat > Biz ZeroTech kompaniyasida Apple Safari va mijoz sertifikatlarini veb-rozetkalar bilan qanday bog'ladik
Biz ZeroTech kompaniyasida Apple Safari va mijoz sertifikatlarini veb-rozetkalar bilan qanday bog'ladik
Maqola quyidagilar uchun foydali bo'ladi:
Client Cert nima ekanligini biladi va mobil Safari-da nima uchun veb-rozetkalar kerakligini tushunadi;
Men cheklangan odamlar doirasiga yoki faqat o'zimga veb-xizmatlarni nashr etmoqchiman;
hamma narsa allaqachon kimdir tomonidan qilingan deb o'ylaydi va dunyoni biroz qulayroq va xavfsizroq qilishni xohlaydi.
Websockets tarixi taxminan 8 yil oldin boshlangan. Ilgari usullar uzoq http so'rovlari (aslida javoblar) ko'rinishida ishlatilgan: foydalanuvchi brauzeri serverga so'rov yubordi va uning biror narsaga javob berishini kutdi, javobdan keyin u yana ulandi va kutdi. Ammo keyin veb-soketlar paydo bo'ldi.
Bir necha yil oldin biz sof PHP-da o'z dasturimizni ishlab chiqdik, u https so'rovlaridan foydalana olmaydi, chunki bu havola qatlami. Yaqinda deyarli barcha veb-serverlar https orqali proksi-so'rovlarni yuborishni va ulanishni qo'llab-quvvatlashni o'rgandilar: yangilash.
Bu sodir bo'lganda, websockets SPA ilovalari uchun deyarli standart xizmatga aylandi, chunki server tashabbusi bilan foydalanuvchiga kontentni taqdim etish qanchalik qulay (boshqa foydalanuvchidan xabar yuborish yoki rasm, hujjat, taqdimotning yangi versiyasini yuklab olish). hozirda kimdir tahrir qilyapti).
Mijoz sertifikati ancha vaqtdan beri mavjud bo'lsa-da, u hali ham yaxshi qo'llab-quvvatlanmaydi, chunki uni chetlab o'tishga harakat qilganda juda ko'p muammolarni keltirib chiqaradi. Va (ehtimol :slightly_smiling_face: ) shuning uchun IOS brauzerlari (Safaridan tashqari) undan foydalanishni istamaydi va mahalliy sertifikatlar do'konidan talab qiladi. Sertifikatlar login/pass yoki ssh kalitlari yoki xavfsizlik devori orqali kerakli portlarni yopish bilan solishtirganda juda ko'p afzalliklarga ega. Lekin bu gap emas.
IOS-da sertifikatni o'rnatish tartibi juda oddiy (aniq ma'lumotlarsiz emas), lekin umuman olganda, u Internetda juda ko'p va faqat Safari brauzerida mavjud bo'lgan ko'rsatmalarga muvofiq amalga oshiriladi. Afsuski, Safari veb-rozetkalar uchun Client Cert-dan qanday foydalanishni bilmaydi, lekin Internetda bunday sertifikatni yaratish bo'yicha ko'plab ko'rsatmalar mavjud, ammo amalda bunga erishib bo'lmaydi.
Veb-soketlarni tushunish uchun biz quyidagi rejadan foydalandik: muammo/gipoteza/yechim.
Muammo: IOS uchun Safari mobil brauzerida mijoz sertifikati bilan himoyalangan resurslarga so'rovlarni proksi-server qilishda veb-rozetkalarni qo'llab-quvvatlamaydi va sertifikatni qo'llab-quvvatlashni yoqqan boshqa ilovalar.
Gipotezalar:
Ichki/tashqi proksi-resurslarning veb-rozetkalariga sertifikatlardan foydalanish uchun bunday istisnoni sozlash mumkin (hech qanday yo'qligini bilib).
Veb-soketlar uchun oddiy (veb-soket bo'lmagan) brauzer so'rovi paytida yaratilgan vaqtinchalik seanslar yordamida noyob, xavfsiz va himoyalangan ulanishni amalga oshirishingiz mumkin.
Vaqtinchalik seanslar bitta proksi-server yordamida amalga oshirilishi mumkin (faqat o'rnatilgan modullar va funksiyalar).
Vaqtinchalik seans tokenlari allaqachon tayyor Apache modullari sifatida amalga oshirilgan.
Vaqtinchalik seans tokenlari o'zaro ta'sir tuzilmasini mantiqiy loyihalash orqali amalga oshirilishi mumkin.
Amalga oshirilgandan keyin ko'rinadigan holat.
Ishning maqsadi: xizmatlar va infratuzilmani boshqarish qo'shimcha dasturlarsiz (masalan, VPN kabi) IOS tizimidagi mobil telefondan birlashtirilgan va xavfsiz bo'lishi kerak.
Qo'shimcha maqsad: mobil Internetda kontentni tezroq yetkazib berish bilan vaqt va resurslarni/telefon trafigini tejash (veb-rozetkasiz ba'zi xizmatlar keraksiz so'rovlarni keltirib chiqaradi).
1. Bunday istisnoni ichki/tashqi proksi-resurslarning veb-rozetkalariga sertifikatlardan foydalanish uchun sozlash mumkin (hech qanday bo'lmasligini bilib).
Sertifikatni tekshirish proksilangan resursga so'rov yuborilgandan so'ng, ya'ni so'rovni yuborishdan keyin amalga oshiriladi. Bu shuni anglatadiki, proksi-server avval yuklanadi va keyin himoyalangan xizmatga so'rovni o'chirib qo'yadi. Bu yomon, lekin tanqidiy emas;
Ushbu qayta ishlashni qanday birlashtirish kerakligi aniq emas.
b) Asosiy darajada, sertifikatsiz ssl-ga ruxsat bering.
SSLVerifyClient talab qiladi => SSLVerifyClient ixtiyoriy, lekin bu proksi-serverning xavfsizlik darajasini pasaytiradi, chunki bunday ulanish sertifikatsiz qayta ishlanadi. Biroq, siz quyidagi ko'rsatma bilan proksi-serverlarga kirishni rad qilishingiz mumkin:
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>
Sertifikat egasi tomonidan mavjud ruxsatnomani hisobga olgan holda, ammo sertifikat etishmayotgan bo'lsa, men mavjud bo'lmagan sertifikat egasini SSl_PROTOCOL (SSL_CLIENT_S_DN_CN o'rniga) mavjud o'zgaruvchilardan biri shaklida qo'shishim kerak edi, hujjatlarda batafsil ma'lumot:
2. Veb-soketlar uchun oddiy (veb-soket bo'lmagan) brauzer so'rovi vaqtida yaratilgan vaqtinchalik seanslar yordamida noyob, xavfsiz va himoyalangan ulanishni amalga oshirishingiz mumkin.
Oldingi tajribaga asoslanib, odatiy (veb-rozetkasi bo'lmagan) so'rov paytida veb-rozetka ulanishlari uchun vaqtinchalik tokenlarni tayyorlash uchun konfiguratsiyaga qo'shimcha bo'lim qo'shishingiz kerak.
Sinov shuni ko'rsatdiki, u ishlaydi. Cookie fayllarini foydalanuvchi brauzeri orqali o'zingizga o'tkazishingiz mumkin.
3. Vaqtinchalik seanslar bitta proksi-server (faqat o'rnatilgan modullar va funksiyalar) yordamida amalga oshirilishi mumkin.
Avval bilib olganimizdek, Apache shartli konstruksiyalarni yaratishga imkon beruvchi juda koβp asosiy funksiyalarga ega. Biroq, bizga ma'lumotlarimiz foydalanuvchi brauzerida bo'lganda himoya qilish uchun vositalar kerak, shuning uchun biz nimani va nima uchun saqlashni va qanday o'rnatilgan funktsiyalardan foydalanishimizni aniqlaymiz:
Bizga osonlikcha dekodlab bo'lmaydigan token kerak.
Bizga o'rnatilgan eskirgan token va serverda eskirganlikni tekshirish qobiliyatiga ega bo'lgan token kerak.
Bizga sertifikat egasi bilan bog'langan token kerak.
Bu xeshlash funksiyasi, tuz va tokenni eskirish sanasini talab qiladi. Hujjatlar asosida Apache HTTP serveridagi ifodalar bizda hammasi sha1 va %{TIME} mavjud.
Maqsadga erishildi, lekin serverning eskirishi bilan bog'liq muammolar mavjud (siz bir yoshli Cookie-dan foydalanishingiz mumkin), ya'ni tokenlar ichki foydalanish uchun xavfsiz bo'lsa-da, sanoat (ommaviy) foydalanish uchun xavflidir.
4. Vaqtinchalik seans tokenlari allaqachon tayyor Apache modullari sifatida amalga oshirilgan.
Oldingi iteratsiyadan bitta muhim muammo qoldi - token qarishini nazorat qila olmaslik.
Biz buni amalga oshiradigan tayyor modulni qidirmoqdamiz: apache token json two factor auth
Ha, tayyor modullar bor, lekin ularning barchasi muayyan harakatlarga bog'langan va sessiya va qo'shimcha Cookie-fayllarni boshlash ko'rinishidagi artefaktlarga ega. Ya'ni, bir muncha vaqt emas.
Qidiruvga besh soat vaqt ketdi, bu esa aniq natija bermadi.
5. Vaqtinchalik seans tokenlari o'zaro aloqalar strukturasini mantiqiy loyihalash orqali amalga oshirilishi mumkin.
Tayyor modullar juda murakkab, chunki bizga faqat bir nechta funktsiyalar kerak.
Aytgancha, sana bilan bog'liq muammo shundaki, Apache-ning o'rnatilgan funktsiyalari kelajakdan sanani yaratishga imkon bermaydi va eskirganlikni tekshirishda o'rnatilgan funktsiyalarda matematik qo'shish/ayirish mavjud emas.
Ya'ni, siz yoza olmaysiz:
(%{env:zt-cert-date} + 30) > %{DATE}
Siz faqat ikkita raqamni solishtirishingiz mumkin.
Safari muammosini hal qilish yo'lini qidirib, men qiziqarli maqola topdim: HomeAssistant-ni mijoz sertifikatlari bilan himoyalash (Safari/iOS bilan ishlaydi)
U Nginx uchun Lua kodining namunasini tasvirlaydi va ma'lum bo'lishicha, biz allaqachon amalga oshirgan konfiguratsiya qismining mantig'ini juda takrorlaydi, xeshlash uchun hmac tuzlash usulidan foydalanish bundan mustasno ( bu Apache'da topilmadi).
Lua aniq mantiqqa ega til ekanligi ayon bo'ldi va Apache uchun oddiy narsa qilish mumkin:
Umuman olganda, direktivalar Apache (ehtimol, Nginx) konfiguratsiyasida qanday tartibda yozilganligi muhim emas, chunki oxirida hamma narsa qayta ishlash sxemasiga mos keladigan foydalanuvchi so'rovi tartibiga qarab tartiblanadi. Lua skriptlari.
Tugatish:
Amalga oshirishdan keyin ko'rinadigan holat (maqsad):
xizmatlar va infratuzilmani boshqarish qo'shimcha dasturlarsiz (VPN) birlashtirilgan va xavfsiz IOS-da mobil telefondan foydalanish mumkin.
Maqsadga erishildi, veb-rozetkalar ishlaydi va sertifikatdan kam bo'lmagan xavfsizlik darajasiga ega.