Как ΠΌΡ‹ Π² ZeroTech ΠΏΠΎΠ΄Ρ€ΡƒΠΆΠΈΠ»ΠΈ Apple Safari ΠΈ клиСнтскиС сСртификаты с websocket-Π°ΠΌΠΈ

Π‘Ρ‚Π°Ρ‚ΡŒΡ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π½Π° Ρ‚Π΅ΠΌ, ΠΊΡ‚ΠΎ:

  • Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Client Cert, ΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚ для Ρ‡Π΅Π³ΠΎ Π΅ΠΌΡƒ websocket-Ρ‹ Π½Π° мобильном Safari;
  • Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ ΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ web-сСрвисы ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΌΡƒ ΠΊΡ€ΡƒΠ³Ρƒ Π»ΠΈΡ† ΠΈΠ»ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сСбС;
  • Π΄ΡƒΠΌΠ°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ всё ΡƒΠΆΠ΅ ΠΊΠ΅ΠΌ-Ρ‚ΠΎ сдСлано, ΠΈ Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΌΠΈΡ€ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ ΠΈ бСзопаснСС.

Π˜ΡΡ‚ΠΎΡ€ΠΈΡ Π²Π΅Π±-сокСтов Π½Π°Ρ‡Π°Π»Π°ΡΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 8 Π»Π΅Ρ‚ Π½Π°Π·Π°Π΄. Π Π°Π½Π΅Π΅ использовались ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π²ΠΈΠ΄Π° Π΄ΠΎΠ»Π³ΠΈΡ… http-запросов (Π½Π° самом Π΄Π΅Π»Π΅ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ²): Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ отправлял запрос Π½Π° сСрвСр ΠΈ ΠΆΠ΄Π°Π», ΠΏΠΎΠΊΠ° ΠΎΠ½ Π΅ΠΌΡƒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚, послС ΠΎΡ‚Π²Π΅Ρ‚Π° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π»ΡΡ вновь ΠΈ ΠΆΠ΄Π°Π». Но ΠΏΠΎΡ‚ΠΎΠΌ появились Π²Π΅Π±-сокСты.

Как ΠΌΡ‹ Π² ZeroTech ΠΏΠΎΠ΄Ρ€ΡƒΠΆΠΈΠ»ΠΈ Apple Safari ΠΈ клиСнтскиС сСртификаты с websocket-Π°ΠΌΠΈ

НСсколько Π»Π΅Ρ‚ Π½Π°Π·Π°Π΄ ΠΌΡ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π½Π° чистом php, которая Π½Π΅ ΡƒΠΌΠ΅Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ запросы https, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ это ΠΊΠ°Π½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ. НС Ρ‚Π°ΠΊ Π΄Π°Π²Π½ΠΎ практичСски всС web-сСрвСры Π½Π°ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ ΠΏΡ€ΠΎΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ запросы ΠΏΠΎ https ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ connection:upgrade.

Когда это ΡΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ, Π²Π΅Π±-сокСты стали практичСски сСрвисом ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρƒ SPA-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, вСдь ΠΊΠ°ΠΊ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ ΠΏΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Ρ‚ΠΈΠ²Π΅ сСрвСра (ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ сообщСниС ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈΠ»ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ изобраТСния, Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°, ΠΏΡ€Π΅Π·Π΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ сСйчас ΠΊΡ‚ΠΎ-Ρ‚ΠΎ Π΅Ρ‰Ρ‘ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠ΅Ρ‚).

