Приложение А

Проверки Приложения А соответствуют десяти функциям Требований к функциям Заявки и трём типам задач: проверки А.1–А.3 — типу задач «взаимодействие с внешними информационными системами в части получения и передачи сведений посредством прикладного программного интерфейса (API)» (функции 1–3, требования — пп. 4.2.1–4.2.3 ЧТЗ); проверки А.4–А.7 — типу задач «регистрация в распределённых реестрах сведений» (функции 4–7, требования — пп. 4.2.4–4.2.7 ЧТЗ); проверки А.8–А.10 — типу задач «формирование представления данных на основании записей в распределённых реестрах» (функции 8–10, требования — пп. 4.2.8–4.2.10 ЧТЗ). Проверки Приложения Б — проверки обработки некорректных запросов прикладного программного интерфейса, дополняющие проверки Приложения А. Проверки выполняются последовательно: сначала проверки Приложения А, затем Приложения Б; внутри приложения — в порядке возрастания номеров.

Проверка

Наименование проверки

Использует

А.1

Взаимодействие с внешними информационными системами в части получения и передачи сведений о сертификатах УКЭП и о событиях жизненного цикла сертификатов УКЭП

—

А.2

Взаимодействие с внешними информационными системами в части получения и передачи сведений о сертификатах УНЭП и о событиях жизненного цикла сертификатов УНЭП

—

А.3

Взаимодействие с внешними информационными системами в части получения и передачи сведений об аккредитации удостоверяющих центров

—

А.4

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

А.1

А.5

Регистрация в распределённых реестрах сведений о сертификатах УНЭП и о событиях жизненного цикла сертификатов УНЭП

А.2

А.6

Регистрация в распределённых реестрах сведений об аккредитации удостоверяющих центров

А.3

А.7

Маршрутизация запросов в распределённых реестрах

—

А.8

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

А.1, А.4

А.9

Формирование представления данных о сертификатах УНЭП и о событиях жизненного цикла сертификатов УНЭП

А.2, А.5

А.10

Формирование представления данных об аккредитации удостоверяющих центров

А.3, А.6

Б.1–Б.4

Обработка некорректных запросов прикладного программного интерфейса

А.1, А.2, А.3

А.1 Проверка взаимодействия с внешними информационными системами в части получения и передачи сведений о сертификатах УКЭП и о событиях жизненного цикла сертификатов УКЭП посредством прикладного программного интерфейса (API) для использования в высоконагруженном сервисе.

Проверка обеспечивает проверку реализации пункта 1 Требований к функциям Заявки: сведения о сертификатах УКЭП и о событиях их жизненного цикла принимаются и передаются через прикладной программный интерфейс (API). Подтверждается приём корректного сертификата УКЭП в приватный канал реестра с возвратом идентификатора записи вида «дата начала действия;hashTBS», поиск сертификата по заданному фильтру, изменение статуса сертификата и логическая отмена сертификата. Созданная запись о сертификате и сформированные события истории используются далее при проверках А.4 и А.8.

Предварительные условия: развёрнут тестовый стенд с каналами сертификатов УКЭП; демонстрирующему предоставлены тестовые сертификаты УКЭП и ключ доступа к REST API (заголовок x-api-key).

№

Шаг

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

1

Выполнить запрос «Создать запись о сертификате в приватном канале» (POST /certificate/qual/create), передав сертификат УКЭП в формате PEM:
curl -X POST 'http://{host}:{port}/certificate/qual/create' -H 'Content-Type: application/json' -H 'x-api-key: {ключ доступа}' -d '{"certificate": "-----BEGIN CERTIFICATE-----MIIIEDCCB72gAwIBAgILAJ98pbYAAAAACjwwCgYIKoUDBwEBAwIw…-----END CERTIFICATE-----"}'

HTTP 200; возвращён идентификатор записи вида YYYY-MM-DDTHH:MM:SSZ;hashTBS (далее — {cert}):
{"cert": "2025-03-15T09:00:00Z;6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4c"}

2

Выполнить запрос «Изменить статус сертификата в приватном канале» (POST /certificate/qual/status-update) с event = 2 (прекращение действия), причиной reason = 1 (ключ подписи скомпрометирован) и updatedAt:
curl -X POST 'http://{host}:{port}/certificate/qual/status-update' -H 'Content-Type: application/json' -H 'x-api-key: {ключ доступа}' -d '{"cert": "{cert}", "event": "2", "updatedAt": "2025-09-01T00:00:00Z", "reason": "1"}'
и запрос «Получить сведения о сертификате» (GET /certificate/qual/{cert}/info):
curl -X GET 'http://{host}:{port}/certificate/qual/{cert}/info?logicalCancelFlag=false' -H 'x-api-key: {ключ доступа}'

HTTP 200 по каждому запросу; возвращены сведения о новом событии истории, номер версии события увеличен на 1:
{"version": "2", "event": "2", "updatedAt": "2025-09-01T00:00:00Z", "reason": "1", "createdAtCC": "2025-09-01T00:05:00Z"}
Сведения о сертификате содержат историю из двух событий: «1» (начало действия сертификата) и «2» (прекращение действия сертификата)

3

Выполнить запрос «Получить данные сертификатов по заданному фильтру» (GET /certificate/qual/search) по ИНН владельца:
curl -X GET 'http://{host}:{port}/certificate/qual/search?INN=7743123456' -H 'x-api-key: {ключ доступа}'
и запрос «Логическая отмена» (POST /certificate/qual/cancel):
curl -X POST 'http://{host}:{port}/certificate/qual/cancel' -H 'Content-Type: application/json' -H 'x-api-key: {ключ доступа}' -d '{"cert": "{cert}"}'

