ПМИ_реестры_сертификатов_УКЭП_А.2_v01_draft

А.2 Проверка создания распределённых реестров данных о сертификатах УКЭП и событиях жизненного цикла сертификатов УКЭП

Настоящая методика обеспечивает проверку реализации требований, изложенных в ЧТЗ п. 4.2.2, в соответствии с пунктами /4.2.2.1, 4.2.2.5, 4.2.2.11 Заявки № ИЭП-1.

Проверки выполняются вызовами методов REST API и наблюдением базы глобального состояния. Во всех шагах проверок действует единственная роль — демонстрирующий; иные роли не предусмотрены. Вызовы методов приватного канала сертификатов УЦ выполняются от имени УЦ-владельца канала; вызовы методов публичного канала — от имени участника канала, имеющего доступ на чтение. Функции доступны в среде развёртывания; IP-адрес среды указывается при подготовке испытаний и приводится в протоколе испытаний (Приложение Б).

Предварительные условия: развёрнут тестовый стенд; развёрнуты каналы квалифицированных сертификатов (канал аккредитации и сертификатов ГУЦ, приватный канал сертификатов ГУЦ, приватный канал квалифицированных сертификатов АУЦ) и публичный канал сертификатов УЦ; демонстрирующему предоставлены тестовые сертификаты УКЭП (корневой сертификат ГУЦ, промежуточный сертификат АУЦ, конечные сертификаты УКЭП — корректные и с заведомыми нарушениями формата), ключ доступа к REST API и учётные данные для подключения к базе глобального состояния (DBeaver).

А.2.1 Проверка создания записи о сертификате УКЭП в приватном канале

Проверка открывает сценарий испытаний сертификатов УКЭП: к её выполнению запись о тестовом сертификате в реестре отсутствует, поэтому регистрация проводится на корректном сертификате УКЭП, выданном тестовым АУЦ, и созданная запись становится исходным состоянием реестра для всех последующих проверок. Подтверждается приём сертификата через REST API: корректный запрос обрабатывается, в ответе возвращается идентификатор записи вида «дата начала действия;hashTBS», а сам идентификатор используется далее во всех запросах сценария. Альтернативные шаги доказывают защиту от повторной регистрации и от пустого запроса: повторная регистрация того же сертификата отклоняется с кодом ошибки ERR-0721, пустой запрос — с кодом ERR-0010.

№

Шаг

Ожидаемый результат

1

Действие: Выполнить запрос «Создать запись о сертификате в приватном канале» (POST /certificate/qual/create), передав корректный сертификат УКЭП

HTTP 200; возвращён идентификатор вида YYYY-MM-DDTHH:MM:SSZ;hashTBS.

2

(альтернативный к шагу 1) Действие: Повторно выполнить запрос с тем же сертификатом

Запрос отклонён; возвращён код ошибки ERR-0721 (сертификат с таким _id уже существует в реестре).

3

(альтернативный к шагу 1) Действие: Выполнить запрос с пустым телом

Запрос отклонён; возвращён код ошибки ERR-0010.

А.2.2 Проверка форматно-логического контроля сведений о сертификате УКЭП

Проверка подтверждает, что сведения о сертификате УКЭП при внесении подвергаются декодированию, парсингу и форматно-логическому контролю: некорректное транспортное представление сертификата отклоняется с соответствующим кодом ошибки, а нарушения требований к формату квалифицированного сертификата не блокируют регистрацию, но фиксируются перечнем предупреждений в записи о сертификате. Запрос с искажённой кодировкой BASE64 доказывает контроль транспортного представления; запрос с сертификатом, не содержащим обязательных для УКЭП расширений (например, certificatePolicies либо identificationKind), доказывает, что фоновая проверка формирует предупреждения QCERT_* и по завершении проверок поле isChecked принимает значение True. Предупреждения наблюдаются в записи о сертификате при проверке А.2.7.

№

Шаг

Ожидаемый результат

1