Π₯отя Π‘lient Π‘ert появился ΡƒΠΆΠ΅ довольно Π΄Π°Π²Π½ΠΎ, ΠΎΠ½ всё Π΅Ρ‰Ρ‘ остаётся ΠΌΠ°Π»ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΌ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ создаёт массу ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ°ΠΌΠΈ Π΅Π³ΠΎ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ. И (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ :slightly_smiling_face: ) поэтому IOS-Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹ (всС, ΠΊΡ€ΠΎΠΌΠ΅ Safari) Π½Π΅ хотят Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ Ρƒ локального Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° сСртификатов. Π‘Π΅Ρ€Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚Ρ‹ ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ массой прСимущСств ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ login/pass ΠΈΠ»ΠΈ ssh ΠΈΠ»ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ΠΌ Ρ‡Π΅Ρ€Π΅Π· firewall Π½ΡƒΠΆΠ½Ρ‹Ρ… ΠΏΠΎΡ€Ρ‚ΠΎΠ². Но Ρ€Π΅Ρ‡ΡŒ Π½Π΅ ΠΎΠ± этом.

На IOS ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° установки сСртификата довольно проста (Π½Π΅ Π±Π΅Π· спСцифики), Π½ΠΎ Π² ΠΎΠ±Ρ‰Π΅ΠΌ дСлаСтся ΠΏΠΎ инструкциям, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π² сСти ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ доступны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π° Safari. К соТалСнию, Safari Π½Π΅ ΡƒΠΌΠ΅Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π‘lient Π‘ert для Π²Π΅Π±-сокСтов, Π½ΠΎ Π² ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅ Π΅ΡΡ‚ΡŒ мноТСство инструкций, ΠΊΠ°ΠΊ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ сСртификат, Π½ΠΎ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ это нСдостиТимо.

Как ΠΌΡ‹ Π² ZeroTech ΠΏΠΎΠ΄Ρ€ΡƒΠΆΠΈΠ»ΠΈ Apple Safari ΠΈ клиСнтскиС сСртификаты с websocket-Π°ΠΌΠΈ

Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² Π²Π΅Π±-сокСтах, ΠΌΡ‹ использовали ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠ»Π°Π½: ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°/Π³ΠΈΠΏΠΎΡ‚Π΅Π·Π°/Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: отсутствуСт ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π²Π΅Π±-сокСтов ΠΏΡ€ΠΈ проксировании запросов ΠΊ рСсурсам, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Ρ‹ клиСнтским сСртификатом Π½Π° мобильном Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ Safari для IOS ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΈ Ρƒ сСбя ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ сСртификатов.

Π“ΠΈΠΏΠΎΡ‚Π΅Π·Ρ‹:

  1. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ для использования сСртификатов (зная, Ρ‡Ρ‚ΠΎ ΠΈΡ… Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚) ΠΊ Π²Π΅Π±-сокСтам Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ…/Π²Π½Π΅ΡˆΠ½ΠΈΡ… проксируСмых рСсурсов.
  2. Для Π²Π΅Π±-сокСтов ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ бСзопасноС ΠΈ Π·Π°Ρ‰ΠΈΡ‰Π°Π΅ΠΌΠΎΠ΅ соСдинСниС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… сСссий, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ (Π½Π΅ Π²Π΅Π±-сокСт) запросС Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°.
  3. Π’Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ сСссии ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ΄Π½ΠΎΠ³ΠΎ proxy web-сСрвСра (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ встроСнныС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ).
  4. Π’Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ сСссии-Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² качСствС Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ apache.
  5. Π’Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ сСссии-Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ, логичСски спроСктировав структуру взаимодСйствий.

Π’ΠΈΠ΄ΠΈΠΌΠΎΠ΅ состояниС послС внСдрСния.

ЦСль Ρ€Π°Π±ΠΎΡ‚Ρ‹: ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ сСрвисами ΠΈ инфраструктурой Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ доступно с мобильного Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π° Π½Π° 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. Или Π² консоли Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°:

Как ΠΌΡ‹ Π² ZeroTech ΠΏΠΎΠ΄Ρ€ΡƒΠΆΠΈΠ»ΠΈ Apple Safari ΠΈ клиСнтскиС сСртификаты с websocket-Π°ΠΌΠΈ

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π³ΠΈΠΏΠΎΡ‚Π΅Π·:

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: Apache Server Client Certificate Authentication

