fix(sf): ekb_geoportal_client verify=False — росс-гос-CA не в trust-store контейнера (#1067) #1103

Merged
bot-reviewer merged 1 commit from fix/1067-ekb-geoportal-tls-verify into main 2026-06-06 20:10:27 +00:00
Owner

Latent bug — геопортал-клиент падал TLS из контейнера

Поймано при подготовке #1085 (probe реального клиента с прода):

EKBGeoportalClient().zone_index_at(60.6107, 56.8391)
→ ConnectError [SSL: CERTIFICATE_VERIFY_FAILED] unable to get local issuer certificate

Геопортал ЕКБ отдаёт TLS-цепочку с корневым российским гос-УЦ, которого нет в trust-store наших контейнеров (та же история, что у НСПД). ekb_geoportal_client.py (#1083) использовал httpx с verify=True по умолчанию → весь geoportal-интеграционный слой не работал бы с прода:

  • C8b get_or_fetch_zone_regulation (#1099)
  • D9b functional_zone / krt / zone_regulation в analyze (#1101)
  • будущий #1085 harvest

Всё gated default-off, поэтому прод сейчас не сломан — но при включении флага вернулись бы пустые блоки (graceful-swallow прятал бы TLS-ошибку в warning).

Фикс

_http_get_json / _http_post_jsonverify=False (module-const _VERIFY_TLS).

  • Данные публичные open-data (ПЗЗ/ППТ/КРТ), секреты не передаются → MITM-риск незначим.
  • Прецедент в проекте: nspd_lite._SSL_CTX = ssl._create_unverified_context() для тех же росс-гос-эндпоинтов.

Валидация

  • Прод-probe пропатченного пути (контейнер gendesign-backend-1, httpx 0.28.1): verify=False → WFS вернул urban_index="Ц-1" verify=TrueCERTIFICATE_VERIFY_FAILED).
  • verify kwarg принят httpx 0.28.1 без TypeError/DeprecationWarning (-W error::DeprecationWarning).
  • Регрессия-тест test_http_helpers_disable_tls_verify — ловит молчаливый ре-брейк (assert verify=False в обоих хелперах).
  • pytest tests/test_ekb_geoportal_client.py12 passed; ruff clean.
## Latent bug — геопортал-клиент падал TLS из контейнера Поймано при подготовке #1085 (probe реального клиента с прода): ``` EKBGeoportalClient().zone_index_at(60.6107, 56.8391) → ConnectError [SSL: CERTIFICATE_VERIFY_FAILED] unable to get local issuer certificate ``` Геопортал ЕКБ отдаёт TLS-цепочку с корневым **российским гос-УЦ**, которого нет в trust-store наших контейнеров (та же история, что у НСПД). `ekb_geoportal_client.py` (#1083) использовал httpx с `verify=True` по умолчанию → **весь geoportal-интеграционный слой не работал бы с прода**: - C8b `get_or_fetch_zone_regulation` (#1099) - D9b `functional_zone` / `krt` / `zone_regulation` в analyze (#1101) - будущий #1085 harvest Всё gated default-off, поэтому прод сейчас не сломан — но при включении флага вернулись бы пустые блоки (graceful-swallow прятал бы TLS-ошибку в warning). ## Фикс `_http_get_json` / `_http_post_json` → `verify=False` (module-const `_VERIFY_TLS`). - Данные **публичные** open-data (ПЗЗ/ППТ/КРТ), секреты не передаются → MITM-риск незначим. - **Прецедент в проекте:** `nspd_lite._SSL_CTX = ssl._create_unverified_context()` для тех же росс-гос-эндпоинтов. ## Валидация - **Прод-probe пропатченного пути** (контейнер `gendesign-backend-1`, httpx 0.28.1): `verify=False` → WFS вернул `urban_index="Ц-1"` ✅ (с `verify=True` — `CERTIFICATE_VERIFY_FAILED`). - `verify` kwarg принят httpx 0.28.1 без TypeError/DeprecationWarning (`-W error::DeprecationWarning`). - Регрессия-тест `test_http_helpers_disable_tls_verify` — ловит молчаливый ре-брейк (assert verify=False в обоих хелперах). - `pytest tests/test_ekb_geoportal_client.py` → **12 passed**; `ruff` clean.
lekss361 added 1 commit 2026-06-06 20:02:26 +00:00
fix(sf): ekb_geoportal_client verify=False — росс-гос-CA не в trust-store контейнера (#1067)
All checks were successful
CI / changes (push) Successful in 6s
CI / changes (pull_request) Successful in 7s
CI / backend-tests (push) Successful in 5m48s
CI / backend-tests (pull_request) Successful in 5m47s
35899016e0
lekss361 added the
GG-форсайт
scope/backend
site-finder
status/review
labels 2026-06-06 20:02:31 +00:00
bot-reviewer reviewed 2026-06-06 20:10:19 +00:00
bot-reviewer left a comment
Collaborator

APPROVE — latent TLS-fix, security-обоснован.

Security-review (verify=False — НЕ новая дыра, установленный паттерн):

  • Scope contained: _VERIFY_TLS=False один const → 2 module-level хелпера; не глобальный httpx-патч, другие клиенты (НСПД/Avito/Cian/dadata) не затронуты (другие файлы).
  • Нет секретов/auth к геопорталу: только публичные WFS/searchByGeom/urbanCard гео-запросы (lon/lat/layer/CQL), без headers/keys/cookie → MITM = только tampered-геоданные, не credential-утечка.
  • Прецедент РЕАЛЕН ×4: nspd_lite._SSL_CTX=ssl._create_unverified_context(), nspd_client, ekburg_permits.py (httpx.Client verify=False, екатеринбург.рф Минцифры-CA), pzz_loader (Росреестр PKK6). Консистентный проектный паттерн для росс-гос-CA.
  • httpx 0.28.1 top-level verify= валиден (не deprecated; прод-probe подтвердил WFS urban_index="Ц-1"). Регрессия-тест non-vacuous (assert verify=False прокинут).
  • Данные публичные open-data (ПЗЗ/ППТ/КРТ). Чинит весь geoportal-слой (C8b/D9b/#1085) который иначе вернул бы пустые блоки при флаге ON.

Минор (cosmetic): docstring _http_get_json «нормальный TLS, без спец-обвязки» теперь противоречит verify=False — обновить при следующем касании (не блок).

Advisory (для будущего): если к клиенту добавятся auth-заголовки → перейти на pinned ssl_context с нац-CA (вариант 1). Сейчас open-data + no-secrets → verify=False обоснован.

Merge → deploy-verify (geoportal за флагом OFF → /health-green достаточно).

<!-- gendesign-review-bot: sha=3589901 verdict=approve --> ✅ **APPROVE** — latent TLS-fix, security-обоснован. Security-review (verify=False — НЕ новая дыра, установленный паттерн): - **Scope contained**: `_VERIFY_TLS=False` один const → 2 module-level хелпера; не глобальный httpx-патч, другие клиенты (НСПД/Avito/Cian/dadata) не затронуты (другие файлы). - **Нет секретов/auth** к геопорталу: только публичные WFS/searchByGeom/urbanCard гео-запросы (lon/lat/layer/CQL), без headers/keys/cookie → MITM = только tampered-геоданные, не credential-утечка. - **Прецедент РЕАЛЕН ×4**: `nspd_lite._SSL_CTX=ssl._create_unverified_context()`, `nspd_client`, `ekburg_permits.py` (httpx.Client verify=False, екатеринбург.рф Минцифры-CA), `pzz_loader` (Росреестр PKK6). Консистентный проектный паттерн для росс-гос-CA. - httpx 0.28.1 top-level `verify=` валиден (не deprecated; прод-probe подтвердил WFS `urban_index="Ц-1"`). Регрессия-тест non-vacuous (assert verify=False прокинут). - Данные публичные open-data (ПЗЗ/ППТ/КРТ). Чинит весь geoportal-слой (C8b/D9b/#1085) который иначе вернул бы пустые блоки при флаге ON. **Минор (cosmetic):** docstring `_http_get_json` «нормальный TLS, без спец-обвязки» теперь противоречит verify=False — обновить при следующем касании (не блок). **Advisory (для будущего):** если к клиенту добавятся auth-заголовки → перейти на pinned ssl_context с нац-CA (вариант 1). Сейчас open-data + no-secrets → verify=False обоснован. Merge → deploy-verify (geoportal за флагом OFF → /health-green достаточно).
bot-reviewer merged commit e7a0af5ddc into main 2026-06-06 20:10:27 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1103
No description provided.