ProHoster > ΠΠ»ΠΎΠ³ > Administrasi > Carane kita ing ZeroTech nyambung Apple Safari lan sertifikat klien karo websockets
Carane kita ing ZeroTech nyambung Apple Safari lan sertifikat klien karo websockets
Artikel kasebut bakal migunani kanggo wong sing:
ngerti apa iku Sertifikasi Klien lan ngerti sebabe butuh soket web ing Safari seluler;
Aku pengin nerbitake layanan web menyang bunderan winates utawa mung kanggo aku;
mikir sing kabeh wis rampung dening wong, lan kaya kanggo nggawe donya sethitik luwih trep lan luwih aman.
Sejarah websockets diwiwiti udakara 8 taun kepungkur. Sadurunge, cara kayata panjalukan http sing dawa (bener-bener tanggapan) digunakake: browser pangguna ngirim panjaluk menyang server lan ngenteni supaya bisa mangsuli, sawise tanggapan kasebut disambungake maneh lan ngenteni. Nanging banjur websockets katon.
Sawetara taun kepungkur, kita ngembangake implementasine dhewe ing PHP murni, sing ora bisa nggunakake panjalukan https, amarga iki minangka lapisan link. Ora suwe, meh kabeh server web sinau kanggo njaluk proxy liwat https lan ndhukung sambungan: nganyarke.
Nalika kedadeyan kasebut, websockets meh dadi layanan standar kanggo aplikasi SPA, amarga trep kanggo nyedhiyakake konten menyang pangguna kanthi inisiatif server (ngirim pesen saka pangguna liya utawa ngundhuh versi anyar saka gambar, dokumen, presentasi. yen wong liya lagi nyunting).
Sanajan Sertifikat Klien wis ana sawetara wektu, nanging isih kurang didhukung, amarga nggawe akeh masalah nalika nyoba ngliwati. Lan (bisa uga: slightly_smiling_face: ) pramila browser IOS (kabeh kajaba Safari) ora pengin nggunakake lan njaluk saka toko sertifikat lokal. Sertifikat duwe akeh kaluwihan dibandhingake karo login / pass utawa tombol ssh utawa nutup port sing dibutuhake liwat firewall. Nanging dudu bab iki.
Ing iOS, prosedur nginstal sertifikat cukup prasaja (ora tanpa spesifik), nanging umume ditindakake miturut instruksi, sing ana akeh ing Internet lan mung kasedhiya kanggo browser Safari. Sayange, Safari ora ngerti cara nggunakake Client Π‘ert kanggo soket web, nanging ana akeh instruksi ing Internet babagan carane nggawe sertifikat kasebut, nanging ing praktik iki ora bisa ditindakake.
Kanggo mangerteni websockets, kita nggunakake rencana ing ngisor iki: masalah / hipotesis / solusi.
Masalah: ora ana dhukungan kanggo soket web nalika njaluk proxy menyang sumber daya sing dilindhungi sertifikat klien ing browser seluler Safari kanggo IOS lan aplikasi liyane sing wis ngaktifake dhukungan sertifikat.
Hipotesis:
Sampeyan bisa ngonfigurasi pangecualian kasebut kanggo nggunakake sertifikat (ngerti ora ana) menyang soket web sumber daya internal / eksternal.
Kanggo websockets, sampeyan bisa nggawe sambungan sing unik, aman lan bisa dipertahankan nggunakake sesi sauntara sing digawe sajrone panjalukan browser normal (non-websocket).
Sesi sementara bisa dileksanakake nggunakake siji server web proxy (modul lan fungsi sing dibangun mung).
Token sesi sementara wis dileksanakake minangka modul Apache sing wis siap.
Token sesi sementara bisa dileksanakake kanthi ngrancang struktur interaksi kanthi logis.
Negara katon sawise implementasine.
Tujuan saka karya: manajemen layanan lan infrastruktur kudu bisa diakses saka ponsel ing IOS tanpa program tambahan (kayata VPN), manunggal lan aman.
Tujuan tambahan: ngirit wektu lan sumber daya / lalu lintas telpon (sawetara layanan tanpa soket web ngasilake panjaluk sing ora perlu) kanthi pangiriman konten sing luwih cepet ing Internet seluler.
Verifikasi sertifikat kedadeyan sawise panjaluk menyang sumber daya sing diproksi, yaiku, jabat tangan panjaluk kirim. Iki tegese proxy bakal mbukak dhisik banjur ngilangi panjaluk menyang layanan sing dilindhungi. Iki ala, nanging ora kritis;
Ing protokol http2. Iki isih ana ing konsep, lan produsen browser ora ngerti carane ngetrapake #info babagan tls1.3 http2 kirim jabat tangan (ora bisa digunakake saiki) Ngleksanakake RFC 8740 "Using TLS 1.3 with HTTP/2";
Ora jelas carane nggabungake pangolahan iki.
b) Ing tingkat dhasar, ngidini ssl tanpa sertifikat.
SSLVerifyClient mbutuhake => SSLVerifyClient opsional, nanging iki nyuda tingkat keamanan server proxy, amarga sambungan kasebut bakal diproses tanpa sertifikat. Nanging, sampeyan bisa nolak akses menyang layanan proksi kanthi arahan ing ngisor iki:
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>
Nganggep wewenang sing wis ana dening pemilik sertifikat, nanging kanthi sertifikat sing ilang, aku kudu nambah pemilik sertifikat sing ora ana ing wangun salah sawijining variabel SSl_PROTOCOL sing kasedhiya (tinimbang SSL_CLIENT_S_DN_CN), rincian liyane ing dokumentasi:
2. Kanggo websockets, sampeyan bisa nggawe sambungan unik, aman lan dilindhungi nggunakake sesi sauntara sing kui sak normal (non-websocket) panjalukan browser.
Adhedhasar pengalaman sadurunge, sampeyan kudu nambah bagean tambahan kanggo konfigurasi kanggo nyiapake token sementara kanggo sambungan soket web sajrone panjaluk biasa (non-web).
Tes nuduhake yen bisa. Sampeyan bisa nransfer Cookies menyang dhewe liwat browser pangguna.
3. Sesi sementara bisa dileksanakake nggunakake siji server web proxy (mung modul lan fungsi sing dibangun).
Kaya sing wis dingerteni sadurunge, Apache duwe akeh fungsi inti sing ngidini sampeyan nggawe konstruksi kondisional. Nanging, kita butuh sarana kanggo nglindhungi informasi nalika ana ing browser pangguna, mula kita nemtokake apa sing kudu disimpen lan ngapa, lan fungsi apa sing bakal digunakake:
We kudu token sing ora bisa gampang decoded.
We kudu token sing wis obsolescence dibangun menyang lan kemampuan kanggo mriksa obsolescence ing server.
Kita butuh token sing bakal digandhengake karo pemilik sertifikat kasebut.
Iki mbutuhake fungsi hashing, uyah, lan tanggal kanggo umur token. Adhedhasar dokumentasi Ekspresi ing Apache HTTP Server kita duwe kabeh metu saka kothak sha1 lan %{TIME}.
Ing goal wis ngrambah, nanging ana masalah karo obsolescence server (sampeyan bisa nggunakake Cookie taun-lawas), kang tegese token, sanajan aman kanggo nggunakake internal, ora aman kanggo industri (massal) nggunakake.
4. Token sesi sementara wis dileksanakake minangka modul Apache sing wis siap.
Siji masalah penting tetep saka pengulangan sadurunge - ora bisa ngontrol penuaan token.
We are looking for a modul siap-digawe sing nindakake iki, miturut tembung: apache token json two factor auth
Ya, ana modul siap-digawe, nanging kabeh padha disambungake menyang tumindak tartamtu lan duwe artefak ing wangun miwiti sesi lan Cookies tambahan. Tegese, ora sedhela.
Butuh limang jam kanggo nggoleki, sing ora menehi asil konkrit.
5. Token sesi sementara bisa dileksanakake kanthi ngrancang struktur interaksi kanthi logis.
Modul siap-digawe rumit banget, amarga kita mung butuh sawetara fungsi.
Nalika nggoleki solusi kanggo masalah Safari, aku nemokake artikel sing menarik: Ngamanake HomeAssistant nganggo sertifikat klien (bisa nganggo Safari/iOS)
Iki nggambarake conto kode ing Lua kanggo Nginx, lan sing, ternyata, mbaleni logika bagean konfigurasi sing wis ditindakake, kajaba nggunakake metode salting hmac kanggo hashing ( iki ora ditemokake ing Apache).
Dadi jelas yen Lua minangka basa kanthi logika sing jelas, lan bisa ditindakake kanthi gampang kanggo Apache:
Katon status sawise implementasine (goal):
manajemen layanan lan infrastruktur kasedhiya saka telpon seluler ing IOS tanpa program tambahan (VPN), manunggal lan aman.
Tujuane wis digayuh, soket web bisa digunakake lan duwe tingkat keamanan ora kurang saka sertifikat.