Оба Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Π±Ρ‹Π»ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Ρ‹, Π²Ρ‹Π±Ρ€Π°Π½ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Β«Π±Β» Π·Π° ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠΌ 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), ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ:

Apache Module mod_ssl

Как ΠΌΡ‹ Π² ZeroTech ΠΏΠΎΠ΄Ρ€ΡƒΠΆΠΈΠ»ΠΈ Apple Safari ΠΈ клиСнтскиС сСртификаты с websocket-Π°ΠΌΠΈ

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-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, которая позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ условныС конструкции. Однако Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ срСдства Π·Π°Ρ‰ΠΈΡ‚Ρ‹ нашСй ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, ΠΏΠΎΠΊΠ° ΠΎΠ½Π° находится Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅, поэтому устанавливаСм, Ρ‡Ρ‚ΠΎ ΠΈ для Ρ‡Π΅Π³ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ, ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄Π΅ΠΌ Π·Π°Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ:

  • НуТСн Ρ‚Π°ΠΊΠΎΠΉ Ρ‚ΠΎΠΊΠ΅Π½, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ поддаётся простому Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ.
  • НуТСн Ρ‚Π°ΠΊΠΎΠΉ Ρ‚ΠΎΠΊΠ΅Π½, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π·Π°ΡˆΠΈΡ‚ΠΎ устарСваниС ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ устарСвания Π½Π° сСрвСрС.
  • НуТСн Ρ‚Π°ΠΊΠΎΠΉ Ρ‚ΠΎΠΊΠ΅Π½, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ связан с Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ сСртификата.

Для этого Π½ΡƒΠΆΠ½Π° функция Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ, соль ΠΈ Π΄Π°Ρ‚Π° для устарСвания Ρ‚ΠΎΠΊΠ΅Π½Π°. Π˜ΡΡ…ΠΎΠ΄Ρ ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Expressions in Apache HTTP Server Ρƒ нас Π΅ΡΡ‚ΡŒ всё это ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ 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>

ЦСль достигнута, Π½ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с сСрвСрным устарСваниСм (ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Cookie Π³ΠΎΠ΄ΠΈΡ‡Π½ΠΎΠΉ давности), Π° Π·Π½Π°Ρ‡ΠΈΡ‚ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹, Ρ…ΠΎΡ‚ΡŒ ΠΈ бСзопасны для Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ использования, Π½ΠΎ нСбСзопасны для ΠΏΡ€ΠΎΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΎΠ³ΠΎ (массового).

Как ΠΌΡ‹ Π² ZeroTech ΠΏΠΎΠ΄Ρ€ΡƒΠΆΠΈΠ»ΠΈ Apple Safari ΠΈ клиСнтскиС сСртификаты с websocket-Π°ΠΌΠΈ

4. Π’Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ сСссии-Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² качСствС Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Аpache.

Π‘ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΎΡΡ‚Π°Π»Π°ΡΡŒ ΠΎΠ΄Π½Π° сущСствСнная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° β€” Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ устарСваниС Ρ‚ΠΎΠΊΠ΅Π½Π°.

Π˜Ρ‰Π΅ΠΌ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ это Π΄Π΅Π»Π°Π΅Ρ‚, ΠΏΠΎ словам: apache token json two factor auth

Π”Π°, Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π΅ΡΡ‚ΡŒ, Π½ΠΎ всС привязаны ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ дСйствиями ΠΈ ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Π°ΠΌΠΈ Π² Π²ΠΈΠ΄Π΅ старта сСссии ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Cookie. Π’ΠΎ Π΅ΡΡ‚ΡŒ Π½Π΅ Π½Π° врСмя.
Π£ нас ΡƒΡˆΠ»ΠΎ ΠΏΡΡ‚ΡŒ часов Π½Π° поиск, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ Π΄Π°Π» ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°.

