Π‘ΡΠ°ΡΡΡ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ»Π΅Π·Π½Π° ΡΠ΅ΠΌ, ΠΊΡΠΎ:
- Π·Π½Π°Π΅Ρ, ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅ Client Cert, ΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ Π΄Π»Ρ ΡΠ΅Π³ΠΎ Π΅ΠΌΡ websocket-Ρ Π½Π° ΠΌΠΎΠ±ΠΈΠ»ΡΠ½ΠΎΠΌ Safari;
- Ρ ΠΎΡΠ΅Π» Π±Ρ ΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°ΡΡ web-ΡΠ΅ΡΠ²ΠΈΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΠΎΠΌΡ ΠΊΡΡΠ³Ρ Π»ΠΈΡ ΠΈΠ»ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅Π±Π΅;
- Π΄ΡΠΌΠ°Π΅Ρ, ΡΡΠΎ Π²ΡΡ ΡΠΆΠ΅ ΠΊΠ΅ΠΌ-ΡΠΎ ΡΠ΄Π΅Π»Π°Π½ΠΎ, ΠΈ Ρ ΠΎΡΠ΅Π» Π±Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΠΌΠΈΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΄ΠΎΠ±Π½Π΅Π΅ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½Π΅Π΅.
ΠΡΡΠΎΡΠΈΡ Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΠΎΠ² Π½Π°ΡΠ°Π»Π°ΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ 8 Π»Π΅Ρ Π½Π°Π·Π°Π΄. Π Π°Π½Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ Π²ΠΈΠ΄Π° Π΄ΠΎΠ»Π³ΠΈΡ
http-Π·Π°ΠΏΡΠΎΡΠΎΠ² (Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΎΡΠ²Π΅ΡΠΎΠ²): Π±ΡΠ°ΡΠ·Π΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ» Π·Π°ΠΏΡΠΎΡ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ ΠΈ ΠΆΠ΄Π°Π», ΠΏΠΎΠΊΠ° ΠΎΠ½ Π΅ΠΌΡ ΡΡΠΎ-ΡΠΎ ΠΎΡΠ²Π΅ΡΠΈΡ, ΠΏΠΎΡΠ»Π΅ ΠΎΡΠ²Π΅ΡΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π»ΡΡ Π²Π½ΠΎΠ²Ρ ΠΈ ΠΆΠ΄Π°Π». ΠΠΎ ΠΏΠΎΡΠΎΠΌ ΠΏΠΎΡΠ²ΠΈΠ»ΠΈΡΡ Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΡ.
ΠΠ΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π»Π΅Ρ Π½Π°Π·Π°Π΄ ΠΌΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π»ΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΡΠΈΡΡΠΎΠΌ php, ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π΅ ΡΠΌΠ΅Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π·Π°ΠΏΡΠΎΡΡ https, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΡΠΎ ΠΊΠ°Π½Π°Π»ΡΠ½ΡΠΉ ΡΡΠΎΠ²Π΅Π½Ρ. ΠΠ΅ ΡΠ°ΠΊ Π΄Π°Π²Π½ΠΎ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΠ΅ web-ΡΠ΅ΡΠ²Π΅ΡΡ Π½Π°ΡΡΠΈΠ»ΠΈΡΡ ΠΏΡΠΎΠΊΡΠΈΡΠΎΠ²Π°ΡΡ Π·Π°ΠΏΡΠΎΡΡ ΠΏΠΎ https ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ connection:upgrade.
ΠΠΎΠ³Π΄Π° ΡΡΠΎ ΡΠ»ΡΡΠΈΠ»ΠΎΡΡ, Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΡ ΡΡΠ°Π»ΠΈ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ΅ΡΠ²ΠΈΡΠΎΠΌ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Ρ SPA-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π²Π΅Π΄Ρ ΠΊΠ°ΠΊ ΡΠ΄ΠΎΠ±Π½ΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΊΠΎΠ½ΡΠ΅Π½Ρ ΠΏΠΎ ΠΈΠ½ΠΈΡΠΈΠ°ΡΠΈΠ²Π΅ ΡΠ΅ΡΠ²Π΅ΡΠ° (ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΡ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈΠ»ΠΈ Π·Π°Π³ΡΡΠ·ΠΈΡΡ Π½ΠΎΠ²ΡΡ Π²Π΅ΡΡΠΈΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°, ΠΏΡΠ΅Π·Π΅Π½ΡΠ°ΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΡ ΡΠ΅ΠΉΡΠ°Ρ ΠΊΡΠΎ-ΡΠΎ Π΅ΡΡ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΡΠ΅Ρ).
Π₯ΠΎΡΡ Π‘lient Π‘ert ΠΏΠΎΡΠ²ΠΈΠ»ΡΡ ΡΠΆΠ΅ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ Π΄Π°Π²Π½ΠΎ, ΠΎΠ½ Π²ΡΡ Π΅ΡΡ ΠΎΡΡΠ°ΡΡΡΡ ΠΌΠ°Π»ΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΠΌ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°ΡΡ ΠΌΠ°ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Ρ ΠΏΠΎΠΏΡΡΠΊΠ°ΠΌΠΈ Π΅Π³ΠΎ ΠΎΠ±ΠΎΠΉΡΠΈ. Π (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ :slightly_smiling_face: ) ΠΏΠΎΡΡΠΎΠΌΡ IOS-Π±ΡΠ°ΡΠ·Π΅ΡΡ (Π²ΡΠ΅, ΠΊΡΠΎΠΌΠ΅ Safari) Π½Π΅ Ρ ΠΎΡΡΡ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°ΡΡ Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ° ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΠ². Π‘Π΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡ ΠΎΠ±Π»Π°Π΄Π°ΡΡ ΠΌΠ°ΡΡΠΎΠΉ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ² ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ ΠΊΠ»ΡΡΠ°ΠΌΠΈ login/pass ΠΈΠ»ΠΈ ssh ΠΈΠ»ΠΈ Π·Π°ΠΊΡΡΡΠΈΠ΅ΠΌ ΡΠ΅ΡΠ΅Π· firewall Π½ΡΠΆΠ½ΡΡ ΠΏΠΎΡΡΠΎΠ². ΠΠΎ ΡΠ΅ΡΡ Π½Π΅ ΠΎΠ± ΡΡΠΎΠΌ.
ΠΠ° IOS ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ° Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΏΡΠΎΡΡΠ° (Π½Π΅ Π±Π΅Π· ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠΈ), Π½ΠΎ Π² ΠΎΠ±ΡΠ΅ΠΌ Π΄Π΅Π»Π°Π΅ΡΡΡ ΠΏΠΎ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡΠΌ, ΠΊΠΎΡΠΎΡΡΡ Π² ΡΠ΅ΡΠΈ ΠΎΡΠ΅Π½Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΠΈ ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΡΡΡΠΏΠ½Ρ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ Π±ΡΠ°ΡΠ·Π΅ΡΠ° Safari. Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Safari Π½Π΅ ΡΠΌΠ΅Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π‘lient Π‘ert Π΄Π»Ρ Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΠΎΠ², Π½ΠΎ Π² ΠΈΠ½ΡΠ΅ΡΠ½Π΅ΡΠ΅ Π΅ΡΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ, ΠΊΠ°ΠΊ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ°ΠΊΠΎΠΉ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ, Π½ΠΎ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ ΡΡΠΎ Π½Π΅Π΄ΠΎΡΡΠΈΠΆΠΈΠΌΠΎ.
Π§ΡΠΎΠ±Ρ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ Π² Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΠ°Ρ
, ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΏΠ»Π°Π½: ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°/Π³ΠΈΠΏΠΎΡΠ΅Π·Π°/ΡΠ΅ΡΠ΅Π½ΠΈΠ΅.
ΠΡΠΎΠ±Π»Π΅ΠΌΠ°: ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΠΎΠ² ΠΏΡΠΈ ΠΏΡΠΎΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΊ ΡΠ΅ΡΡΡΡΠ°ΠΌ, ΠΊΠΎΡΠΎΡΡΠ΅ Π·Π°ΡΠΈΡΠ΅Π½Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠΌ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΠΌ Π½Π° ΠΌΠΎΠ±ΠΈΠ»ΡΠ½ΠΎΠΌ Π±ΡΠ°ΡΠ·Π΅ΡΠ΅ Safari Π΄Π»Ρ IOS ΠΈ Π΄ΡΡΠ³ΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΠΊΠ»ΡΡΠΈΠ»ΠΈ Ρ ΡΠ΅Π±Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΠ².
ΠΠΈΠΏΠΎΡΠ΅Π·Ρ:
- ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ ΡΠ°ΠΊΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΠ² (Π·Π½Π°Ρ, ΡΡΠΎ ΠΈΡ Π½Π΅ Π±ΡΠ΄Π΅Ρ) ΠΊ Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΠ°ΠΌ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΡ /Π²Π½Π΅ΡΠ½ΠΈΡ ΠΏΡΠΎΠΊΡΠΈΡΡΠ΅ΠΌΡΡ ΡΠ΅ΡΡΡΡΠΎΠ².
- ΠΠ»Ρ Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΠ΅ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ΅ ΠΈ Π·Π°ΡΠΈΡΠ°Π΅ΠΌΠΎΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠ΅ΡΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΡΡΡΡΡ ΠΏΡΠΈ ΠΎΠ±ΡΡΠ½ΠΎΠΌ (Π½Π΅ Π²Π΅Π±-ΡΠΎΠΊΠ΅Ρ) Π·Π°ΠΏΡΠΎΡΠ΅ Π±ΡΠ°ΡΠ·Π΅ΡΠ°.
- ΠΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠ΅ΡΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ proxy web-ΡΠ΅ΡΠ²Π΅ΡΠ° (ΡΠΎΠ»ΡΠΊΠΎ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ).
- ΠΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠ΅ΡΡΠΈΠΈ-ΡΠΎΠΊΠ΅Π½Ρ ΡΠΆΠ΅ Π±ΡΠ»ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π³ΠΎΡΠΎΠ²ΡΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ apache.
- ΠΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠ΅ΡΡΠΈΠΈ-ΡΠΎΠΊΠ΅Π½Ρ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ, Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈ ΡΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π² ΡΡΡΡΠΊΡΡΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠΉ.
ΠΠΈΠ΄ΠΈΠΌΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΏΠΎΡΠ»Π΅ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΡ.
Π¦Π΅Π»Ρ ΡΠ°Π±ΠΎΡΡ: ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌΠΈ ΠΈ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ Ρ ΠΌΠΎΠ±ΠΈΠ»ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅Π»Π΅ΡΠΎΠ½Π° Π½Π° 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. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ ΡΠ°ΠΊΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΠ² (Π·Π½Π°Ρ, ΡΡΠΎ ΠΈΡ Π½Π΅ Π±ΡΠ΄Π΅Ρ) ΠΊ Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΠ°ΠΌ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΡ /Π²Π½Π΅ΡΠ½ΠΈΡ ΠΏΡΠΎΠΊΡΠΈΡΡΠ΅ΠΌΡΡ ΡΠ΅ΡΡΡΡΠΎΠ².
Π’ΡΡ Π±ΡΠ»ΠΎ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ 2 ΡΠ΅ΡΠ΅Π½ΠΈΡ:
Π°) ΠΠ° ΡΡΠΎΠ²Π½Π΅
<Location sock*> SSLVerifyClient optional </Location>
<Location /> SSLVerifyClient require </Location>
ΠΌΠ΅Π½ΡΡΡ ΡΡΠΎΠ²Π΅Π½Ρ Π΄ΠΎΡΡΡΠΏΠ°.
Π£ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΈ ΡΠ°ΠΊΠΈΠ΅ Π½ΡΠ°Π½ΡΡ:
- ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ° ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΠΎΡΠ»Π΅ Π·Π°ΠΏΡΠΎΡΠ° ΠΊ ΠΏΡΠΎΠΊΡΠΈΡΡΠ΅ΠΌΠΎΠΌΡ ΡΠ΅ΡΡΡΡΡ, ΡΠΎ Π΅ΡΡΡ post request handshake. ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΏΡΠΎΠΊΡΠΈ ΡΠ½Π°ΡΠ°Π»Π° Π½Π°Π³ΡΡΠ·ΠΈΡ, Π° ΠΏΠΎΡΠΎΠΌ ΠΎΡΡΠ΅ΡΡΡ Π·Π°ΠΏΡΠΎΡ ΠΊ Π·Π°ΡΠΈΡΠ°Π΅ΠΌΠΎΠΌΡ ΡΠ΅ΡΠ²ΠΈΡΡ. ΠΡΠΎ ΠΏΠ»ΠΎΡ ΠΎ, Π½ΠΎ Π½Π΅ ΠΊΡΠΈΡΠΈΡΠ½ΠΎ;
- Π ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π΅ http2. ΠΠ½ Π΅ΡΡ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ Π² draft-Π΅, ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΠΈ Π±ΡΠ°ΡΠ·Π΅ΡΠΎΠ² Π½Π΅ Π·Π½Π°ΡΡ, ΠΊΠ°ΠΊ Π΅Π³ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ #info about tls1.3 http2 post handshake (not working now)
Implement RFC 8740 Β«Using TLS 1.3 with HTTP/2Β» ; - ΠΠ΅ΠΏΠΎΠ½ΡΡΠ½ΠΎ, ΠΊΠ°ΠΊ ΡΠ½ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ.
Π±) ΠΠ° Π±Π°Π·ΠΎΠ²ΠΎΠΌ ΡΡΠΎΠ²Π½Π΅ ΡΠ°Π·ΡΠ΅ΡΠΈΡΡ ssl Π±Π΅Π· ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°.
SSLVerifyClient require => SSLVerifyClient optional, Π½ΠΎ ΡΡΠΎ ΡΠ½ΠΈΠΆΠ°Π΅Ρ ΡΡΠΎΠ²Π΅Π½Ρ Π·Π°ΡΠΈΡΡ proxy-ΡΠ΅ΡΠ²Π΅ΡΠ°, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΠ°ΠΊΠΎΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½ΠΎ Π±Π΅Π· ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°. ΠΠ΄Π½Π°ΠΊΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°Π»Π΅Π΅ Π·Π°ΠΏΡΠ΅ΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΏΡΠΎΠΊΡΠΈΡΡΠ΅ΠΌΡΠΌ ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌ ΡΠ°ΠΊΠΎΠΉ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²ΠΎΠΉ:
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:
ΠΠ±Π° Π²Π°ΡΠΈΠ°Π½ΡΠ° Π±ΡΠ»ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Ρ, Π²ΡΠ±ΡΠ°Π½ Π²Π°ΡΠΈΠ°Π½Ρ Β«Π±Β» Π·Π° ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΠΎΡΡΡ ΠΈ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡ Ρ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΠΌ http2.
ΠΠ»Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΡΠΎΠΉ Π³ΠΈΠΏΠΎΡΠ΅Π·Ρ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°Π»ΠΎΡΡ Π½Π΅ΠΌΠ°Π»ΠΎ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ² Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠ΅ΠΉ, Π±ΡΠ»ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Ρ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ:
if = require = rewrite
ΠΠΎΠ»ΡΡΠΈΠ»Π°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ°Ρ Π±Π°Π·ΠΎΠ²Π°Ρ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ:
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), ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ:
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>
ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΠΏΠΎΠΊΠ°Π·Π°Π»Π°, ΡΡΠΎ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅ΡΠ΅Π· ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ Π±ΡΠ°ΡΠ·Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ cΠ΅Π±Π΅ Cookie.
3. ΠΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠ΅ΡΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ proxy web-ΡΠ΅ΡΠ²Π΅ΡΠ° (ΡΠΎΠ»ΡΠΊΠΎ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ).
ΠΠ°ΠΊ ΠΌΡ Π²ΡΡΡΠ½ΠΈΠ»ΠΈ ΡΠ°Π½Π΅Π΅, Ρ Apache Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ core-ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΡΠ»ΠΎΠ²Π½ΡΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ. ΠΠ΄Π½Π°ΠΊΠΎ Π½Π°ΠΌ Π½ΡΠΆΠ½Ρ ΡΡΠ΅Π΄ΡΡΠ²Π° Π·Π°ΡΠΈΡΡ Π½Π°ΡΠ΅ΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ, ΠΏΠΎΠΊΠ° ΠΎΠ½Π° Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠΌ Π±ΡΠ°ΡΠ·Π΅ΡΠ΅, ΠΏΠΎΡΡΠΎΠΌΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ, ΡΡΠΎ ΠΈ Π΄Π»Ρ ΡΠ΅Π³ΠΎ Ρ ΡΠ°Π½ΠΈΡΡ, ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π±ΡΠ΄Π΅ΠΌ Π·Π°Π΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ:
- ΠΡΠΆΠ΅Π½ ΡΠ°ΠΊΠΎΠΉ ΡΠΎΠΊΠ΅Π½, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ ΠΏΠΎΠ΄Π΄Π°ΡΡΡΡ ΠΏΡΠΎΡΡΠΎΠΌΡ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
- ΠΡΠΆΠ΅Π½ ΡΠ°ΠΊΠΎΠΉ ΡΠΎΠΊΠ΅Π½, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π·Π°ΡΠΈΡΠΎ ΡΡΡΠ°ΡΠ΅Π²Π°Π½ΠΈΠ΅ ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΡΡΠ°ΡΠ΅Π²Π°Π½ΠΈΡ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅.
- ΠΡΠΆΠ΅Π½ ΡΠ°ΠΊΠΎΠΉ ΡΠΎΠΊΠ΅Π½, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΡΠ²ΡΠ·Π°Π½ Ρ Π²Π»Π°Π΄Π΅Π»ΡΡΠ΅ΠΌ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°.
ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π½ΡΠΆΠ½Π° ΡΡΠ½ΠΊΡΠΈΡ Ρ
Π΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΡΠΎΠ»Ρ ΠΈ Π΄Π°ΡΠ° Π΄Π»Ρ ΡΡΡΠ°ΡΠ΅Π²Π°Π½ΠΈΡ ΡΠΎΠΊΠ΅Π½Π°. ΠΡΡ
ΠΎΠ΄Ρ ΠΈΠ· Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ
ΠΠΎΠ»ΡΡΠΈΠ»Π°ΡΡ ΡΠ°ΠΊΠ°Ρ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ:
#Π½Π΅Ρ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°, ΠΈ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊ 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>
Π¦Π΅Π»Ρ Π΄ΠΎΡΡΠΈΠ³Π½ΡΡΠ°, Π½ΠΎ Π΅ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ ΡΠ΅ΡΠ²Π΅ΡΠ½ΡΠΌ ΡΡΡΠ°ΡΠ΅Π²Π°Π½ΠΈΠ΅ΠΌ (ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Cookie Π³ΠΎΠ΄ΠΈΡΠ½ΠΎΠΉ Π΄Π°Π²Π½ΠΎΡΡΠΈ), Π° Π·Π½Π°ΡΠΈΡ ΡΠΎΠΊΠ΅Π½Ρ, Ρ ΠΎΡΡ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½Ρ Π΄Π»Ρ Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ, Π½ΠΎ Π½Π΅Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½Ρ Π΄Π»Ρ ΠΏΡΠΎΠΌΡΡΠ»Π΅Π½Π½ΠΎΠ³ΠΎ (ΠΌΠ°ΡΡΠΎΠ²ΠΎΠ³ΠΎ).
4. ΠΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠ΅ΡΡΠΈΠΈ-ΡΠΎΠΊΠ΅Π½Ρ ΡΠΆΠ΅ Π±ΡΠ»ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π³ΠΎΡΠΎΠ²ΡΡ
ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ Πpache.
Π‘ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ ΠΎΡΡΠ°Π»Π°ΡΡ ΠΎΠ΄Π½Π° ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° β Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΡΡΡΠ°ΡΠ΅Π²Π°Π½ΠΈΠ΅ ΡΠΎΠΊΠ΅Π½Π°.
ΠΡΠ΅ΠΌ Π³ΠΎΡΠΎΠ²ΡΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ, ΠΏΠΎ ΡΠ»ΠΎΠ²Π°ΠΌ: apache token json two factor auth
Client authentication using tokens based on JSON Web Tokens Apache Two-Factor (2FA) Authentication How to Add Two-Factor Authentication to Apache Bring two-factor authentication to your Apache instance with a simple module install
ΠΠ°, Π³ΠΎΡΠΎΠ²ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ Π΅ΡΡΡ, Π½ΠΎ Π²ΡΠ΅ ΠΏΡΠΈΠ²ΡΠ·Π°Π½Ρ ΠΊ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠΌΠΈ ΠΈ ΠΎΠ±Π»Π°Π΄Π°ΡΡ Π°ΡΡΠ΅ΡΠ°ΠΊΡΠ°ΠΌΠΈ Π² Π²ΠΈΠ΄Π΅ ΡΡΠ°ΡΡΠ° ΡΠ΅ΡΡΠΈΠΈ ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ
Cookie. Π’ΠΎ Π΅ΡΡΡ Π½Π΅ Π½Π° Π²ΡΠ΅ΠΌΡ.
Π£ Π½Π°Ρ ΡΡΠ»ΠΎ ΠΏΡΡΡ ΡΠ°ΡΠΎΠ² Π½Π° ΠΏΠΎΠΈΡΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ Π΄Π°Π» ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°.
5. ΠΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠ΅ΡΡΠΈΠΈ-ΡΠΎΠΊΠ΅Π½Ρ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ, Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈ ΡΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π² ΡΡΡΡΠΊΡΡΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠΉ.
ΠΠΎΡΠΎΠ²ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΡΠ»ΠΎΠΆΠ½Ρ, Π²Π΅Π΄Ρ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠ°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ.
ΠΡΠΈ ΡΡΠΎΠΌ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Ρ Π΄Π°ΡΠΎΠΉ Π² ΡΠΎΠΌ, ΡΡΠΎ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Apache Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π΄Π°ΡΡ ΠΈΠ· Π±ΡΠ΄ΡΡΠ΅Π³ΠΎ, Π° ΠΏΡΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ΅ ΡΡΡΠ°ΡΠ΅Π²Π°Π½ΠΈΡ Π²ΠΎ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΡΡ Π½Π΅Ρ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΠ»ΠΎΠΆΠ΅Π½ΠΈΡ/Π²ΡΡΠΈΡΠ°Π½ΠΈΡ.
Π’ΠΎ Π΅ΡΡΡ Π½Π΅Π»ΡΠ·Ρ Π½Π°ΠΏΠΈΡΠ°ΡΡ:
(%{env:zt-cert-date} + 30) > %{DATE}
ΠΠΎΠΆΠ½ΠΎ ΡΡΠ°Π²Π½ΠΈΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π²Π° ΡΠΈΡΠ»Π°.
ΠΡΠΈ ΠΏΠΎΠΈΡΠΊΠ΅ ΠΎΠ±Ρ
ΠΎΠ΄Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Safari Π½Π°ΡΠ»Π°ΡΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π°Ρ ΡΡΠ°ΡΡΡ:
Π Π½Π΅ΠΉ ΠΎΠΏΠΈΡΠ°Π½ ΠΏΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠ΄Π° Π½Π° Lua Π΄Π»Ρ Nginx, ΠΈ ΠΊΠΎΡΠΎΡΡΠΉ, ΠΊΠ°ΠΊ ΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ, ΠΎΡΠ΅Π½Ρ ΠΏΠΎΠ²ΡΠΎΡΡΠ΅Ρ Π»ΠΎΠ³ΠΈΠΊΡ ΡΠΎΠΉ ΡΠ°ΡΡΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ ΡΠΆΠ΅ ΡΠ°Π½Π΅Π΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ, Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ hmac-ΠΌΠ΅ΡΠΎΠ΄Π° ΡΠ°ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΡΠΎΠ»ΠΈ Π΄Π»Ρ Ρ
Π΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ (ΡΠ°ΠΊΠΎΠ³ΠΎ Π² Apache Π½Π΅ Π½Π°ΡΠ»ΠΎΡΡ).
Π‘ΡΠ°Π»ΠΎ ΠΏΠΎΠ½ΡΡΠ½ΠΎ, ΡΡΠΎ Lua β ΡΡΠΎ ΡΠ·ΡΠΊ, Ρ ΠΏΠΎΠ½ΡΡΠ½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ-ΡΠΎ ΠΏΡΠΎΡΡΠ΅Π½ΡΠΊΠΎΠ΅ ΠΈ Π΄Π»Ρ Apache:
ΠΠ·ΡΡΠΈΠ² ΡΠ°Π·Π½ΠΈΡΡ Ρ Nginx ΠΈ Apache:
Π Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ ΡΠ·ΡΠΊΠ° Lua:
ΠΠ°ΠΉΠ΄Π΅Π½ ΡΠΏΠΎΡΠΎΠ± Π·Π°Π΄Π°Π½ΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ env Π² Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΌ Lua-ΡΠ°ΠΉΠ»Π΅ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π΄Π°ΡΡ ΠΈΠ· Π±ΡΠ΄ΡΡΠ΅Π³ΠΎ Π΄Π»Ρ ΡΠ²Π΅ΡΠΊΠΈ Ρ ΡΠ΅ΠΊΡΡΠ΅ΠΉ.
ΠΠΎΡ ΡΠ°ΠΊ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΏΡΠΎΡΡΠ΅Π½ΡΠΊΠΈΠΉ Lua-ΡΠΊΡΠΈΠΏΡ:
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
Π Π²ΠΎΡ ΡΠ°ΠΊ ΡΡΠΎ Π²ΡΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π² ΡΡΠΌΠΌΠ΅, c ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠ΅ΠΉ ΡΠΈΡΠ»Π° Cookie ΠΈ Π·Π°ΠΌΠ΅Π½ΠΎΠΉ ΡΠΎΠΊΠ΅Π½Π° ΠΏΡΠΈ Π½Π°ΡΡΡΠΏΠ»Π΅Π½ΠΈΠΈ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π΄ΠΎ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠ°ΡΡΡ Cookie (ΡΠΎΠΊΠ΅Π½Π°):
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.
CΡΡΠ»ΠΊΠ° Π½Π° ΠΈΡΡΠΎΡΠ½ΠΈΠΊ
ΠΡΡ ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ.
Π ΡΠ΅Π»ΠΎΠΌ Π½Π΅Π²Π°ΠΆΠ½ΠΎ, Π² ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Πpache (Π²Π΅ΡΠΎΡΡΠ½ΠΎ ΠΈ Nginx) Π½Π°ΠΏΠΈΡΠ°Π½Ρ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π² ΠΈΡΠΎΠ³Π΅ Π²ΡΡ Π±ΡΠ΄Π΅Ρ ΠΎΡΡΠΎΡΡΠΈΡΠΎΠ²Π°Π½ΠΎ ΠΈΡΡ ΠΎΠ΄Ρ ΠΈΠ· ΠΎΡΠ΅ΡΡΠ΄Π½ΠΎΡΡΠΈ ΠΏΡΠΎΡ ΠΎΠΆΠ΄Π΅Π½ΠΈΡ Π·Π°ΠΏΡΠΎΡΠ° ΠΎΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΡΡ Π΅ΠΌΠ΅ Π΄Π»Ρ ΠΎΡΡΠ°Π±ΠΎΡΠΊΠΈ Lua-ΡΠΊΡΠΈΠΏΡΠΎΠ².
ΠΠ°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅:
ΠΠΈΠ΄ΠΈΠΌΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΏΠΎΡΠ»Π΅ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΡ (ΡΠ΅Π»Ρ):
ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌΠΈ ΠΈ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠΎΠΉ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ Ρ ΠΌΠΎΠ±ΠΈΠ»ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅Π»Π΅ΡΠΎΠ½Π° Π½Π° IOS Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ
ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ (VPN), ΡΠ½ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½ΠΎ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ.
Π¦Π΅Π»Ρ Π΄ΠΎΡΡΠΈΠ³Π½ΡΡΠ°, Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΈ ΠΎΠ±Π»Π°Π΄Π°ΡΡ Π½Π΅ ΠΌΠ΅Π½ΡΡΠΈΠΌ ΡΡΠΎΠ²Π½Π΅ΠΌ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ, ΡΠ΅ΠΌ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com