Действие: Выполнить запрос «Создать запись о сертификате в приватном канале», передав PEM-сертификат с искажённым телом BASE64

Запрос отклонён; возвращён код ошибки ERR-0704 либо ERR-0705.

2

Действие: Выполнить запрос «Создать запись о сертификате в приватном канале», передав корректный по структуре сертификат УКЭП без обязательных расширений (certificatePolicies, identificationKind)

HTTP 200; возвращён идентификатор записи; в записи о сертификате (проверка А.2.7) поле warnings содержит предупреждения QCERT_CERT_POLICIES_MISSING, QCERT_IDENTIFICATION_KIND_MISSING; после завершения фоновых проверок isChecked = True.

А.2.3 Проверка проверки цепочки доверия и аккредитации издателя при внесении

Проверка опирается на записи реестра, созданные проверкой А.2.1, и подтверждает проверку цепочки доверия: для несамоподписанного сертификата родительские сертификаты запрашиваются в реестре аккредитации и сертификатов УЦ, а при их отсутствии регистрация отклоняется. Второй шаг подтверждает отличие УКЭП от УНЭП — обязательность проверки аккредитации издателя: для сертификата, выданного АУЦ, не имевшим действующей аккредитации на дату начала действия сертификата, формируется предупреждение QCERT_ISSUER_NOT_ACCREDITED_AT_ISSUANCE; для сертификата, чей издатель не был действителен на эту дату, — QCERT_PARENT_NOT_VALID_AT_ISSUANCE. Альтернативный шаг доказывает криптографическую проверку: сертификат с неверной электронной подписью отклоняется с кодом ошибки ERR-0722.

№

Шаг

Ожидаемый результат

1

Действие: Выполнить запрос «Создать запись о сертификате в приватном канале», передав сертификат УКЭП, родительский сертификат которого отсутствует в реестре аккредитации и сертификатов УЦ

Запрос отклонён; возвращена ошибка «Отсутствует родительский сертификат».

2

Действие: Выполнить запрос «Создать запись о сертификате в приватном канале», передав сертификат УКЭП, выданный УЦ, аккредитация которого не действовала на дату начала действия сертификата

HTTP 200; в записи о сертификате поле warnings содержит QCERT_ISSUER_NOT_ACCREDITED_AT_ISSUANCE.

3

(альтернативный к шагу 1) Действие: Выполнить запрос «Создать запись о сертификате в приватном канале», передав сертификат УКЭП с неверной электронной подписью

Запрос отклонён; возвращён код ошибки ERR-0722.

А.2.4 Проверка изменения статуса сертификата УКЭП

Проверка опирается на сертификат, зарегистрированный проверкой А.2.1 (событие «1» — начало действия сертификата), и проводит его по предусмотренным статусной моделью переходам: прекращение действия сертификата (событие «2» с указанием причины) и возобновление действия сертификата (событие «3»). Каждое изменение статуса фиксируется отдельным событием истории с очередным номером версии. Альтернативные шаги подтверждают форматно-логический контроль запроса и проверку допустимости перехода: запрос без времени вступления изменения в силу отклоняется с кодом ERR-0801, повторная передача изменения с теми же параметрами отклоняется как недопустимый переход с кодом ERR-0805 (идемпотентность). Сформированная цепочка событий используется далее при проверках статуса на дату и периодов действия (А.2.11, А.2.12).

№

Шаг

Ожидаемый результат

1

Действие: Выполнить запрос «Изменить статус сертификата в приватном канале» (POST /certificate/qual/status-update) с event = 2 (прекращение действия), указав причину и updatedAt

HTTP 200; возвращены сведения о новом событии истории (номер версии увеличен на 1).

2

Действие: Выполнить запрос «Изменить статус сертификата в приватном канале» с event = 3 (возобновление действия) и новым updatedAt

HTTP 200; статус сертификата изменён; в истории зафиксировано событие «3».

3

(альтернативный к шагам 1–2) Действие: Выполнить запрос «Изменить статус сертификата в приватном канале» без поля updatedAt