HTTP 200 по каждому запросу; сертификат найден по заданному фильтру; в ответе на запрос логической отмены logicalCancelFlag = true:
[{"cert": "2025-03-15T09:00:00Z;6b86b273…5b4c"}]
{"cert": "2025-03-15T09:00:00Z;6b86b273…5b4c", "logicalCancelFlag": true}

А.2 Проверка взаимодействия с внешними информационными системами в части получения и передачи сведений о сертификатах УНЭП и о событиях жизненного цикла сертификатов УНЭП посредством прикладного программного интерфейса (API) для использования в высоконагруженном сервисе.

Проверка обеспечивает проверку реализации пункта 2 Требований к функциям Заявки: сведения о сертификатах УНЭП и о событиях их жизненного цикла принимаются и передаются через прикладной программный интерфейс (API). Подтверждается приём корректных сертификатов в каналы неквалифицированных сертификатов (канал сертификатов издателей Госключ и приватный канал неквалифицированных сертификатов) с возвратом идентификатора записи вида «дата начала действия;hashTBS», изменение статуса сертификата и логическая отмена сертификата. Отличие от проверки А.1 — используемые методы каналов неквалифицированных сертификатов. Созданные записи о сертификатах и сформированные события истории используются далее при проверках А.5 и А.9.

Предварительные условия: развёрнут тестовый стенд с каналами неквалифицированных сертификатов (Госключ) и публичным каналом сертификатов УЦ; демонстрирующему предоставлены тестовые сертификаты УНЭП и ключ доступа к REST API (заголовок x-api-key).

№

Шаг

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

1

Выполнить запрос «Создать запись о сертификате в канале сертификатов издателей Госключ» (POST /certificate/goskey/create), передав сертификат издателя УНЭП в формате PEM:
curl -X POST 'http://{host}:{port}/certificate/goskey/create' -H 'Content-Type: application/json' -H 'x-api-key: {ключ доступа}' -d '{"certificate": "-----BEGIN CERTIFICATE-----MIIG…-----END CERTIFICATE-----"}'
и запрос «Создать запись о сертификате в приватном канале неквалифицированных сертификатов» (POST /certificate/unqual/create), передав сертификат УНЭП в формате PEM:
curl -X POST 'http://{host}:{port}/certificate/unqual/create' -H 'Content-Type: application/json' -H 'x-api-key: {ключ доступа}' -d '{"certificate": "-----BEGIN CERTIFICATE-----MIIF…-----END CERTIFICATE-----"}'

HTTP 200 по каждому запросу; возвращены идентификаторы записей вида YYYY-MM-DDTHH:MM:SSZ;hashTBS (далее — {cert}, идентификатор сертификата УНЭП):
{"cert": "2024-06-01T00:00:00Z;61f0a34e41dd60aedd3f4ab48b88ce547b4e0de09c888ecc026a796d1e09a82a"}
{"cert": "2025-09-01T09:00:00Z;78239b086f164d8105abefad2425e20caaa4825ec52d0fd1c0d049b8076df81a"}

2

Выполнить запрос «Изменить статус сертификата в приватном канале» (POST /certificate/unqual/status-update) с event = 2 (прекращение действия) и updatedAt:
curl -X POST 'http://{host}:{port}/certificate/unqual/status-update' -H 'Content-Type: application/json' -H 'x-api-key: {ключ доступа}' -d '{"cert": "{cert}", "event": "2", "updatedAt": "2025-09-05T00:00:00Z"}'

HTTP 200; возвращены сведения о новом событии истории, номер версии события увеличен на 1:
{"version": "2", "event": "2", "updatedAt": "2025-09-05T00:00:00Z", "createdAtCC": "2025-09-05T00:05:00Z"}

3

Выполнить запрос «Логическая отмена» (POST /certificate/unqual/certificate-cancel), передав идентификатор сертификата, зарегистрированного на шаге 1:
curl -X POST 'http://{host}:{port}/certificate/unqual/certificate-cancel' -H 'Content-Type: application/json' -H 'x-api-key: {ключ доступа}' -d '{"cert": "{cert}"}'

HTTP 200; в ответе logicalCancelFlag = true:
{"cert": "2025-09-01T09:00:00Z;78239b086f164d8105abefad2425e20caaa4825ec52d0fd1c0d049b8076df81a", "logicalCancelFlag": true}

А.3 Проверка взаимодействия с внешними информационными системами в части получения и передачи сведений об аккредитации удостоверяющих центров посредством прикладного программного интерфейса (API) для использования в высоконагруженном сервисе.

Проверка обеспечивает проверку реализации пункта 3 Требований к функциям Заявки: сведения об аккредитации удостоверяющих центров принимаются и передаются через прикладной программный интерфейс (API). Подтверждаются регистрация удостоверяющего центра, изменение и дополнение сведений о нём, а также получение актуальных сведений о зарегистрированном удостоверяющем центре. Созданная запись удостоверяющего центра используется далее при проверках А.6 и А.10.

Предварительные условия: развёрнут тестовый стенд; запущено приложение для тестирования API; демонстрирующему предоставлен ключ доступа к REST API (заголовок x-api-key); используется тестовый УЦ с ОГРН 1027700067340, не занятым другими записями реестра.

№

Шаг

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

1

Выполнить запрос «Регистрация УЦ» (POST /ca/create), передав сведения о тестовом УЦ:
curl -X POST 'http://{host}:{port}/ca/create' -H 'Content-Type: application/json' -H 'x-api-key: {ключ доступа}' -d '{"subjectOGRN": "1027700067340", "subjectINN": "7743020560", "subjectName": "АКЦИОНЕРНОЕ ОБЩЕСТВО «ИНФОТЕКС ИНТЕРНЕТ ТРАСТ»", "subjectAddress": "107078, Москва, г. Москва, ул. Мишина, д. 56, стр. 2, эт. 2, пом. IX, ком. 11"}'

