fix(cadastre): NSPDBulkClient verify=False for NSPD self-signed CA chain (#168) #175

Merged
lekss361 merged 1 commit from fix/nspd-bulk-client-ssl into main 2026-05-15 11:50:21 +00:00
lekss361 commented 2026-05-15 11:47:33 +00:00 (Migrated from github.com)

Summary

  • Hotfix для #168 pilot run blocker
  • Pilot job #1 failed на всех 50 quarters с SSL: CERTIFICATE_VERIFY_FAILED self-signed certificate in certificate chain
  • NSPD prod chain на Beget VPS содержит internal CA → httpx default verify trips

Fix

Добавлено verify=False в httpx.AsyncClient(...) с inline комментарием.

Existing precedent

app/services/scrapers/nspd_lite.py:55 использует ssl._create_unverified_context() для exact same reason (since April 2026). Просто переносим pattern на httpx.

Risk profile

  • NSPD = public gov data
  • No sensitive payload outbound
  • Admin token не отправляется к NSPD endpoints (только к нашему backend)
  • MITM risk минимальный

Test plan

  • Edit __aenter__ to pass verify=False
  • After merge → deploy → re-run pilot via curl → 50 quarters должны harvest успешно
  • cad_parcels, cad_buildings, cad_constructions, cad_zouit должны заполниться
## Summary - **Hotfix** для #168 pilot run blocker - Pilot job #1 failed на всех 50 quarters с `SSL: CERTIFICATE_VERIFY_FAILED self-signed certificate in certificate chain` - NSPD prod chain на Beget VPS содержит internal CA → httpx default verify trips ## Fix Добавлено `verify=False` в `httpx.AsyncClient(...)` с inline комментарием. ## Existing precedent `app/services/scrapers/nspd_lite.py:55` использует `ssl._create_unverified_context()` для exact same reason (since April 2026). Просто переносим pattern на httpx. ## Risk profile - NSPD = public gov data - No sensitive payload outbound - Admin token не отправляется к NSPD endpoints (только к нашему backend) - MITM risk минимальный ## Test plan - [x] Edit `__aenter__` to pass `verify=False` - [ ] After merge → deploy → re-run pilot via curl → 50 quarters должны harvest успешно - [ ] `cad_parcels`, `cad_buildings`, `cad_constructions`, `cad_zouit` должны заполниться
lekss361 commented 2026-05-15 11:50:06 +00:00 (Migrated from github.com)

Review

CI зелёный (backend 1m13s + frontend 1m28s). Diff минимальный: +6 строк в backend/app/scrapers/nspd_bulk_client.py (5 комментарий + verify=False).

Cross-check (agent):

  • Scope verify=False — bounded. self._client приватен к NSPDBulkClient, создаётся в __aenter__, закрывается в __aexit__, используется только в _get_json для NSPD URLs. Не утекает наружу, в другие httpx pools не бьёт.
  • Precedent подтверждён. backend/app/services/scrapers/nspd_lite.py:55_SSL_CTX = ssl._create_unverified_context() глобально для NSPD с апреля 2026. Pattern already in prod.
  • Contract drift — нет. Только kwarg httpx-клиента, схемы/типы/сигнатуры не трогаются. TS-консьюмеры не затронуты.
  • Log spam. httpx-warning per session, не per request. disable_warnings() не нужен, оставляем видимым.
  • Risk profile ок. Public gov data, X-Admin-Token не уходит к NSPD, MITM impact = подделка публичных кадастровых данных от непубличного источника — приемлемо для pilot run #168.

Никаких блокеров. Hardcoded verify=False совпадает с precedent; env-flag можно добавить позже когда NSPD починят CA chain, gold-plating для hotfix.

approve merge

## Review CI зелёный (backend 1m13s + frontend 1m28s). Diff минимальный: +6 строк в `backend/app/scrapers/nspd_bulk_client.py` (5 комментарий + `verify=False`). **Cross-check (agent):** - **Scope verify=False — bounded.** `self._client` приватен к `NSPDBulkClient`, создаётся в `__aenter__`, закрывается в `__aexit__`, используется только в `_get_json` для NSPD URLs. Не утекает наружу, в другие httpx pools не бьёт. - **Precedent подтверждён.** `backend/app/services/scrapers/nspd_lite.py:55` — `_SSL_CTX = ssl._create_unverified_context()` глобально для NSPD с апреля 2026. Pattern already in prod. - **Contract drift — нет.** Только kwarg httpx-клиента, схемы/типы/сигнатуры не трогаются. TS-консьюмеры не затронуты. - **Log spam.** httpx-warning per session, не per request. `disable_warnings()` не нужен, оставляем видимым. - **Risk profile ок.** Public gov data, X-Admin-Token не уходит к NSPD, MITM impact = подделка публичных кадастровых данных от непубличного источника — приемлемо для pilot run #168. Никаких блокеров. Hardcoded `verify=False` совпадает с precedent; env-flag можно добавить позже когда NSPD починят CA chain, gold-plating для hotfix. approve merge
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
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#175
No description provided.