Запрос отклонён; возвращён код ошибки ERR-0801.

4

(альтернативный к шагам 1–2) Действие: Повторно выполнить запрос шага 1 с теми же значениями

Запрос отклонён; возвращён код ошибки ERR-0805 (невозможный переход по статусной модели).

А.2.5 Проверка логической отмены сертификата УКЭП

Проверка опирается на сертификат, зарегистрированный проверкой А.2.1. Подтверждается функция логической отмены: отмена не удаляет запись о сертификате, а устанавливает флаг logicalCancelFlag = True; отменённый сертификат переносится в публичный канал с флагом True (проверка А.2.9). Альтернативный шаг подтверждает обработку некорректного идентификатора: запрос отмены с идентификатором ошибочного формата отклоняется с кодом ERR-0731, повторная отмена — с кодом ERR-0730.

№

Шаг

Ожидаемый результат

1

Действие: Выполнить запрос «Логическая отмена» (POST /certificate/qual/certificate-cancel), передав идентификатор сертификата, зарегистрированного проверкой А.2.1

HTTP 200; в ответе logicalCancelFlag = True.

2

(альтернативный к шагу 1) Действие: Выполнить запрос «Логическая отмена» с идентификатором ошибочного формата

Запрос отклонён; возвращён код ошибки ERR-0731.

3

(альтернативный к шагу 1) Действие: Повторно выполнить запрос шага 1

Запрос отклонён; возвращён код ошибки ERR-0730.

А.2.6 Проверка получения данных сертификатов по заданному фильтру в приватном канале

Проверка опирается на записи о сертификатах, накопленные проверками А.2.1–А.2.3, и подтверждает метод получения данных по заданному фильтру: по значению параметра фильтрации (например, ОГРН владельца) возвращается перечень идентификаторов сертификатов, удовлетворяющих фильтру, а по идентификатору сертификата — модель сведений о сертификате, объединённая с моделью истории. Тем самым подтверждается доступность сведений приватного канала владельцу канала.

№

Шаг

Ожидаемый результат

1

Действие: Выполнить запрос GET /certificate/qual/search?param=<OGRN владельца тестового сертификата>

HTTP 200; возвращён перечень идентификаторов сертификатов, в записях которых поле OGRN владельца совпадает со значением поиска; тестовый сертификат присутствует в перечне.

2

Действие: Выполнить запрос GET /certificate/qual/{YYYY-MM-DDTHH:MM:SSZ;hashTBS}/info?logicalCancelFlag=False для тестового сертификата

HTTP 200; возвращена модель сведений о сертификате (Описание решения, п. 3.1.1), объединённая с моделью истории (п. 3.1.2).

А.2.7 Проверка ведения записи «Сертификат» в базе глобального состояния

Способ проверки: наблюдение базы глобального состояния (Описание решения, п. 3.1.1).

Предварительные условия: выполнены проверки А.2.1–А.2.3 (в приватном канале созданы записи о сертификатах, включая запись с предупреждениями); доступ к базе глобального состояния предоставлен.

Проверка подтверждает, что сведения о сертификатах УКЭП, принятые через REST API, доведены до распределённого реестра, а не ограничиваются ответом метода. Наблюдением записи о сертификате в базе глобального состояния подтверждается её структура: идентификатор записи, хэш TBS, uuid сертификата издателя, тип владельца, сведения из сертификата, исходный сертификат, флаги форматной проверки и логической отмены, перечень предупреждений и служебное поле времени создания. Запись с предупреждениями (результат проверки А.2.2) подтверждает доведение результатов форматно-логического контроля до реестра.

№

Шаг

Ожидаемый результат

1

Действие: Подключиться к базе глобального состояния стенда (DBeaver)

Подключение установлено; база глобального состояния доступна.

2

Действие: Выполнить выборку записи о тестовом сертификате и проверить её структуру (Описание решения, п. 3.1.1)