HTTP 200; создана запись «Удостоверяющий центр»; возвращён идентификатор записи; служебные поля времени заполнены:
{"id": "32200046-4ba6-77e3-b30a-c063f2aa6809", "subjectOGRN": "1027700067340", "subjectINN": "7743020560", "subjectName": "АКЦИОНЕРНОЕ ОБЩЕСТВО «ИНФОТЕКС ИНТЕРНЕТ ТРАСТ»", "subjectAddress": "107078, Москва, г. Москва, ул. Мишина, д. 56, стр. 2, эт. 2, пом. IX, ком. 11", "subjectSite": "", "subjectMail": "", "subjectPhone": "", "updatedAt": "", "updateCAReason": "", "linkCAReason": "", "version": 1, "createdAtCC": "2026-09-10T20:21:55Z", "updatedAtCC": "2026-09-10T20:21:55Z"}

2

Выполнить запрос «Изменение сведений об УЦ» (POST /ca/{ogrn}/update-info) с новым адресом расположения и указанием причины изменения:
curl -X POST 'http://{host}:{port}/ca/1027700067340/update-info' -H 'Content-Type: application/json' -H 'x-api-key: {ключ доступа}' -d '{"subjectName": "АКЦИОНЕРНОЕ ОБЩЕСТВО «ИНФОТЕКС ИНТЕРНЕТ ТРАСТ»", "subjectAddress": "107079, Москва, г. Москва, ул. Мишина, д. 56, стр. 2, эт. 2, пом. IX, ком. 11", "updatedAt": "2025-08-12T19:03:11+03:00", "updateCAReason": "Решение о внесении изменений в устав №1 от 12.08.25", "linkCAReason": "d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35"}'
и запрос «Дополнение сведений об УЦ» (POST /ca/{ogrn}/add-info) с контактными сведениями:
curl -X POST 'http://{host}:{port}/ca/1027700067340/add-info' -H 'Content-Type: application/json' -H 'x-api-key: {ключ доступа}' -d '{"subjectSite": "", "subjectMail": "77@iitrust.ru", "subjectPhone": ""}'

HTTP 200 по каждому запросу; номер версии записи увеличен последовательно до 2 и 3; заполнены идентификаторы изменения и дополнения записи; изменённый адрес и контактные сведения сохранены:
{"version": 2, "subjectAddress": "107079, Москва, г. Москва, ул. Мишина, д. 56, стр. 2, эт. 2, пом. IX, ком. 11", "updatedAt": "2025-08-12T19:03:11+03:00", "updateCAReason": "Решение о внесении изменений в устав №1 от 12.08.25", "linkCAReason": "d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35", "dataChangeID": "a7f4f264b06a17185184529bb6f0914901ae1bff803367c5809834060bf7b964"}
{"version": 3, "subjectMail": "77@iitrust.ru", "dataAppendID": "8e08b774ef1973bf6c9f23aec4be9606fac367032ec7ac1a26fce965a3f4f1e6"}

3

Выполнить запрос «Получить УЦ по ОГРН» (GET /ca/{ogrn}/info):
curl -X GET 'http://{host}:{port}/ca/1027700067340/info' -H 'x-api-key: {ключ доступа}'

HTTP 200; возвращены актуальные сведения о зарегистрированном удостоверяющем центре с учётом изменения и дополнения:
{"id": "32200046-4ba6-77e3-b30a-c063f2aa6809", "subjectOGRN": "1027700067340", "subjectINN": "7743020560", "subjectName": "АКЦИОНЕРНОЕ ОБЩЕСТВО «ИНФОТЕКС ИНТЕРНЕТ ТРАСТ»", "subjectAddress": "107079, Москва, г. Москва, ул. Мишина, д. 56, стр. 2, эт. 2, пом. IX, ком. 11", "subjectSite": "", "subjectMail": "77@iitrust.ru", "subjectPhone": "", "updatedAt": "2025-08-12T19:03:11+03:00", "updateCAReason": "Решение о внесении изменений в устав №1 от 12.08.25", "linkCAReason": "d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35", "dataChangeID": "a7f4f264b06a17185184529bb6f0914901ae1bff803367c5809834060bf7b964", "dataAppendID": "8e08b774ef1973bf6c9f23aec4be9606fac367032ec7ac1a26fce965a3f4f1e6", "version": 3, "createdAtCC": "2026-09-10T20:21:55Z", "updatedAtCC": "2026-09-10T20:22:25Z"}

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

Проверка подтверждает реализацию требований пункта 4 Требований к функциям Заявки: сведения о сертификатах УКЭП и о событиях их жизненного цикла зарегистрированы в распределённом реестре, а не ограничиваются ответом метода. Регистрация подтверждается непосредственным обращением к прикладному чейнкоду: получением полной записи из канала ГУЦ, публичной копии усечённого состава и истории изменения статуса из публичного канала. Проверка опирается на запись о сертификате, созданную проверкой А.1, и предваряет проверку А.8.

Предварительные условия: развёрнут тестовый стенд; в канале ГУЦ зарегистрирован тестовый сертификат ГУЦ (глобальный идентификатор записи 2e4000b7-7106-72d1-962c-bddab4605cb7); демонстрирующему предоставлен доступ к командной оболочке узла admin0.esiapeer.ru и средства вызова прикладного чейнкода (peer chaincode query); в окружении вызова доступен интерпретатор jq.

