# service-ukep — Выпуск и подключение обезличенной УКЭП (служебной учётной записи) для True API **Статус:** Активен ## Предпосылки В текущей архитектуре приложения аутентификация в True API выполняется через УКЭП **физического лица** (сотрудника) с помощью КриптоПро Browser Plugin на стороне клиента. Это означает, что: - Для каждого сеанса нужен человек с токеном - Нельзя организовать полностью автоматический обмен (сервер-сервер) - При увольнении сотрудника доступ теряется Для автоматической интеграции требуется **обезличенная УКЭП (ОУКЭП)** — сертификат на организацию, без привязки к физлицу. --- ## 1. Юридические основания | Нормативный акт | Описание | |-----------------|----------| | **63-ФЗ ст. 5 п. 2** | Допускается УКЭП, в сертификате которой не указано физлицо (обезличенная), для автоматического создания/проверки ЭП | | **Приказ ФНС от 08.06.2021 № ЕД-7-24/538@** | Порядок выдачи обезличенных сертификатов УЦ ФНС | | **443-ФЗ от 01.09.2024** | КЭП оформляется только на директора (без доверенности); для автоматизации — только ОУКЭП | ОУКЭП применяется для электронных документов, **автоматически формируемых и представляемых** в ГИС МТ, за исключением: - Заявления о регистрации участника - Заявки на тестирование - Заявки на доступ к устройству регистрации эмиссии --- ## 2. Сравнение вариантов | Характеристика | ОУКЭП (обезличенная) | КЭП физлица + МЧД | API-ключ (x-api-key) | |----------------|----------------------|--------------------|---------------------| | **Кому выдаётся** | Организации (без физлица) | Физлицу | Организации (в ЛК) | | **Без человека** | ✅ Да — полный автомат | ❌ Нет — нужен человек с токеном | ✅ Да | | **Срок** | 15 месяцев | 12-15 месяцев | до 01.07.2026 (продление?) | | **Доступ к True API** | ✅ Полный | ✅ Полный | ❌ Только касса (розн. режим) | | **Стоимость** | 0 ₽ (УЦ ФНС) / 3–10 тыс. ₽ (коммерч.) | ~3 000 ₽/год | 0 ₽ | | **Риски** | Низкие | Увольнение сотрудника | Ограниченный функционал | **Вывод:** для серверной интеграции с True API требуется именно ОУКЭП. --- ## 3. Порядок выпуска ОУКЭП через УЦ ФНС (бесплатно) ### 3.1. Подготовка документов | № | Документ | Примечание | |---|----------|------------| | 1 | **Письмо-заявление** на официальном бланке организации | С обоснованием: «для автоматического обмена с ГИС МТ через True API» | | 2 | **Копия распорядительного документа** о создании информационной системы | Приказ о вводе в эксплуатацию информационной системы, осуществляющей автоматический обмен | | 3 | **Паспорт руководителя** (оригинал) | Личная явка в УЦ ФНС | | 4 | **СНИЛС руководителя** | | | 5 | **ИНН организации + ИНН руководителя** | | | 6 | **Выписка из ЕГРЮЛ** | Свежая (не старше 1 мес.) | | 7 | **Решение о назначении руководителя** | Протокол / приказ | | 8 | **USB-токен** | Рутокен ЭЦП 3.0 или JaCarta-2 ГОСТ (см. п. 3.2) | **Образцы документов:** - Письмо-заявление: https://github.com/romangorbenko/OUKEP/blob/main/letter.docx - Приказ о создании ИС: https://github.com/romangorbenko/OUKEP/blob/main/order.docx - Приказ о назначении ответственного: https://github.com/romangorbenko/OUKEP/blob/main/ResponsibleAppointment.docx ### 3.2. Требования к носителю (2026 год) С 1 апреля 2026 все КЭП — только по новым ГОСТ 34.12-2018 / 34.13-2018. | Носитель | Статус | |----------|--------| | **Рутокен ЭЦП 3.0** | ✅ Работает | | **JaCarta-2 ГОСТ** | ✅ Работает | | **JaCarta-3** | ✅ Работает | | Рутокен ЭЦП 2.0 | ❌ Устарел (не принимается) | | Рутокен Lite | ❌ Не сертифицирован | | eToken (старые) | ❌ Не сертифицированы | ### 3.3. Процесс получения ```mermaid graph TD A[Подготовить документы] --> B[Записаться в УЦ ФНС] B --> C[Личная явка руководителя с паспортом + токеном] C --> D[Выпуск сертификата на носитель] D --> E[Установка КриптоПро CSP 5.0+] E --> F[Импорт сертификата в хранилище] ``` 1. Записаться в ближайшую ИФНС, оказывающую услуги УЦ (перечень на nalog.gov.ru) 2. Явиться лично с комплектом документов и USB-токеном 3. Сотрудник УЦ проверяет документы, идентифицирует личность, выпускает сертификат 4. Получить носитель с записанным сертификатом 5. **Срок:** от 1 часа до 3 рабочих дней 6. **Срок действия:** 15 месяцев ### 3.4. Альтернатива — коммерческий УЦ | УЦ | Ориентировочная стоимость | Примечание | |----|---------------------------|------------| | Контур (ca.kontur.ru) | ~5 000–8 000 ₽/год | Удалённо, курьер | | Такском (taxcom.ru) | ~4 000–7 000 ₽/год | Удалённо | | СБИС (sbis.ru) | ~5 000–10 000 ₽/год | Удалённо | | Астрал (astral.ru) | ~3 000–6 000 ₽/год | Удалённо | **Плюсы:** не нужна личная явка в ФНС, быстрее, сопровождение. **Минусы:** платно. --- ## 4. Техническая подготовка к автоматической подписи (сервер) ### 4.1. Схема работы ``` Сервер (Linux) ├── КриптоПро CSP 5.0 R2+ ← подпись УКЭП ├── Носитель с ОУКЭП │ ├── Физический USB (Рутокен) → через USB-over-IP (NIO-EUSB / Digi AnywhereUSB) │ └── Или виртуальный (копия ключа, если разрешено политикой) ├── Наше приложение (backend) │ ├── got → True API (auth/key, simpleSignIn) │ └── crypto-pro (или КриптоПро CLI) → подпись data └── Хранилище сертификатов (/var/opt/cprocsp/...) ``` ### 4.2. Требования к серверу | Компонент | Версия | Назначение | |-----------|--------|------------| | **ОС** | Linux (x86_64) | Рекомендуется Ubuntu 22.04+/Debian 12+/Astra Linux | | **КриптоПро CSP** | 5.0.12000+ (5.0 R2) | Криптопровайдер | | **КриптоПро CLI (cryptcp)** | из состава CSP | Генерация запросов, подпись | | **lsb-cprocsp-devel** | из состава CSP | Разработка | | **USB-токен** | Рутокен ЭЦП 3.0 / JaCarta-2 ГОСТ | Носитель ключа | | **pcscd** | любая | Демон для работы с USB-токенами | | **Node.js** | 20+ | Наше приложение | ### 4.3. Установка КриптоПро CSP на сервер ```bash # 1. Скачать дистрибутив с cryptopro.ru (требуется авторизация) # linux-amd64_deb.tgz # 2. Установить tar -xzf linux-amd64_deb.tgz cd linux-amd64_deb ./install.sh # 3. Проверить установку /opt/cprocsp/sbin/cryptopro -v # 4. Установить лицензию /opt/cprocsp/bin/cryptopro -setkey # 5. Подключить токен (через USB или USB-over-IP) # Убедиться, что pcscd запущен systemctl start pcscd # 6. Проверить видимость токена /opt/cprocsp/bin/cryptopro -list ``` ### 4.4. Генерация запроса на сертификат (PKCS#10) Если ОУКЭП выпускается через УЦ ФНС **впервые** (без готового носителя), нужно сгенерировать запрос на сервере и передать его в УЦ. **Сгенерировать контейнер и запрос:** ```bash /opt/cprocsp/bin/cryptcp -createrqst /tmp/request.req \ -rdn "CN=\"ООО \"\"РОМАШКА\"\"\", E=admin@company.ru, C=RU, S=\"77 г. Москва\", L=\"Москва\", STREET=\"ул. Ленина д.1\", O=\"ООО \"\"РОМАШКА\"\"\", 1.2.643.100.4=7700123456, 1.2.643.100.1=1234567890123" \ -pin "" \ -provtype 80 \ -provname "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider" \ -certusage 1.3.6.1.5.5.7.3.2 \ -ext RemoteCertificate.ext ``` Где: - `1.2.643.100.4` — ИНН организации (10 цифр) - `1.2.643.100.1` — ОГРН (13 цифр или 15 для ИП) - `RemoteCertificate.ext` — файл с OID для удалённого выпуска (без личной явки) — [скачать шаблон](https://raw.githubusercontent.com/romangorbenko/OUKEP/main/RemoteCertificate.ext) Файл `request.req` передаётся в УЦ ФНС (на USB-флешке, вместе с пакетом документов из п. 3.1). ### 4.5. Установка полученного сертификата на сервер ```bash # Установить сертификат в контейнер /opt/cprocsp/bin/cryptcp -inst \ -cont "\\.\A-<идентификатор контейнера>" \ -cert /tmp/certificate.cer # Проверить /opt/cprocsp/bin/cryptopro -list ``` ### 4.6. Подпись данных (автоматическая) **Вариант A — через CLI (cryptcp):** ```bash echo -n "$DATA" | base64 -d > /tmp/data_to_sign.bin /opt/cprocsp/bin/cryptcp -sign \ -detached \ -thumbprint \ /tmp/data_to_sign.bin /tmp/signature.sig cat /tmp/signature.sig | base64 -w0 ``` **Вариант B — через Node.js binding (`@vgoma/crypto-pro`):** Пакет `@vgoma/crypto-pro` умеет работать с КриптоПро CSP на сервере (не только в браузере). Требует установленного CSP и библиотеки `lsb-cprocsp-devel`. ```typescript import { createAttachedSignature } from '@vgoma/crypto-pro' const signature = await createAttachedSignature(thumbprint, base64data) ``` **Вариант C — через REST-сервис КриптоПро (CryptoPro DSS):** КриптоПро предоставляет DSS (Digital Signature Service) — REST API для подписи. Устанавливается как отдельный сервис. ### 4.7. Дооснащение backend-контейнера (`backend/Dockerfile`) Текущий Dockerfile использует `node:20-alpine`. Для работы с КриптоПро потребуется: ```dockerfile # Вариант: переход на образ с КриптоПро CSP FROM node:20-bookworm AS builder WORKDIR /app COPY package.json package-lock.json ./ RUN npm ci COPY src/ ./src/ RUN npm run build FROM node:20-bookworm AS runner WORKDIR /app # Установка КриптоПро CSP COPY cprocsp/*.deb /tmp/ RUN dpkg -i /tmp/*.deb || true RUN apt-get install -f -y && \ /opt/cprocsp/sbin/cryptopro -setkey # Установка НЦА (сертификаты УЦ) RUN /opt/cprocsp/sbin/cpverify -install ... # USB-over-IP клиент (если токен не локальный) COPY nio-eusb-client /usr/local/bin/ COPY --from=builder /app/dist ./dist COPY --from=builder /app/node_modules ./node_modules EXPOSE 3001 CMD ["node", "dist/index.js"] ``` **Или проще:** использовать готовый образ от КриптоПро или развернуть сервис подписи на отдельной ВМ, а наш backend будет вызывать его по REST. --- ## 5. Регистрация ОУКЭП в личном кабинете Честного знака ### 5.1. Для True API (ГИС МТ) После получения сертификата его нужно зарегистрировать в ГИС МТ: 1. Войти в ЛК Честного знака: https://markirovka.crpt.ru (с УКЭП руководителя) 2. Перейти: **Профиль → Администрирование → Учётные системы** 3. Нажать **«Добавить учётную систему»** 4. Указать наименование (например, «Сервер интеграции API») 5. В карточке учётной системы нажать **«Добавить сертификат»** 6. Загрузить **открытую часть сертификата** (файл .cer) **Важно:** для каждого контура (sandbox / prod) регистрация выполняется отдельно. ### 5.2. Внутренний распорядительный акт (обязательно) Требование 63-ФЗ: издать приказ о назначении **ответственного лица** за автоматическое создание/проверку ЭП в информационной системе. Документ должен содержать: - ФИО сотрудника, ответственного за автоматическую подпись - Регламент работы информационной системы - Порядок действий при компрометации ключа Без этого акта использование ОУКЭП юридически недействительно. --- ## 6. Техническая интеграция — изменения в приложении ### 6.1. Изменение архитектуры Сейчас подпись выполняется **на клиенте** (в браузере через CadesPlugin). После внедрения ОУКЭП: ``` Схема А: только серверная подпись (рекомендуется) ───────────────────────────────────── Frontend (браузер) Backend (наш сервер) True API │ │ │ │ GET /auth/key │ │ │───────────────────────────────>│ │ │ │ GET /auth/key │ │ │──────────────────────────────>│ │ │<────────────────────────────── │ │ { uuid, data } │ │ │<───────────────────────────────│ │ │ │ │ │ POST /auth/simpleSignIn │ (подпись на сервере) │ │ { uuid } │ через КриптоПро CSP │ │───────────────────────────────>│ │ │ │ POST /auth/simpleSignIn │ │ │ { uuid, data: } │ │ │──────────────────────────────>│ │ │<────────────────────────────── │ │ { token } │ │ │<───────────────────────────────│ │ ``` **Изменения:** - Frontend отправляет только `{ uuid }` (без data) - Backend сам подписывает data через установленный КриптоПро CSP - Browser Plugin на стороне клиента больше **не нужен** для авторизации - Весь процесс аутентификации — на backend ### 6.2. Модификация backend-сервисов **`auth-service.ts`:** ```typescript import { execSync } from 'child_process' function signData(dataBase64: string): string { const thumbprint = process.env.CERT_THUMBPRINT // Вариант 1: через CLI cryptcp const result = execSync( `/opt/cprocsp/bin/cryptcp -sign -detached -thumbprint ${thumbprint} /dev/stdin /dev/stdout`, { input: Buffer.from(dataBase64, 'base64') } ) return result.toString('base64') // Вариант 2: через @vgoma/crypto-pro (асинхронно) // return createAttachedSignature(thumbprint, dataBase64) } export async function getAuthKey(env: TrueApiEnv): Promise { // ... без изменений } export async function serverSignIn(env: TrueApiEnv): Promise { const { uuid, data } = await getAuthKey(env) const signature = signData(data) return signIn(env, { uuid, data: signature }) } ``` **Новый endpoint:** ```typescript // POST /auth/server-login — полная авторизация на backend app.post('/auth/server-login', async (request, reply) => { const env = parseEnv(request.query) try { const result = await serverSignIn(env) return result } catch (err) { // обработка ошибок } }) ``` ### 6.3. Необходимые файлы | Файл | Назначение | |------|------------| | `backend/certs/certificate.cer` | Открытая часть сертификата ОУКЭП | | `backend/Dockerfile` | Установка КриптоПро CSP + импорт сертификата | | `backend/src/services/crypto-service.ts` | Сервис подписи через КриптоПро | | `.env` / secrets | `CERT_THUMBPRINT`, лицензия КриптоПро | ### 6.4. Переменные окружения (добавить в .env) ```env # Режим аутентификации: client (через браузер) или server (через ОУКЭП) AUTH_MODE=server # Отпечаток сертификата ОУКЭП CERT_THUMBPRINT= # Только для AUTH_MODE=server: # Путь к файлу открытой части сертификата (для валидации) CERT_FILE=/app/certs/certificate.cer ``` --- ## 7. Пошаговый план действий ### Этап 1. Подготовка документов - [ ] 1.1. Подготовить письмо-заявление на бланке организации - [ ] 1.2. Подготовить приказ о создании информационной системы - [ ] 1.3. Подготовить приказ о назначении ответственного за автоматическую подпись - [ ] 1.4. Собрать остальные документы (паспорт, СНИЛС, ИНН, выписка ЕГРЮЛ) - [ ] 1.5. Приобрести Рутокен ЭЦП 3.0 или JaCarta-2 ГОСТ ### Этап 2. Получение ОУКЭП - [ ] 2.1. Записаться в УЦ ФНС (или выбрать коммерческий УЦ) - [ ] 2.2. Явиться лично с документами и носителем - [ ] 2.3. Получить сертификат на носитель - [ ] 2.4. Скопировать открытую часть сертификата (.cer) ### Этап 3. Регистрация в Честном знаке - [ ] 3.1. Войти в ЛК Честного знака - [ ] 3.2. Создать учётную систему в разделе Администрирование - [ ] 3.3. Загрузить сертификат в учётную систему - [ ] 3.4. Повторить для sandbox-контура (при необходимости) ### Этап 4. Настройка сервера - [ ] 4.1. Установить КриптоПро CSP 5.0 R2 на сервер - [ ] 4.2. Подключить токен с ОУКЭП (локально или через USB-over-IP) - [ ] 4.3. Импортировать сертификат, проверить видимость - [ ] 4.4. Установить корневые сертификаты Минцифры и УЦ ФНС - [ ] 4.5. Проверить подпись через CLI: `cryptcp -sign` ### Этап 5. Доработка приложения - [ ] 5.1. Реализовать `crypto-service.ts` — подпись через КриптоПро CSP - [ ] 5.2. Добавить endpoint `POST /auth/server-login` - [ ] 5.3. Добавить переменные окружения (`AUTH_MODE`, `CERT_THUMBPRINT`) - [ ] 5.4. Обновить `Dockerfile` — установка КриптоПро CSP - [ ] 5.5. Обновить `docker-compose.yml` — проброс USB-токена (если локальный) - [ ] 5.6. Обновить frontend — кнопка «Авторизация сервера» (для режима server) ### Этап 6. Тестирование - [ ] 6.1. Проверить авторизацию в sandbox через серверную подпись - [ ] 6.2. Проверить получение токена - [ ] 6.3. Проверить проверку КМ с новым токеном - [ ] 6.4. Проверить auto-refresh токена (каждые 10 часов) - [ ] 6.5. Проверить обработку ошибок (невалидная подпись, просрочка сертификата) --- ## 8. Ссылки | Ресурс | URL | |--------|-----| | Официальная документация True API | https://docs.crpt.ru/gismt/True_API/ | | Статья на Хабре (подробный гайд) | https://habr.com/ru/articles/838390/ | | Образцы документов (Github) | https://github.com/romangorbenko/OUKEP | | Письмо-заявление (шаблон) | https://github.com/romangorbenko/OUKEP/blob/main/letter.docx | | Приказ о создании ИС (шаблон) | https://github.com/romangorbenko/OUKEP/blob/main/order.docx | | КриптоПро CSP | https://cryptopro.ru/products/csp | | База знаний Честного знака (ОУКЭП) | https://markirovka.ru/knowledge/tovarnye-gruppy/obschie-voprosy-gis/ispolzovanie-obezlichennykh-ukep | | Добавление ОУКЭП в учётную систему | https://markirovka.ru/knowledge/lekarstva/api-mdlp/upravlenie-obezlichennymi-ukep-dobavlenie-obezlichennoy-ukep | | Реестр аккредитованных УЦ Минцифры | https://digital.gov.ru/ru/activity/469/ | --- ## Затрагиваемые сервисы - `backend/Dockerfile` — установка КриптоПро CSP 5.0, импорт сертификатов - `backend/docker-compose.yml` — возможно, проброс USB-устройства - `backend/src/services/crypto-service.ts` — **новый файл**, сервис подписи данных - `backend/src/services/auth-service.ts` — добавление `serverSignIn()` - `backend/src/routes/auth.ts` — новый endpoint `POST /auth/server-login` - `backend/.env` — новые переменные `AUTH_MODE`, `CERT_THUMBPRINT` - `backend/certs/` — **новая директория** с открытой частью сертификата - `frontend/src/pages/AuthPage.tsx` — кнопка «Авторизация сервера» (опционально)