Запись содержит: _id; hashTBS; issuerUUID; ownerType; сведения из сертификата (version, serialNumber, subjectPublicKeyInfo, validityNotBefore, validityNotAfter, issuer, subject, extensions, algorithmSignature, signatureValue); certificate; isChecked; logicalCancelFlag; createdAtCC; warnings (для сертификата с нарушениями формата — предупреждения QCERT_*).

3

Действие: Проверить значение поля isChecked по записи, наблюдавшейся на шаге 2

После завершения фоновых проверок isChecked = True; до их завершения — False.

А.2.8 Проверка ведения истории изменения статуса сертификата

Способ проверки: наблюдение базы глобального состояния (Описание решения, п. 3.1.2).

Предварительные условия: выполнены проверки А.2.1, А.2.4 (в реестре присутствуют события «начало действия», «прекращение действия», «возобновление действия»); доступ к базе глобального состояния предоставлен.

Проверка опирается на события, сформированные запросами сценария (проверки А.2.1, А.2.4). Наблюдением записи истории подтверждается, что события не перезаписывают друг друга, а накапливаются в массиве истории, где каждое последующее событие получает очередной номер версии, — именно это обеспечивает восстановление статуса сертификата на любой момент времени. Идентификатор записи истории формируется как комбинация uuid сертификата и суффикса HIST. Сформированная история является основой для получения статуса сертификата на заданную дату (проверка А.2.11) и периодов действия (проверка А.2.12).

№

Шаг

Ожидаемый результат

1

Действие: Выполнить выборку записи истории изменения статуса тестового сертификата

Запись содержит: _id (uuid сертификата с суффиксом HIST); массив history; значения versionStatus возрастают от события к событию.

2

Действие: Проверить состав событий в массиве history

События содержат: versionStatus, updatedAt (время в формате UTC), event (1 — начало действия, 2 — прекращение действия, 3 — возобновление действия), reason (для события прекращения), isCanceled, createdAtCC.

А.2.9 Проверка переноса сведений о сертификате УКЭП в публичный канал

Способ проверки: наблюдение базы глобального состояния публичного канала (Описание решения, п. 3.2.1).

Предварительные условия: выполнены проверки А.2.1, А.2.4, А.2.5 (в приватном канале имеются запись о сертификате, события изменения статуса и логически отменённый сертификат); доступ к базе глобального состояния предоставлен.

Проверка подтверждает автоматический перенос сведений из приватного канала в публичный канал сервисом-ретранслятором ЕСИА: в публичном канале создаётся запись о сертификате с усечённым составом полей — без персональных данных владельца и без самого сертификата, а события изменения статуса и логическая отмена переносятся в запись истории публичного канала. Тем самым подтверждается разделение данных между каналами, предусмотренное ЧТЗ п. 4.2.2.

№

Шаг

Ожидаемый результат

1

Действие: Выполнить выборку записи о тестовом сертификате в публичном канале

Запись содержит: _id; hashTBS; issuerUUID; serialNumber; issuerOGRN; subjectPublicKey; validityNotBefore; validityNotAfter; privateKeyUsagePeriod; isChecked; logicalCancelFlag; createdAtCC.

2

Действие: Проверить отсутствие в записи персональных данных и самого сертификата

В записи публичного канала отсутствуют поля issuer/subject (персональные данные), certificate, warnings, ownerType.

3

Действие: Выполнить выборку записи истории изменения статуса тестового сертификата в публичном канале

Запись истории содержит события, перенесённые из приватного канала, включая событие «1» (начало действия); для логически отменённого сертификата в записи о сертификате logicalCancelFlag = True.

А.2.10 Проверка получения истории статуса сертификата УКЭП

Проверка опирается на запись сертификата в публичном канале (проверка А.2.9) и подтверждает метод получения истории статуса: возвращаются все события изменения статуса сертификата, накопленные в публичном канале. Альтернативный шаг подтверждает обработку запроса по сертификату, отсутствующему в реестре: запрос отклоняется с кодом ошибки ERR-0729.

№