№

Шаг

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

1

Вызвать метод «Получение сведений о сертификате» (UserCertificateContract:Get) прикладного чейнкода канала ГУЦ, передав в transient-данных глобальный идентификатор записи, с отбором целевых строк о сертификате:

docker exec admin0.esiapeer.ru bash -c "\<br/>export CORE_PEER_ADDRESS=peer0.esiapeer.ru:7051; \<br/>export CORE_PEER_TLS_ENABLED=true; \<br/>export CORE_PEER_TLS_ROOTCERT_FILE=/var/opt/itcs/fabric/ca/cacerts/CA.pem; \<br/>peer chaincode query -C mca-channel -n main_cc_chaincode \<br/>-c '{\"function\":\"UserCertificateContract:Get\",\"Args\":[]}' —transient '{\"Args\":\"eyJpZCI6ICIyZTQwMDBiNy03MTA2LTcyZDEtOTYyYy1iZGRhYjQ2MDVjYjcifQ==\"}' \<br/>| jq -r '\"cert: \(.validityNotBefore);\(.idCertificate)\", \"id: \(.id)\", \"issuer: \(.issuer.commonName)\", (if .subject then \"subject: есть\" else \"subject: нет\" end), (if .certificate then \"certificate: есть\" else \"certificate: нет\" end)'"

Возвращены сведения о сертификате ГУЦ из приватного канала: составной идентификатор записи и глобальный идентификатор записи, совпадающий с переданным при вызове, наименование издателя, а также сведения о владельце и значение сертификата — в отличие от публичной копии усечённого состава (шаг 2):
cert: 2026-09-28T08:14:51Z;1c91d61627e277b478fbe17aa2e2bf228b978992443cb646feeb9b1dc1f734e5
id: 2e4000b7-7106-72d1-962c-bddab4605cb7
issuer: Тестовый самоподписанный сертификат ГУЦ
subject: есть
certificate: есть

2

Вызвать метод «Получение сведений о публичной копии сертификата» (UserCertificateContract:GetPublic) прикладного чейнкода публичного канала, передав в transient-данных тот же глобальный идентификатор записи, с отбором целевых строк о сертификате:

docker exec admin0.esiapeer.ru bash -c "\<br/>export CORE_PEER_ADDRESS=peer0.esiapeer.ru:7051; \<br/>export CORE_PEER_TLS_ENABLED=true; \<br/>export CORE_PEER_TLS_ROOTCERT_FILE=/var/opt/itcs/fabric/ca/cacerts/CA.pem; \<br/>peer chaincode query -C aca-pub-channel -n aca_pub_chaincode \<br/>-c '{\"function\":\"UserCertificateContract:GetPublic\",\"Args\":[]}' —transient '{\"Args\":\"eyJpZCI6ICIyZTQwMDBiNy03MTA2LTcyZDEtOTYyYy1iZGRhYjQ2MDVjYjcifQ==\"}' \<br/>| jq -r '\"cert: \(.validityNotBefore);\(.hashTBS)\", \"id: \(.id)\"'"

Возвращены сведения о публичной копии сертификата: составной идентификатор записи и глобальный идентификатор записи, совпадающий с переданным при вызове:
cert: 2026-09-28T08:14:51Z;1c91d61627e277b478fbe17aa2e2bf228b978992443cb646feeb9b1dc1f734e5
id: 2e4000b7-7106-72d1-962c-bddab4605cb7

3

Вызвать метод «Получение истории изменения статуса сертификата» (UserCertificateContract:GetStatusHistory) прикладного чейнкода публичного канала, передав в transient-данных составной идентификатор сертификата, с отбором по одному событию на строку:

docker exec admin0.esiapeer.ru bash -c "\<br/>export CORE_PEER_ADDRESS=peer0.esiapeer.ru:7051; \<br/>export CORE_PEER_TLS_ENABLED=true; \<br/>export CORE_PEER_TLS_ROOTCERT_FILE=/var/opt/itcs/fabric/ca/cacerts/CA.pem; \<br/>peer chaincode query -C aca-pub-channel -n aca_pub_chaincode \<br/>-c '{\"function\":\"UserCertificateContract:GetStatusHistory\",\"Args\":[]}' —transient '{\"Args\":\"eyJjZXJ0IjogIjIwMjYtMDktMjhUMDg6MTQ6NTFaOzFjOTFkNjE2MjdlMjc3YjQ3OGZiZTE3YWEyZTJiZjIyOGI5Nzg5OTI0NDNjYjY0NmZlZWI5YjFkYzFmNzM0ZTUifQ==\"}' \<br/>| jq -r '.history[] | [.versionStatus, .updatedAt, .event, .reason, .isCanceled] | @tsv'"

Возвращён перечень событий жизненного цикла сертификата: по одному событию на строку (версия записи истории, дата и время вступления в силу, событие, причина, признак отмены события). В перечне присутствует событие начала действия сертификата (код 1) с датой вступления в силу, равной дате начала действия сертификата; признак отмены события isCanceled = false:
1 2026-09-28T08:14:51Z 1 false

А.5 Проверка регистрации в распределённых реестрах сведений о сертификатах УНЭП и о событиях жизненного цикла сертификатов УНЭП для использования в высоконагруженном сервисе.

Проверка подтверждает реализацию требований пункта 5 Требований к функциям Заявки: сведения о сертификатах УНЭП и о событиях их жизненного цикла зарегистрированы в распределённом реестре. Регистрация подтверждается непосредственным обращением к прикладному чейнкоду каналов неквалифицированных сертификатов: получением записи из приватного канала неквалифицированных сертификатов и истории изменения статуса из публичного канала. Проверка опирается на записи, созданные проверкой А.2, и предваряет проверку А.9.