5. Π’Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ сСссии-Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ, логичСски спроСктировав структуру взаимодСйствий.

Π“ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ слишком слоТны, вСдь Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ°Ρ€Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

ΠŸΡ€ΠΈ этом ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с Π΄Π°Ρ‚ΠΎΠΉ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Apache Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Ρ‚Ρƒ ΠΈΠ· Π±ΡƒΠ΄ΡƒΡ‰Π΅Π³ΠΎ, Π° ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ устарСвания Π²ΠΎ встроСнных функциях Π½Π΅Ρ‚ матСматичСского слоТСния/вычитания.

Π’ΠΎ Π΅ΡΡ‚ΡŒ нСльзя Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ:

(%{env:zt-cert-date} + 30) > %{DATE}

МоТно ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π° числа.

ΠŸΡ€ΠΈ поискС ΠΎΠ±Ρ…ΠΎΠ΄Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Safari нашлась интСрСсная ΡΡ‚Π°Ρ‚ΡŒΡ: Securing HomeAssistant with client certificates (works with Safari/iOS)
Π’ Π½Π΅ΠΉ описан ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° Π½Π° Lua для Nginx, ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, ΠΊΠ°ΠΊ оказалось, ΠΎΡ‡Π΅Π½ΡŒ повторяСт Π»ΠΎΠ³ΠΈΠΊΡƒ Ρ‚ΠΎΠΉ части ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΡƒΠΆΠ΅ Ρ€Π°Π½Π΅Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ использования hmac-ΠΌΠ΅Ρ‚ΠΎΠ΄Π° расстановки соли для Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ (Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π² Apache Π½Π΅ нашлось).

Π‘Ρ‚Π°Π»ΠΎ понятно, Ρ‡Ρ‚ΠΎ Lua β€” это язык, с понятной Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΡ€ΠΎΡΡ‚Π΅Π½ΡŒΠΊΠΎΠ΅ ΠΈ для Apache:

Π˜Π·ΡƒΡ‡ΠΈΠ² Ρ€Π°Π·Π½ΠΈΡ†Ρƒ с Nginx ΠΈ Apache:

И доступныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΡ‚ производитСля языка Lua:
22.1 – Date and Time

НайдСн способ задания ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… 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.

Как ΠΌΡ‹ Π² ZeroTech ΠΏΠΎΠ΄Ρ€ΡƒΠΆΠΈΠ»ΠΈ Apple Safari ΠΈ клиСнтскиС сСртификаты с websocket-Π°ΠΌΠΈ

Cсылка Π½Π° источник изобраТСния.

Π•Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ‚.

Π’ Ρ†Π΅Π»ΠΎΠΌ Π½Π΅Π²Π°ΠΆΠ½ΠΎ, Π² ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Аpache (вСроятно ΠΈ Nginx) написаны Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² ΠΈΡ‚ΠΎΠ³Π΅ всё Π±ΡƒΠ΄Π΅Ρ‚ отсортировано исходя ΠΈΠ· очСрёдности прохоТдСния запроса ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ соотвСтствуСт схСмС для ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Lua-скриптов.

Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅:

Π’ΠΈΠ΄ΠΈΠΌΠΎΠ΅ состояниС послС внСдрСния (Ρ†Π΅Π»ΡŒ):
ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ сСрвисами ΠΈ инфраструктурой доступно с мобильного Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π° Π½Π° IOS Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ (VPN), ΡƒΠ½ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ ΠΈ бСзопасно.

ЦСль достигнута, Π²Π΅Π±-сокСты Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΈ ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ Π½Π΅ мСньшим ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ бСзопасности, Ρ‡Π΅ΠΌ сСртификат.

Как ΠΌΡ‹ Π² ZeroTech ΠΏΠΎΠ΄Ρ€ΡƒΠΆΠΈΠ»ΠΈ Apple Safari ΠΈ клиСнтскиС сСртификаты с websocket-Π°ΠΌΠΈ

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