Шаг

Ожидаемый результат

1

Действие: Выполнить запрос GET certificate-validity/qual/all?cert=<идентификатор тестового сертификата>

HTTP 200; возвращена история изменения статуса сертификата: все события (versionStatus, updatedAt, event, reason, createdAtCC).

2

(альтернативный к шагу 1) Действие: Выполнить запрос GET certificate-validity/qual/all?cert=<идентификатор сертификата, отсутствующего в реестре>

Запрос отклонён; возвращён код ошибки ERR-0729.

А.2.11 Проверка получения статуса сертификата УКЭП на заданный момент времени

Предварительные условия: выполнены проверки А.2.1–А.2.5, А.2.9 (сформированы история изменения статуса тестового сертификата и запись в публичном канале); в реестре аккредитации и сертификатов УЦ имеются сведения об аккредитации УЦ-издателя.

Проверка подтверждает представление статуса сертификата УКЭП на заданный момент времени: статус определяется по истории событий (для даты проверки выбирается запись с максимальным updatedAt, не превышающим дату проверки), при этом — в отличие от сертификатов УНЭП (проверка А.3.11) — дополнительно запрашивается статус аккредитации издателя на дату начала действия сертификата, и итоговый статус учитывает и статусы сертификатов цепочки доверия, и статус аккредитации. Возвращаются сведения по проверяемому сертификату, промежуточному и корневому сертификатам цепочки, статус секретного ключа и итоговый статус.

№

Шаг

Ожидаемый результат

1

Действие: Выполнить запрос GET certificate-validity/qual/by-date?cert=<идентификатор>&time='<дата в пределах периода действия сертификата>'

HTTP 200; для даты проверки возвращены: target_cert (certId, localStatus.status = True, details = issued, date, accreditationStatus), sub_ca, root_cert, privateKeyStatus, resultStatus = True.

2

Действие: Выполнить запрос с датой проверки, на которую сертификат был прекращён (после события «2»)

HTTP 200; localStatus.status = False, details = revoked, date = дата события прекращения, reason = код причины; resultStatus = False.

3

Действие: Выполнить запрос с датой проверки, предшествующей дате начала действия сертификата

HTTP 200; localStatus.status = False, details = notYetValid, date = validityNotBefore.

4

Действие: Выполнить запрос по сертификату, выданному УЦ, аккредитация которого не действовала на дату начала действия сертификата (результат проверки А.2.3)

HTTP 200; accreditationStatus = False; resultStatus = False.

5

(альтернативный к шагу 1) Действие: Выполнить запрос по сертификату, отсутствующему в реестре

Запрос отклонён; возвращён код ошибки ERR-0729.

А.2.12 Проверка получения периодов действия сертификата УКЭП

Предварительные условия: сформирована история изменения статуса тестового сертификата (проверки А.2.1, А.2.4); в реестре аккредитации и сертификатов УЦ имеются сведения об аккредитации УЦ-издателя.

Проверка завершает сценарий и подтверждает представление периодов действия сертификата: периоды вычисляются по истории изменения статуса и пересечению периодов действия сертификатов цепочки доверия, при этом для сертификатов УКЭП — с учётом статуса аккредитации издателя: если аккредитация не действовала на дату начала действия сертификата, периоды действия отсутствуют. Результат подтверждает, что сведения, последовательно внесённые в реестр запросами сценария, доступны потребителям в сводном виде.

№

Шаг

Ожидаемый результат

1

Действие: Выполнить запрос GET certificate-validity/qual/periods?cert=<идентификатор тестового сертификата>

HTTP 200; возвращён перечень периодов (from/to), вычисленный по истории изменения статуса с учётом пересечения периодов цепочки доверия; первый период начинается с даты начала действия сертификата.

2

Действие: Выполнить запрос по сертификату, выданному УЦ, аккредитация которого не действовала на дату начала действия сертификата (результат проверки А.2.3)

HTTP 200; возвращён пустой перечень периодов (периоды действия отсутствуют).