Предварительные условия: развёрнут тестовый стенд с каналами неквалифицированных сертификатов; зарегистрирован тестовый сертификат УНЭП (идентификатор {cert} — результат проверки А.2); демонстрирующему предоставлен доступ к командной оболочке узла admin0.esiapeer.ru и средства вызова прикладного чейнкода (peer chaincode query); в окружении вызова доступен интерпретатор jq.

№

Шаг

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

1

Вызвать метод «Получение сведений о сертификате» прикладного чейнкода приватного канала неквалифицированных сертификатов, передав глобальный идентификатор записи {id}, с отбором целевых строк о сертификате:

docker exec admin0.esiapeer.ru bash -c "\<br/>export CORE_PEER_ADDRESS=peer0.esiapeer.ru:7051; \<br/>export CORE_PEER_TLS_ENABLED=true; \<br/>export CORE_PEER_TLS_ROOTCERT_FILE=/var/opt/itcs/fabric/ca/cacerts/CA.pem; \<br/>peer chaincode query -C goskey-priv-channel -n goskey_priv_chaincode \<br/>-c '{\"function\":\"UserCertificateContract:GetNoTransient\",\"Args\":[\"{id}\"]}' \<br/>| jq -r '\"cert: \(.validityNotBefore);\(.idCertificate)\", \"id: \(.id)\"'"

Возвращены сведения о сертификате УНЭП из приватного канала: составной идентификатор записи и глобальный идентификатор записи, совпадающий с переданным при вызове; в составе записи — тип сертификата, определённый при внесении (END_ENTITY), сведения о владельце и значение сертификата:
cert: 2025-09-01T09:00:00Z;78239b086f164d8105abefad2425e20caaa4825ec52d0fd1c0d049b8076df81a
id: {id}

2

Вызвать метод «Получение истории изменения статуса сертификата» прикладного чейнкода публичного канала, передав в transient-данных составной идентификатор сертификата {cert}, с отбором по одному событию на строку:

docker exec admin0.esiapeer.ru bash -c "\<br/>export CORE_PEER_ADDRESS=peer0.esiapeer.ru:7051; \<br/>export CORE_PEER_TLS_ENABLED=true; \<br/>export CORE_PEER_TLS_ROOTCERT_FILE=/var/opt/itcs/fabric/ca/cacerts/CA.pem; \<br/>peer chaincode query -C aca-pub-channel -n aca_pub_chaincode \<br/>-c '{\"function\":\"UserCertificateContract:GetStatusHistory\",\"Args\":[]}' —transient '{\"Args\":\"eyJjZXJ0IjogIjIwMjUtMDktMDFUMDk6MDA6MDBaOzc4MjM5YjA4NmYxNjRkODEwNWFiZWZhZDI0MjVlMjBjYWFhNDgyNWVjNTJkMGZkMWMwZDA0OWI4MDc2ZGY4MWEifQ==\"}' \<br/>| jq -r '.history[] | [.versionStatus, .updatedAt, .event, .reason, .isCanceled] | @tsv'"

Возвращён перечень событий жизненного цикла сертификата: по одному событию на строку (версия записи истории, дата и время вступления в силу, событие, причина, признак отмены события). В перечне присутствует событие начала действия сертификата (код 1) с датой вступления в силу, равной дате начала действия сертификата; признак отмены события isCanceled = false

А.6 Проверка регистрации в распределённых реестрах сведений об аккредитации удостоверяющих центров для использования в высоконагруженном сервисе.

Проверка подтверждает реализацию требований пункта 6 Требований к функциям Заявки: сведения об аккредитации удостоверяющих центров зарегистрированы в распределённом реестре. Регистрация подтверждается непосредственным обращением к прикладному чейнкоду канала аккредитации и сертификатов УЦ: получением записи удостоверяющего центра и истории аккредитаций. Проверка опирается на запись об удостоверяющем центре, созданную проверкой А.3, и предваряет проверку А.10.

Предварительные условия: развёрнут тестовый стенд; зарегистрирован тестовый УЦ с ОГРН 1027700067340 (результат проверки А.3); демонстрирующему предоставлен доступ к командной оболочке узла admin0.esiapeer.ru и средства вызова прикладного чейнкода (peer chaincode query); в окружении вызова доступен интерпретатор jq.

№

Шаг

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

1

Вызвать метод получения сведений об удостоверяющем центре прикладного чейнкода канала аккредитации и сертификатов УЦ, передав ОГРН удостоверяющего центра (1027700067340), с отбором целевых строк:

docker exec admin0.esiapeer.ru bash -c "\<br/>export CORE_PEER_ADDRESS=peer0.esiapeer.ru:7051; \<br/>export CORE_PEER_TLS_ENABLED=true; \<br/>export CORE_PEER_TLS_ROOTCERT_FILE=/var/opt/itcs/fabric/ca/cacerts/CA.pem; \<br/>peer chaincode query -C {канал аккредитации и сертификатов УЦ} -n {прикладной чейнкод канала аккредитации} \<br/>-c '{\"function\":\"{метод получения сведений об УЦ}\",\"Args\":[\"1027700067340\"]}' \<br/>| jq -r '\"ogrn: \(.subjectOGRN)\", \"name: \(.subjectName)\", \"version: \(.version)\""

Возвращены сведения об удостоверяющем центре из канала аккредитации и сертификатов УЦ: ОГРН, полное наименование, номер версии записи (3 — после изменения и дополнения сведений в проверке А.3):
ogrn: 1027700067340
name: АКЦИОНЕРНОЕ ОБЩЕСТВО «ИНФОТЕКС ИНТЕРНЕТ ТРАСТ»
version: 3

