Π‘ΡΠ°ΡΠΈΡΡΠ° ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΠΎΠ»Π΅Π·Π½Π° Π·Π° ΡΠ΅Π·ΠΈ, ΠΊΠΎΠΈΡΠΎ:
- Π·Π½Π°Π΅ ΠΊΠ°ΠΊΠ²ΠΎ Π΅ Client Cert ΠΈ ΡΠ°Π·Π±ΠΈΡΠ° Π·Π°ΡΠΎ ΠΈΠΌΠ° Π½ΡΠΆΠ΄Π° ΠΎΡ websockets Π½Π° ΠΌΠΎΠ±ΠΈΠ»Π½ΠΎ Safari;
- ΠΠΈΡ ΠΈΡΠΊΠ°Π» Π΄Π° ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°ΠΌ ΡΠ΅Π± ΡΡΠ»ΡΠ³ΠΈ Π·Π° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ ΠΊΡΡΠ³ Ρ ΠΎΡΠ° ΠΈΠ»ΠΈ ΡΠ°ΠΌΠΎ Π·Π° ΡΠ΅Π±Π΅ ΡΠΈ;
- ΡΠΌΡΡΠ°, ΡΠ΅ Π²ΡΠΈΡΠΊΠΎ Π²Π΅ΡΠ΅ Π΅ Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΎ ΠΎΡ Π½ΡΠΊΠΎΠΉ ΠΈ Π±ΠΈ ΠΈΡΠΊΠ°Π» Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈ ΡΠ²Π΅ΡΠ° ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-ΡΠ΄ΠΎΠ±Π΅Π½ ΠΈ ΠΏΠΎ-Π±Π΅Π·ΠΎΠΏΠ°ΡΠ΅Π½.
ΠΡΡΠΎΡΠΈΡΡΠ° Π½Π° websockets Π·Π°ΠΏΠΎΡΠ²Π° ΠΏΡΠ΅Π΄ΠΈ ΠΎΠΊΠΎΠ»ΠΎ 8 Π³ΠΎΠ΄ΠΈΠ½ΠΈ. ΠΡΠ΅Π΄ΠΈ ΡΠΎΠ²Π° ΠΌΠ΅ΡΠΎΠ΄ΠΈΡΠ΅ Π±ΡΡ
Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° Π΄ΡΠ»Π³ΠΈ http Π·Π°ΡΠ²ΠΊΠΈ (Π²ΡΡΡΠ½ΠΎΡΡ ΠΎΡΠ³ΠΎΠ²ΠΎΡΠΈ): Π±ΡΠ°ΡΠ·ΡΡΡΡ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ ΠΈΠ·ΠΏΡΠ°ΡΠΈ Π·Π°ΡΠ²ΠΊΠ° Π΄ΠΎ ΡΡΡΠ²ΡΡΠ° ΠΈ ΠΈΠ·ΡΠ°ΠΊΠ° ΡΠΎΠΉ Π΄Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡΠΈ Π½Π΅ΡΠΎ, ΡΠ»Π΅Π΄ ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ° ΡΠ΅ ΡΠ²ΡΡΠ·Π° ΠΎΡΠ½ΠΎΠ²ΠΎ ΠΈ ΠΈΠ·ΡΠ°ΠΊΠ°. ΠΠΎ ΡΠΎΠ³Π°Π²Π° ΡΠ΅ ΠΏΠΎΡΠ²ΠΈΡ
Π° websockets.
ΠΡΠ΅Π΄ΠΈ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΈΡ
ΠΌΠ΅ Π½Π°ΡΠ° ΡΠΎΠ±ΡΡΠ²Π΅Π½Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π² ΡΠΈΡΡ PHP, ΠΊΠΎΡΡΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° https Π·Π°ΡΠ²ΠΊΠΈ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠΎΠ²Π° Π΅ ΡΠ»ΠΎΡΡ Π·Π° Π²ΡΡΠ·ΠΊΠΈ. ΠΠ΅ΠΎΡΠ΄Π°Π²Π½Π° ΠΏΠΎΡΡΠΈ Π²ΡΠΈΡΠΊΠΈ ΡΠ΅Π± ΡΡΡΠ²ΡΡΠΈ ΡΠ΅ Π½Π°ΡΡΠΈΡ
Π° Π΄Π° ΠΏΡΠΎΠΊΡΠΈ Π·Π°ΡΠ²ΠΊΠΈ ΠΏΡΠ΅Π· https ΠΈ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Ρ Π²ΡΡΠ·ΠΊΠ°: Π½Π°Π΄ΡΡΡΠΎΠΉΠΊΠ°.
ΠΠΎΠ³Π°ΡΠΎ ΡΠΎΠ²Π° ΡΠ΅ ΡΠ»ΡΡΠΈ, websockets ΡΡΠ°Π½Π° ΠΏΠΎΡΡΠΈ ΡΡΠ»ΡΠ³Π°ΡΠ° ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ Π·Π° SPA ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π·Π°ΡΠΎΡΠΎ ΠΊΠΎΠ»ΠΊΠΎ ΡΠ΄ΠΎΠ±Π½ΠΎ Π΅ Π΄Π° ΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈ ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ ΠΏΠΎ ΠΈΠ½ΠΈΡΠΈΠ°ΡΠΈΠ²Π° Π½Π° ΡΡΡΠ²ΡΡΠ° (ΠΏΡΠ΅Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΡ Π΄ΡΡΠ³ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π» ΠΈΠ»ΠΈ ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅ Π½Π° Π½ΠΎΠ²Π° Π²Π΅ΡΡΠΈΡ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ, ΠΏΡΠ΅Π·Π΅Π½ΡΠ°ΡΠΈΡ ΡΠ΅ Π½ΡΠΊΠΎΠΉ Π΄ΡΡΠ³ Π² ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠ°) .
ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΡΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π° ΠΎΡ Π΄ΠΎΡΡΠ° Π²ΡΠ΅ΠΌΠ΅, ΡΠΎΠΉ Π²ΡΠ΅ ΠΎΡΠ΅ ΠΎΡΡΠ°Π²Π° ΡΠ»Π°Π±ΠΎ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΡΠ·Π΄Π°Π²Π° ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΅ ΠΎΠΏΠΈΡΠ²Π°ΡΠ΅ Π΄Π° Π³ΠΎ Π·Π°ΠΎΠ±ΠΈΠΊΠΎΠ»ΠΈΡΠ΅. Π (Π²Π΅ΡΠΎΡΡΠ½ΠΎ :slightly_smiling_face: ) Π·Π°ΡΠΎΠ²Π° Π±ΡΠ°ΡΠ·ΡΡΠΈΡΠ΅ Π½Π° IOS (Π²ΡΠΈΡΠΊΠΈ Ρ ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° Safari) Π½Π΅ ΠΈΡΠΊΠ°Ρ Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΈ Π³ΠΎ ΠΈΠ·ΠΈΡΠΊΠ²Π°Ρ ΠΎΡ Π»ΠΎΠΊΠ°Π»Π½ΠΎΡΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π·Π° ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΈ. Π‘Π΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΠ΅ ΠΈΠΌΠ°Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π° Π² ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Ρ login/pass ΠΈΠ»ΠΈ ssh ΠΊΠ»ΡΡΠΎΠ²Π΅ΡΠ΅ ΠΈΠ»ΠΈ Π·Π°ΡΠ²Π°ΡΡΠ½Π΅ΡΠΎ Π½Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΠΏΠΎΡΡΠΎΠ²Π΅ ΠΏΡΠ΅Π· Π·Π°ΡΠΈΡΠ½Π° ΡΡΠ΅Π½Π°. ΠΠΎ Π½Π΅ ΡΡΠ°Π²Π° Π²ΡΠΏΡΠΎΡ Π·Π° ΡΠΎΠ²Π°.
Π iOS ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ°ΡΠ° Π·Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ Π΅ Π΄ΠΎΡΡΠ° ΠΏΡΠΎΡΡΠ° (Π½Π΅ Π±Π΅Π· ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠΈ), Π½ΠΎ ΠΊΠ°ΡΠΎ ΡΡΠ»ΠΎ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΡΠΏΠΎΡΠ΅Π΄ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈΡΠ΅, ΠΎΡ ΠΊΠΎΠΈΡΠΎ ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ Π² ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ ΠΈ ΠΊΠΎΠΈΡΠΎ ΡΠ° Π΄ΠΎΡΡΡΠΏΠ½ΠΈ ΡΠ°ΠΌΠΎ Π·Π° Π±ΡΠ°ΡΠ·ΡΡΠ° Safari. ΠΠ° ΡΡΠΆΠ°Π»Π΅Π½ΠΈΠ΅ Safari Π½Π΅ Π·Π½Π°Π΅ ΠΊΠ°ΠΊ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Client Π‘ert Π·Π° ΡΠ΅Π± ΡΠΎΠΊΠ΅ΡΠΈ, Π½ΠΎ Π² ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΊΠ°ΠΊ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ ΡΠ°ΠΊΡΠ² ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ, Π½ΠΎ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ° ΡΠΎΠ²Π° Π΅ Π½Π΅ΠΏΠΎΡΡΠΈΠΆΠΈΠΌΠΎ.
ΠΠ° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ websockets, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ
ΠΌΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡ ΠΏΠ»Π°Π½: ΠΏΡΠΎΠ±Π»Π΅ΠΌ/Ρ
ΠΈΠΏΠΎΡΠ΅Π·Π°/ΡΠ΅ΡΠ΅Π½ΠΈΠ΅.
ΠΡΠΎΠ±Π»Π΅ΠΌ: Π½ΡΠΌΠ° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π·Π° ΡΠ΅Π± ΡΠΎΠΊΠ΅ΡΠΈ ΠΏΡΠΈ ΠΏΡΠΎΠΊΡΠΈ Π·Π°ΡΠ²ΠΊΠΈ ΠΊΡΠΌ ΡΠ΅ΡΡΡΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ° Π·Π°ΡΠΈΡΠ΅Π½ΠΈ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ Π² ΠΌΠΎΠ±ΠΈΠ»Π½ΠΈΡ Π±ΡΠ°ΡΠ·ΡΡ Safari Π·Π° IOS ΠΈ Π΄ΡΡΠ³ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΊΠΎΠΈΡΠΎ ΡΠ° Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π»ΠΈ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΈ.
Π₯ΠΈΠΏΠΎΡΠ΅Π·ΠΈ:
- ΠΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ° ΡΠ°ΠΊΠΎΠ²Π° ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΈ (ΠΊΠ°ΡΠΎ ΡΠ΅ Π·Π½Π°Π΅, ΡΠ΅ Π½ΡΠΌΠ° Π΄Π° ΠΈΠΌΠ°) Π·Π° ΡΠ΅Π± ΡΠΎΠΊΠ΅ΡΠΈ Π½Π° Π²ΡΡΡΠ΅ΡΠ½ΠΈ/Π²ΡΠ½ΡΠ½ΠΈ ΠΏΡΠΎΠΊΡΠΈ ΡΠ΅ΡΡΡΡΠΈ.
- ΠΠ° websockets ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠ½ΠΈΠΊΠ°Π»Π½Π°, ΡΠΈΠ³ΡΡΠ½Π° ΠΈ Π·Π°ΡΠΈΡΠΈΠΌΠ° Π²ΡΡΠ·ΠΊΠ°, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΈ ΡΠ΅ΡΠΈΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°Ρ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° Π½ΠΎΡΠΌΠ°Π»Π½Π° (Π½Π΅-websocket) Π·Π°ΡΠ²ΠΊΠ° Π½Π° Π±ΡΠ°ΡΠ·ΡΡ.
- ΠΡΠ΅ΠΌΠ΅Π½Π½ΠΈ ΡΠ΅ΡΠΈΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Π΅Π΄ΠΈΠ½ ΠΏΡΠΎΠΊΡΠΈ ΡΠ΅Π± ΡΡΡΠ²ΡΡ (ΡΠ°ΠΌΠΎ Π²Π³ΡΠ°Π΄Π΅Π½ΠΈ ΠΌΠΎΠ΄ΡΠ»ΠΈ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ).
- ΠΡΠ΅ΠΌΠ΅Π½Π½ΠΈΡΠ΅ ΡΠΎΠΊΠ΅Π½ΠΈ Π·Π° ΡΠ΅ΡΠΈΠΈ Π²Π΅ΡΠ΅ ΡΠ° Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈ ΠΊΠ°ΡΠΎ Π³ΠΎΡΠΎΠ²ΠΈ ΠΌΠΎΠ΄ΡΠ»ΠΈ Π½Π° 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>
ΠΏΡΠΎΠΌΡΠ½Π° Π½Π° Π½ΠΈΠ²ΠΎΡΠΎ Π½Π° Π΄ΠΎΡΡΡΠΏ.
Π’ΠΎΠ·ΠΈ ΠΌΠ΅ΡΠΎΠ΄ ΠΈΠΌΠ° ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π½ΡΠ°Π½ΡΠΈ:
- ΠΡΠΎΠ²Π΅ΡΠΊΠ°ΡΠ° Π½Π° ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΡΠ»Π΅Π΄ Π·Π°ΡΠ²ΠΊΠ° ΠΊΡΠΌ ΠΏΡΠΎΠΊΡΠΈ ΡΠ΅ΡΡΡΡΠ°, Ρ.Π΅. ΡΡΠΊΠΎΡΡΠΈΡΠΊΠ°Π½Π΅ ΡΠ»Π΅Π΄ Π·Π°ΡΠ²ΠΊΠ°. Π’ΠΎΠ²Π° ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ ΠΏΡΠΎΠΊΡΠΈΡΠΎ ΠΏΡΡΠ²ΠΎ ΡΠ΅ Π·Π°ΡΠ΅Π΄ΠΈ ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΠΏΡΠ΅ΠΊΡΡΠ½Π΅ Π·Π°ΡΠ²ΠΊΠ°ΡΠ° ΠΊΡΠΌ Π·Π°ΡΠΈΡΠ΅Π½Π°ΡΠ° ΡΡΠ»ΡΠ³Π°. Π’ΠΎΠ²Π° Π΅ Π»ΠΎΡΠΎ, Π½ΠΎ Π½Π΅ ΠΊΡΠΈΡΠΈΡΠ½ΠΎ;
- Π ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° http2. ΠΡΠ΅ ΠΎΡΠ΅ Π΅ Π² ΡΠ΅ΡΠ½ΠΎΠ²Π° ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΠΈΡΠ΅ Π½Π° Π±ΡΠ°ΡΠ·ΡΡΠΈ Π½Π΅ Π·Π½Π°ΡΡ ΠΊΠ°ΠΊ Π΄Π° Π³ΠΎ Π²Π½Π΅Π΄ΡΡΡ #info about tls1.3 http2 post handshake (Π½Π΅ ΡΠ°Π±ΠΎΡΠΈ ΡΠ΅Π³Π°)
ΠΠ½Π΅Π΄ΡΠ΅ΡΠ΅ RFC 8740 βΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° TLS 1.3 Ρ HTTP/2β ; - ΠΠ΅ Π΅ ΡΡΠ½ΠΎ ΠΊΠ°ΠΊ Π΄Π° ΡΠ΅ ΠΎΠ±Π΅Π΄ΠΈΠ½ΠΈ ΡΠ°Π·ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°.
b) ΠΠ° ΠΎΡΠ½ΠΎΠ²Π½ΠΎ Π½ΠΈΠ²ΠΎ ΡΠ°Π·ΡΠ΅ΡΠ΅ΡΠ΅ 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"
ΠΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π² ΡΡΠ°ΡΠΈΡΡΠ° Π·Π° ssl:
Π Π΄Π²Π΅ΡΠ΅ ΠΎΠΏΡΠΈΠΈ Π±ΡΡ Π° ΡΠ΅ΡΡΠ²Π°Π½ΠΈ, ΠΎΠΏΡΠΈΡ βbβ Π±Π΅ΡΠ΅ ΠΈΠ·Π±ΡΠ°Π½Π° ΠΏΠΎΡΠ°Π΄ΠΈ ΡΠ²ΠΎΡΡΠ° Π³ΡΠ²ΠΊΠ°Π²ΠΎΡΡ ΠΈ ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡ Ρ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° http2.
ΠΠ° Π΄Π° Π·Π°Π²ΡΡΡΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°ΡΠ° Π½Π° ΡΠ°Π·ΠΈ Ρ ΠΈΠΏΠΎΡΠ΅Π·Π°, Π±ΡΡ Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈ Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°; Π±ΡΡ Π° ΡΠ΅ΡΡΠ²Π°Π½ΠΈ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈ:
if = ΠΈΠ·ΠΈΡΠΊΠ²Π°Π½Π΅ = ΠΏΡΠ΅Π½Π°ΠΏΠΈΡΠ²Π°Π½Π΅
Π Π΅Π·ΡΠ»ΡΠ°ΡΡΡ Π΅ ΡΠ»Π΅Π΄Π½ΠΈΡΡ ΠΎΡΠ½ΠΎΠ²Π΅Π½ Π΄ΠΈΠ·Π°ΠΉΠ½:
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. ΠΠ° websockets ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠ½ΠΈΠΊΠ°Π»Π½Π°, ΡΠΈΠ³ΡΡΠ½Π° ΠΈ Π·Π°ΡΠΈΡΠ΅Π½Π° Π²ΡΡΠ·ΠΊΠ°, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΈ ΡΠ΅ΡΠΈΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°Ρ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° Π½ΠΎΡΠΌΠ°Π»Π½Π° (Π±Π΅Π· websocket) Π·Π°ΡΠ²ΠΊΠ° Π½Π° Π±ΡΠ°ΡΠ·ΡΡ.
ΠΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΠΏΡΠ΅Π΄ΠΈΡΠ΅Π½ ΠΎΠΏΠΈΡ, ΡΡΡΠ±Π²Π° Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π΅Π½ ΡΠ°Π·Π΄Π΅Π» ΠΊΡΠΌ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°, Π·Π° Π΄Π° ΠΏΠΎΠ΄Π³ΠΎΡΠ²ΠΈΡΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΈ ΡΠΎΠΊΠ΅Π½ΠΈ Π·Π° Π²ΡΡΠ·ΠΊΠΈ ΠΊΡΠΌ ΡΠ΅Π± ΡΠΎΠΊΠ΅Ρ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½Π° Π·Π°ΡΠ²ΠΊΠ° (Π½Π΅-ΡΠ΅Π± ΡΠΎΠΊΠ΅Ρ).
#ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° ΡΠ΅Π±Π΅ Π‘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. ΠΡΠ΅ΠΌΠ΅Π½Π½ΠΈ ΡΠ΅ΡΠΈΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Π΅Π΄ΠΈΠ½ ΠΏΡΠΎΠΊΡΠΈ ΡΠ΅Π± ΡΡΡΠ²ΡΡ (ΡΠ°ΠΌΠΎ Π²Π³ΡΠ°Π΄Π΅Π½ΠΈ ΠΌΠΎΠ΄ΡΠ»ΠΈ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ).
ΠΠ°ΠΊΡΠΎ ΡΠ°Π·Π±ΡΠ°Ρ ΠΌΠ΅ ΠΏΠΎ-ΡΠ°Π½ΠΎ, Apache ΠΈΠΌΠ° Π΄ΠΎΡΡΠ° ΠΎΡΠ½ΠΎΠ²Π½Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ, ΠΊΠΎΡΡΠΎ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΡΠ·Π΄Π°Π²Π°ΡΠ΅ ΡΡΠ»ΠΎΠ²Π½ΠΈ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ. ΠΠΈΠ΅ ΠΎΠ±Π°ΡΠ΅ ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ΠΌ ΠΎΡ ΡΡΠ΅Π΄ΡΡΠ²Π° Π·Π° Π·Π°ΡΠΈΡΠ° Π½Π° Π½Π°ΡΠ°ΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, Π΄ΠΎΠΊΠ°ΡΠΎ Π΅ Π² Π±ΡΠ°ΡΠ·ΡΡΠ° Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ, ΡΠ°ΠΊΠ° ΡΠ΅ Π½ΠΈΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠΌΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ Π΄Π° ΡΡΡ ΡΠ°Π½ΡΠ²Π°ΠΌΠ΅ ΠΈ Π·Π°ΡΠΎ ΠΈ ΠΊΠ°ΠΊΠ²ΠΈ Π²Π³ΡΠ°Π΄Π΅Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅:
- ΠΠΌΠ°ΠΌΠ΅ Π½ΡΠΆΠ΄Π° ΠΎΡ ΡΠΎΠΊΠ΅Π½, ΠΊΠΎΠΉΡΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π»Π΅ΡΠ½ΠΎ Π΄Π° Π±ΡΠ΄Π΅ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°Π½.
- ΠΠΌΠ°ΠΌΠ΅ Π½ΡΠΆΠ΄Π° ΠΎΡ ΡΠΎΠΊΠ΅Π½, ΠΊΠΎΠΉΡΠΎ ΠΈΠΌΠ° Π²Π³ΡΠ°Π΄Π΅Π½ΠΎ ΠΎΡΡΠ°ΡΡΠ²Π°Π½Π΅ ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΠΎΡΡΠ°ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΡΠ²ΡΡΠ°.
- ΠΠΌΠ°ΠΌΠ΅ Π½ΡΠΆΠ΄Π° ΠΎΡ ΡΠΎΠΊΠ΅Π½, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ Π±ΡΠ΄Π΅ ΡΠ²ΡΡΠ·Π°Π½ ΡΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈΠΊΠ° Π½Π° ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°.
Π’ΠΎΠ²Π° ΠΈΠ·ΠΈΡΠΊΠ²Π° ΡΡΠ½ΠΊΡΠΈΡ Π·Π° Ρ
Π΅ΡΠΈΡΠ°Π½Π΅, ΡΠΎΠ» ΠΈ Π΄Π°ΡΠ° Π·Π° ΡΡΠ°ΡΠ΅Π΅Π½Π΅ Π½Π° ΡΠΎΠΊΠ΅Π½Π°. ΠΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ°
Π Π΅Π·ΡΠ»ΡΠ°ΡΡΡ Π±Π΅ΡΠ΅ ΡΠΎΠ·ΠΈ Π΄ΠΈΠ·Π°ΠΉΠ½:
#Π½Π΅Ρ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°, ΠΈ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊ 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>
Π¦Π΅Π»ΡΠ° Π΅ ΠΏΠΎΡΡΠΈΠ³Π½Π°ΡΠ°, Π½ΠΎ ΠΈΠΌΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Ρ ΠΎΡΡΠ°ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΡΠ²ΡΡΠ° (ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Π³ΠΎΠ΄ΠΈΡΠ½Π° Π±ΠΈΡΠΊΠ²ΠΈΡΠΊΠ°), ΠΊΠΎΠ΅ΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ ΡΠΎΠΊΠ΅Π½ΠΈΡΠ΅, Π²ΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ ΡΠ° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΈ Π·Π° Π²ΡΡΡΠ΅ΡΠ½Π° ΡΠΏΠΎΡΡΠ΅Π±Π°, Π½Π΅ ΡΠ° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΈ Π·Π° ΠΈΠ½Π΄ΡΡΡΡΠΈΠ°Π»Π½Π° (ΠΌΠ°ΡΠΎΠ²Π°) ΡΠΏΠΎΡΡΠ΅Π±Π°.
4. ΠΡΠ΅ΠΌΠ΅Π½Π½ΠΈΡΠ΅ ΡΠΎΠΊΠ΅Π½ΠΈ Π·Π° ΡΠ΅ΡΠΈΠΈ Π²Π΅ΡΠ΅ ΡΠ° Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈ ΠΊΠ°ΡΠΎ Π³ΠΎΡΠΎΠ²ΠΈ ΠΌΠΎΠ΄ΡΠ»ΠΈ Π½Π° Apache.
ΠΠ΄ΠΈΠ½ ΡΡΡΠ΅ΡΡΠ²Π΅Π½ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΎΡΡΠ°Π½Π° ΠΎΡ ΠΏΡΠ΅Π΄ΠΈΡΠ½Π°ΡΠ° ΠΈΡΠ΅ΡΠ°ΡΠΈΡ - Π½Π΅Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π΄Π° ΡΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ° ΡΡΠ°ΡΠ΅Π΅Π½Π΅ΡΠΎ Π½Π° ΡΠΎΠΊΠ΅Π½Π°.
Π’ΡΡΡΠΈΠΌ Π³ΠΎΡΠΎΠ² ΠΌΠΎΠ΄ΡΠ», ΠΊΠΎΠΉΡΠΎ ΠΏΡΠ°Π²ΠΈ ΡΠΎΠ²Π°, ΡΠΏΠΎΡΠ΅Π΄ Π΄ΡΠΌΠΈΡΠ΅: apache token json two factor auth
Π£Π΄ΠΎΡΡΠΎΠ²Π΅ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΠΎΠΊΠ΅Π½ΠΈ, Π±Π°Π·ΠΈΡΠ°Π½ΠΈ Π½Π° JSON ΡΠ΅Π± ΡΠΎΠΊΠ΅Π½ΠΈ Apache Π΄Π²ΡΡΠ°ΠΊΡΠΎΡΠ½ΠΎ (2FA) ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΡΠ²Π°Π½Π΅ ΠΠ°ΠΊ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ Π΄Π²ΡΡΠ°ΠΊΡΠΎΡΠ½ΠΎ ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΡΠ²Π°Π½Π΅ ΠΊΡΠΌ Apache ΠΠ½Π΅ΡΠ΅ΡΠ΅ Π΄Π²ΡΡΠ°ΠΊΡΠΎΡΠ½ΠΎ ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΡΠ²Π°Π½Π΅ Π½Π° Π²Π°ΡΠ΅ΡΠΎ ΠΊΠΎΠΏΠΈΠ΅ Π½Π° Apache Ρ ΠΏΡΠΎΡΡΠ° ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡ Π½Π° ΠΌΠΎΠ΄ΡΠ»
ΠΠ°, ΠΈΠΌΠ° Π³ΠΎΡΠΎΠ²ΠΈ ΠΌΠΎΠ΄ΡΠ»ΠΈ, Π½ΠΎ Π²ΡΠΈΡΠΊΠΈ ΡΠ΅ ΡΠ° ΠΎΠ±Π²ΡΡΠ·Π°Π½ΠΈ Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΈ ΠΈΠΌΠ°Ρ Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΈ ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ΅ΡΠΈΡ ΠΈ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ Π±ΠΈΡΠΊΠ²ΠΈΡΠΊΠΈ. Π’ΠΎΠ΅ΡΡ Π½Π΅ Π·Π° ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅.
ΠΡΠ½Π΅ Π½ΠΈ ΠΏΠ΅Ρ ΡΠ°ΡΠ° ΡΡΡΡΠ΅Π½Π΅, ΠΊΠΎΠ΅ΡΠΎ Π½Π΅ Π΄Π°Π΄Π΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ΅Π½ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ.
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
Π Π΅ΡΠΎ ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠΈ Π²ΡΠΈΡΠΊΠΎ ΠΎΠ±ΡΠΎ, Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° Π±ΡΠΎΡ Π±ΠΈΡΠΊΠ²ΠΈΡΠΊΠΈ ΠΈ ΠΏΠΎΠ΄ΠΌΡΠ½Π° Π½Π° ΡΠΎΠΊΠ΅Π½Π°, ΠΊΠΎΠ³Π°ΡΠΎ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π°ΡΠ° ΠΎΡ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π½Π°ΡΡΡΠΏΠΈ ΠΏΡΠ΅Π΄ΠΈ ΠΈΠ·ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΡΠ°ΡΠ°ΡΠ° Π±ΠΈΡΠΊΠ²ΠΈΡΠΊΠ° (ΡΠΎΠΊΠ΅Π½):
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.
ΠΡΡΠ·ΠΊΠ° ΠΊΡΠΌ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊΠ°
ΠΡΡΠ³ Π²Π°ΠΆΠ΅Π½ ΠΌΠΎΠΌΠ΅Π½Ρ.
ΠΠ°ΡΠΎ ΡΡΠ»ΠΎ Π½ΡΠΌΠ° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² ΠΊΠ°ΠΊΡΠ² ΡΠ΅Π΄ ΡΠ° Π½Π°ΠΏΠΈΡΠ°Π½ΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²ΠΈΡΠ΅ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π½Π° Apache (Π²Π΅ΡΠΎΡΡΠ½ΠΎ ΠΈ Nginx), ΡΡΠΉ ΠΊΠ°ΡΠΎ Π² ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ° Π²ΡΠΈΡΠΊΠΎ ΡΠ΅ Π±ΡΠ΄Π΅ ΡΠΎΡΡΠΈΡΠ°Π½ΠΎ Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΡΠ΅Π΄Π° Π½Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ° ΠΎΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ, ΠΊΠΎΠΉΡΠΎ ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²Π° Π½Π° ΡΡ Π΅ΠΌΠ°ΡΠ° Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Lua ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅.
ΠΠ°Π²ΡΡΡΠ²Π°Π½Π΅:
ΠΠΈΠ΄ΠΈΠΌΠΎ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠ»Π΅Π΄ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ (ΡΠ΅Π»):
ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΡΠ»ΡΠ³ΠΈΡΠ΅ ΠΈ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° Π΅ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ ΠΎΡ ΠΌΠΎΠ±ΠΈΠ»Π΅Π½ ΡΠ΅Π»Π΅ΡΠΎΠ½ Π½Π° IOS Π±Π΅Π· Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ (VPN), ΡΠ½ΠΈΡΠΈΡΠΈΡΠ°Π½ΠΎ ΠΈ ΡΠΈΠ³ΡΡΠ½ΠΎ.
Π¦Π΅Π»ΡΠ° Π΅ ΠΏΠΎΡΡΠΈΠ³Π½Π°ΡΠ°, ΡΠ΅Π± ΡΠΎΠΊΠ΅ΡΠΈΡΠ΅ ΡΠ°Π±ΠΎΡΡΡ ΠΈ ΠΈΠΌΠ°Ρ Π½ΠΈΠ²ΠΎ Π½Π° ΡΠΈΠ³ΡΡΠ½ΠΎΡΡ Π½Π΅ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ ΠΎΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com