2

Вызвать метод получения истории аккредитаций прикладного чейнкода канала аккредитации и сертификатов УЦ, передав ОГРН удостоверяющего центра, с отбором по одному событию на строку:

docker exec admin0.esiapeer.ru bash -c "\<br/>export CORE_PEER_ADDRESS=peer0.esiapeer.ru:7051; \<br/>export CORE_PEER_TLS_ENABLED=true; \<br/>export CORE_PEER_TLS_ROOTCERT_FILE=/var/opt/itcs/fabric/ca/cacerts/CA.pem; \<br/>peer chaincode query -C {канал аккредитации и сертификатов УЦ} -n {прикладной чейнкод канала аккредитации} \<br/>-c '{\"function\":\"{метод получения истории аккредитаций}\",\"Args\":[\"1027700067340\"]}' \<br/>| jq -r '.history[] | [.version, .status, .updatedAt, .isCanceled] | @tsv'"

Возвращён перечень событий жизненного цикла аккредитации: по одному событию на строку (версия записи, статус, дата и время вступления в силу, признак отмены события). События соответствуют проверке А.3; событие аннулирования (статус «5») сохранено с признаком isCanceled = true

А.7 Проверка маршрутизации запросов в распределённых реестрах для использования в высоконагруженном сервисе.

Проверка подтверждает реализацию требований пункта 7 Требований к функциям Заявки: маршрутизация запросов в распределённых реестрах выполняется по идентификатору объекта. Подтверждаются перечень зарегистрированных реестров (сервисный чейнкод) и определение пары значений «наименование канала + наименование чейнкода», соответствующей реестру актива. Проверка не зависит от результатов других проверок.

Предварительные условия: развёрнут тестовый стенд; сервисный чейнкод развёрнут в канале ГУЦ; демонстрирующему предоставлены доступ к командной оболочке узла admin0.esiapeer.ru и средства вызова методов сервисного чейнкода; в окружении вызова доступен интерпретатор jq.

№

Шаг

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

1

Вызвать метод «Перечень реестров» (RegistryContract:ListRegistries) сервисного чейнкода, с отбором по одному реестру на строку:

docker exec admin0.esiapeer.ru bash -c "\<br/>export CORE_PEER_ADDRESS=peer0.esiapeer.ru:7051; \<br/>export CORE_PEER_TLS_ENABLED=true; \<br/>export CORE_PEER_TLS_ROOTCERT_FILE=/var/opt/itcs/fabric/ca/cacerts/CA.pem; \<br/>peer chaincode query -C mca-channel -n service_chaincode \<br/>-c '{\"function\":\"RegistryContract:ListRegistries\",\"Args\":[]}' —transient '{\"Args\":\"e30=\"}' \<br/>| jq -r '.result[] | [.actual.registryID, .actual.channel, .actual.chaincode, .actual.private_channel] | @tsv'"

Возвращён перечень зарегистрированных реестров: по одному реестру на строку (идентификатор реестра, публичный канал, чейнкод, приватный канал). В перечне присутствуют реестр со значением идентификатора 0 (до ротации) и реестр со значением идентификатора 1 (после ротации):
1 aca-pub-channel aca_pub_chaincode iit-aca-priv-channel
0 ca-pub-channel ca_pub_chaincode goskey-priv-channel
0 aca-pub-channel aca_pub_chaincode mca-priv-channel

2

Вызвать метод «Определение реестра по идентификатору объекта» (ResolveUUID, GetRegisterByUUID) сервисного чейнкода, передав UUID объекта, размещённого в действующем либо ранее созданном реестре:
{"uuid": "{uuid}"}

Возвращена пара значений: channelName, chaincodeName:
{"channelName": "aca-pub-channel", "chaincodeName": "aca_pub_chaincode"}
Запрос к активу выполняется в канале, соответствующем реестру, в котором размещён актив

Проверки А.8–А.10 подтверждают, что представления данных формируются на основании записей распределённых реестров. Проверки выполняются по БД Глобального состояния (world state) средствами DBeaver либо по составу передаваемых сообщений (protobuf). Имена коллекций БД Глобального состояния уточняются на стенде; в шагах используются условные обозначения: КОЛЛЕКЦИЯ_1.1 — коллекция сертификатов УКЭП (приватный канал), КОЛЛЕКЦИЯ_1.2 — коллекция истории статусов сертификатов УКЭП, КОЛЛЕКЦИЯ_1.3 — коллекция публичных сведений о сертификатах УКЭП; КОЛЛЕКЦИЯ_2.1, КОЛЛЕКЦИЯ_2.2, КОЛЛЕКЦИЯ_2.3 — соответствующие коллекции сертификатов УНЭП; КОЛЛЕКЦИЯ_3.1 — коллекция удостоверяющих центров, КОЛЛЕКЦИЯ_3.2 — коллекция истории аккредитаций удостоверяющих центров.

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

Проверка подтверждает реализацию требований пункта 8 Требований к функциям Заявки: представление данных о сертификатах УКЭП и о событиях их жизненного цикла формируется на основании записей распределённого реестра. Проверяется непосредственно БД Глобального состояния: запись о сертификате в приватном канале, история изменения статуса и публичная копия усечённого состава. Проверка опирается на записи, сформированные проверками А.1 и А.4.

Предварительные условия: сформированы запись о тестовом сертификате УКЭП и события его истории (результаты проверок А.1 и А.4); демонстрирующему предоставлены учётные данные для подключения к БД Глобального состояния (DBeaver).

№

Шаг

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

1

Открыть источник данных КОЛЛЕКЦИЯ_1.1 и найти запись о сертификате по составному идентификатору {cert} (результат проверки А.1)

Найдена запись о сертификате в приватном канале; запись содержит: _id (UUID), hashTBS, issuerUUID, serialNumber, validityNotBefore, validityNotAfter, сведения об издателе и владельце, значение сертификата (certificate), isChecked = true, logicalCancelFlag = false, createdAtCC

2

Открыть источник данных КОЛЛЕКЦИЯ_1.2 и найти историю изменения статуса сертификата по составному идентификатору {cert}

Найдены события истории изменения статуса сертификата: событие начала действия (код 1) и события, сформированные в проверке А.1; каждое событие содержит: versionStatus, updatedAt, event, reason, isCanceled = false, createdAtCC

3

Открыть источник данных КОЛЛЕКЦИЯ_1.3 и найти публичную копию сведений о сертификате по составному идентификатору {cert}

Найдена публичная копия сведений о сертификате усечённого состава: hashTBS, issuerOGRN, serialNumber, subjectPublicKey, validityNotBefore, validityNotAfter, privateKeyUsagePeriod, isChecked, logicalCancelFlag; значение сертификата и персональные данные владельца в публичной копии отсутствуют

А.9 Проверка формирования представления данных о сертификатах УНЭП и о событиях жизненного цикла сертификатов УНЭП на основании записей в распределённых реестрах для использования в высоконагруженном сервисе.

Проверка подтверждает реализацию требований пункта 9 Требований к функциям Заявки: представление данных о сертификатах УНЭП и о событиях их жизненного цикла формируется на основании записей распределённого реестра. Проверяется непосредственно БД Глобального состояния: запись о сертификате в приватном канале неквалифицированных сертификатов и история изменения статуса. Отличие от проверки А.8 — в записи фиксируется определённый при внесении тип сертификата (END_ENTITY), а поле issuerOGRN может быть не заполнено. Проверка опирается на записи, сформированные проверками А.2 и А.5.

Предварительные условия: сформированы запись о тестовом сертификате УНЭП и события его истории (результаты проверок А.2 и А.5); демонстрирующему предоставлены учётные данные для подключения к БД Глобального состояния (DBeaver).

№

Шаг

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

1

Открыть источник данных КОЛЛЕКЦИЯ_2.1 и найти запись о сертификате по составному идентификатору {cert} (результат проверки А.2)

Найдена запись о сертификате УНЭП в приватном канале неквалифицированных сертификатов; запись содержит: _id (UUID), hashTBS, serialNumber, validityNotBefore, validityNotAfter, тип сертификата, определённый при внесении (END_ENTITY), сведения об издателе (по commonName, поле issuerOGRN может быть не заполнено) и владельце, значение сертификата, isChecked = true, logicalCancelFlag = false

2

Открыть источник данных КОЛЛЕКЦИЯ_2.2 и найти историю изменения статуса сертификата по составному идентификатору {cert}

Найдены события истории изменения статуса сертификата: событие начала действия (код 1) и события, сформированные в проверке А.2; каждое событие содержит: versionStatus, updatedAt, event, reason, isCanceled = false

А.10 Проверка формирования представления данных об аккредитации удостоверяющих центров на основании записей в распределённых реестрах для использования в высоконагруженном сервисе.

Проверка подтверждает реализацию требований пункта 10 Требований к функциям Заявки: представление данных об аккредитации удостоверяющих центров формируется на основании записей распределённого реестра. Проверяется непосредственно БД Глобального состояния: запись удостоверяющего центра и события истории аккредитаций, включая отменённое. Проверка опирается на события, сформированные проверками А.3 и А.6.

Предварительные условия: сформированы события аккредитации тестового УЦ, включая отменённое (результаты проверок А.3 и А.6); демонстрирующему предоставлены учётные данные для подключения к БД Глобального состояния (DBeaver).

№

Шаг

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

1

Открыть источник данных КОЛЛЕКЦИЯ_3.1 и найти запись удостоверяющего центра по ОГРН 1027700067340

Найдена запись удостоверяющего центра; запись содержит: id (UUID), subjectOGRN = 1027700067340, subjectINN = 7743020560, полное наименование, адрес расположения, контактные сведения, version = 3, dataChangeID, dataAppendID, createdAtCC

2

Открыть источник данных КОЛЛЕКЦИЯ_3.2 и найти историю аккредитаций удостоверяющего центра по ОГРН 1027700067340

Найдены события жизненного цикла аккредитации (версии 1–5 по проверке А.3): предоставлена (статус «1»), приостановлена («3»), возобновлена («4»), прекращена («2»), аннулирована («5»); событие аннулирования сохранено с признаком отмены isCanceled = true и сведениями об отмене (canceledAt, cancelHash)

Приложение Б

Б.1 Проверка обработки запроса с несуществующим ОГРН

Проверка подтверждает, что запросы к методам реестра с указанием ОГРН, не зарегистрированного в реестре удостоверяющих центров, а также с ОГРН, не прошедшим форматно-логический контроль, отклоняются с возвратом кода ошибки. Проверка дополняет проверку А.3: приёму корректных сведений об удостоверяющем центре противопоставляется отказ в обработке недостоверных сведений.

Предварительные условия: развёрнут тестовый стенд; демонстрирующему предоставлен ключ доступа к REST API (заголовок x-api-key).

№

Шаг

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

1

Выполнить запрос «История аккредитаций УЦ» (GET /ca/{ogrn}/accreditation) с ОГРН, отсутствующим в реестре удостоверяющих центров:
curl -X GET 'http://{host}:{port}/ca/9999999999999/accreditation' -H 'x-api-key: {ключ доступа}'

HTTP 200; запрос отклонён с возвратом кода ошибки ввиду отсутствия удостоверяющего центра в реестре; перечень событий аккредитации не возвращён

2

Выполнить запрос «Регистрация УЦ» (POST /ca/create) с ОГРН, не прошедшим форматно-логический контроль (12 цифр вместо 13):
curl -X POST 'http://{host}:{port}/ca/create' -H 'Content-Type: application/json' -H 'x-api-key: {ключ доступа}' -d '{"subjectOGRN": "102770006734", "subjectINN": "7743020560", "subjectName": "АКЦИОНЕРНОЕ ОБЩЕСТВО «ИНФОТЕКС ИНТЕРНЕТ ТРАСТ»", "subjectAddress": "107078, Москва, г. Москва, ул. Мишина, д. 56, стр. 2, эт. 2, пом. IX, ком. 11"}'

HTTP 200; запрос отклонён с возвратом кода ошибки по результатам форматно-логического контроля; запись «Удостоверяющий центр» не создана

Б.2 Проверка обработки идентификатора сертификата с недопустимыми символами

Проверка подтверждает, что запрос логической отмены сертификата с идентификатором, содержащим недопустимые символы (кириллицу), отклоняется с возвратом кода ошибки разбора идентификатора. Проверка дополняет проверку А.1: корректному идентификатору записи вида «дата начала действия;hashTBS» противопоставляется идентификатор с недопустимыми символами в части значения хэш-функции.

Предварительные условия: развёрнут тестовый стенд с каналами сертификатов УКЭП; демонстрирующему предоставлен ключ доступа к REST API (заголовок x-api-key).

№

Шаг

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

1

Выполнить запрос «Логическая отмена» (POST /certificate/qual/cancel), передав идентификатор сертификата с кириллицей в части значения хэш-функции:
curl -X POST 'http://{host}:{port}/certificate/qual/cancel' -H 'Content-Type: application/json' -H 'x-api-key: {ключ доступа}' -d '{"cert": "2025-03-15T09:00:00Z;сертификат"}'

HTTP 200; возвращён код ошибки ERR-0731 «Ошибка разбора идентификатора cert»; логическая отмена сертификата не выполнена, запись о сертификате не изменена

Б.3 Проверка обработки даты изменения статуса с неверным форматом

Проверка подтверждает, что запросы изменения статуса сертификата с датой и временем вступления изменения в силу, заданными в неверном формате, отклоняются с возвратом кода ошибки. Проверка дополняет проверку А.1: корректному значению updatedAt противопоставляется значение, не соответствующее установленному формату.

Предварительные условия: развёрнут тестовый стенд с каналами сертификатов УКЭП и УНЭП; имеются идентификаторы зарегистрированных сертификатов {cert} (результаты проверок А.1 и А.2); демонстрирующему предоставлен ключ доступа к REST API (заголовок x-api-key).

№

Шаг

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

1

Выполнить запрос «Изменить статус сертификата в приватном канале» (POST /certificate/qual/status-update), передав updatedAt в неверном формате:
curl -X POST 'http://{host}:{port}/certificate/qual/status-update' -H 'Content-Type: application/json' -H 'x-api-key: {ключ доступа}' -d '{"cert": "{cert}", "event": "2", "updatedAt": "01.01.2026", "reason": "1"}'

HTTP 200; возвращён код ошибки ERR-0802 «У поля updatedAt некорректный формат»; статус сертификата не изменён, новое событие истории не сформировано

2

Выполнить запрос «Изменить статус сертификата в приватном канале» (POST /certificate/unqual/status-update), передав updatedAt в неверном формате:
curl -X POST 'http://{host}:{port}/certificate/unqual/status-update' -H 'Content-Type: application/json' -H 'x-api-key: {ключ доступа}' -d '{"cert": "{cert}", "event": "2", "updatedAt": "31.02.2025"}'

HTTP 200; возвращён код ошибки ERR-0802 «У поля updatedAt некорректный формат»; статус сертификата не изменён, новое событие истории не сформировано

Б.4 Проверка обработки идентификатора несуществующего сертификата

Проверка подтверждает, что запросы представлений данных о сертификате с идентификатором, отсутствующим в реестре, отклоняются с возвратом кода ошибки. Проверка дополняет проверки А.8 и А.9: корректному идентификатору зарегистрированного сертификата противопоставляется корректный по формату идентификатор несуществующего сертификата.

Предварительные условия: развёрнут тестовый стенд; демонстрирующему предоставлен ключ доступа к REST API (заголовок x-api-key).

№

Шаг

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

1

Выполнить запрос «История статуса сертификата» (GET /certificate-validity/qual/all) с идентификатором, корректным по формату, но отсутствующим в реестре:
curl -X GET 'http://{host}:{port}/certificate-validity/qual/all?cert=2020-01-01T00:00:00Z;9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08' -H 'x-api-key: {ключ доступа}'

HTTP 200; возвращён код ошибки ERR-0729 «Отсутствует сертификат»; история изменения статуса не возвращена

2

Выполнить запрос «История изменения статуса неквалифицированного сертификата» (GET /certificate-validity/unqual/all) с идентификатором, корректным по формату, но отсутствующим в реестре:
curl -X GET 'http://{host}:{port}/certificate-validity/unqual/all?cert=2020-01-01T00:00:00Z;9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08' -H 'x-api-key: {ключ доступа}'

HTTP 200; возвращён код ошибки ERR-0729 «Отсутствует сертификат»; история изменения статуса не возвращена