Перейти к основному содержимому
Didit привлёк $7,5 млн на инфраструктуру для идентификации и борьбы с мошенничеством
Didit
В блог
Блог · 6 октября 2026 г.

Руководство для верификатора OpenID4VP: приём EUDI Wallet

Как работает верификатор OpenID4VP для EUDI Wallet: объекты запроса, запросы DCQL, режимы ответа, проверки SD-JWT VC и mdoc, правила HAIP в праве ЕС, типичные ошибки и где тестировать.

Автор: DiditОбновлено
openid4vp-verifier-cover.png

Коротко

OpenID4VP (OpenID for Verifiable Presentations), это протокол, с помощью которого верификатор запрашивает у цифрового кошелька учётные данные и получает обратно подписанное предъявление. 10 июля 2025 года версия 1.0 получила статус OpenID Final Specification. Европейский кошелёк цифровой идентичности (EUDI Wallet) использует этот протокол для удалённого предъявления.[2][3]

  • Вы отправляете подписанный запрос с DCQL-запросом. Кошелёк возвращает VP Token.
  • Подпись эмитента, раскрытия (disclosures), привязку ключа и отзыв вы проверяете сами.
  • Для EUDI Wallet право ЕС добавляет правила о сертификатах и регистрации.

Последняя проверка: 5 октября 2026 г. · Не является юридической консультацией

OpenID4VP позволяет сайту или приложению попросить кошелёк подтвердить сведения о человеке, например имя или дату рождения. Верификатор указывает, какие учётные данные и утверждения ему нужны. Пользователь даёт согласие в кошельке. Кошелёк возвращает предъявление, которое верификатор проверяет криптографически. Согласно самой спецификации, она «определяет протокол запроса и предъявления учётных данных (Credentials)».[1]

Это руководство для разработчиков, которые создают верификатор OpenID4VP для EUDI Wallet. В нём разобраны объект запроса, DCQL, режимы ответа, сценарии работы с устройствами, проверки SD-JWT VC и mdoc, правила HAIP в праве ЕС, типичные ошибки и среды для тестирования.

OpenID4VP простыми словами

OpenID4VP повторяет структуру запроса авторизации OAuth 2.0. Верификатор запрашивает тип ответа vp_token. Успешный ответ должен содержать параметр vp_token с предъявлениями.[1] Обменивать код или токен доступа не нужно: данные приходят в самом ответе.

Кошелёк аутентифицирует доверяющую сторону и проверяет, что она запрашивает не больше, чем зарегистрировала. Затем он получает согласие пользователя и подписывает предъявление. После этого доверяющая сторона проверяет подпись эмитента, статус отзыва и привязку к устройству.[3] Идентификационные данные лица (PID) выдаются в двух форматах: SD-JWT VC и ISO/IEC mdoc. Оба формата используют хеши с солью, поэтому пользователь может раскрыть одни атрибуты и скрыть остальные.[5][3]

  1. 10 июля 2025Окончательная спецификацияOpenID4VP 1.0 утверждён.
  2. 22 июля 2026ПубликацияCIR 2026/1731 (принят 15 июля 2026 года) опубликован в Официальном журнале.
  3. 23 июля 2026ARF v3.0.0Текущая версия архитектуры.
  4. 24 декабря 2026КошелькиНе менее одного в каждом государстве-члене.
  5. 24 декабря 2027ПриёмРегулируемые частные доверяющие стороны.

От окончательной спецификации до даты приёма частным сектором.[2][3][4][5]

Как проходит обмен с верификатором OpenID4VP

OpenID4VP приводит эталонную схему для режима ответа direct_post. В этом режиме кошелёк отправляет ответ POST-запросом на серверную конечную точку, а не через браузер.[1]

Браузер пользователя Фронтенд верификатора Конечная точка ответа Кошелёк
1Начинает верификацию
2Открытие транзакции
3Идентификаторы транзакции и запроса
4Запрос с nonce, DCQL

Кошелёк проверяет верификатора, пользователь даёт согласие

5POST VP Token, state
6Перенаправление с кодом ответа
7Возврат на сайт
8Получение по коду
9VP Token

Эталонная схема direct_post из OpenID4VP 1.0, раздел 13.3, в упрощённом виде.[1]

  • Для каждого запроса генерируйте nonce длиной «не менее 16 свежих криптографически случайных байтов».
  • Передайте request-id от response endpoint в кошелёк как state.
  • После того как кошелёк отправит ответ, верните redirect URI с новым response_code.
  • Получите VP Token по transaction-id и этому коду, затем проверьте nonce.

response_code защищает от фиксации сессии, когда злоумышленник перенаправляет ваш запрос в кошелёк жертвы. В спецификации отмечено, что при работе между разными устройствами он не помогает, и для таких случаев рекомендованы дополнительные механизмы.[1]

Видео готовится: flow-eudi-openid4vp

Предъявление OpenID4VP из EUDI Wallet от начала до конца.

Объект запроса OpenID4VP и идентификаторы клиента

client_id начинается с Client Identifier Prefix, который сообщает кошельку, как аутентифицировать проверяющую сторону.[1] Крупные запросы передаются по ссылке: кошелёк загружает подписанный объект запроса по request_uri. Для QR-кодов спецификация рекомендует direct_post с request_uri, поскольку запрос «может не поместиться в QR-код».[1]

ПрефиксКак кошелёк аутентифицирует проверяющую сторонуПодписанный запрос
redirect_uriИдентификатором служит redirect URI или response URIПодписать нельзя
x509_san_dnsDNS-имя в SAN конечного сертификатаОбязателен
x509_hashХеш SHA-256 конечного сертификатаОбязателен
decentralized_identifierКлюч из DID DocumentОбязателен
verifier_attestationJWT аттестации от издателя, которому доверяет кошелёкОбязателен
openid_federationЦепочка доверия федерацииСогласно OpenID Federation

Префиксы идентификатора клиента (Client Identifier Prefixes), OpenID4VP 1.0, раздел 5.9.[1]

Для верификаторов EUDI префикс определяет право ЕС: конечный сертификат «для использования с префиксом идентификатора клиента x509_hash должен быть сертификатом доступа RP, как указано в ETSI TS 119 475», а один элемент verifier_info «должен включать регистрационный сертификат».[5]

Запросы DCQL: запрашивайте то, что зарегистрировали

Digital Credentials Query Language (DCQL) это JSON-запрос, в котором указываются нужные вам учетные данные и атрибуты. Он содержит обязательный массив credentials и необязательный массив credential_sets. Каждому запросу учетных данных нужны id, format и объект meta.[1] Пример SD-JWT VC из спецификации:[1]

{ "credentials": [ { "id": "my_credential", "format": "dc+sd-jwt", "meta": { "vct_values": [ "https://credentials.example.com/identity_credential" ] }, "claims": [ {"path": ["last_name"]}, {"path": ["first_name"]}, {"path": ["address", "street_address"]} ] } ] }

Для mdoc используется формат mso_mdoc, а meta содержит doctype_value.[1] Для PID подставьте его тип и названия атрибутов. Обязательные атрибуты PID: фамилия, имя, дата рождения, место рождения и гражданство.[7]

  • require_cryptographic_holder_binding по умолчанию имеет значение true. Оставьте его: с ним кошелек возвращает доказательство привязки ключа.[1]
  • trusted_authorities лишь фильтрует то, что предлагает кошелек. Верификаторы «должны самостоятельно проверять, что эмитент полученной презентации является доверенным».[1]
  • Полагающиеся стороны «не должны запрашивать у пользователей никаких данных, кроме» тех, что они зарегистрировали, и кошелек это проверяет.[4][3]

Режимы ответа OpenID4VP

Режим ответа определяет, как VP Token возвращается обратно. По умолчанию для vp_token используется fragment: токен передается во фрагменте URI перенаправления.[1]

Режим ответаКуда передается VP TokenШифрование
fragmentФрагмент URI перенаправления, через браузерНет
direct_postHTTP POST на response_uriНет
direct_post.jwtHTTP POST зашифрованного JWTДа
dc_apiОбратно через Digital Credentials APIНет
dc_api.jwtТо же, в зашифрованном видеДа

Режимы ответа в OpenID4VP 1.0.[1]

При direct_post параметр response_uri обязателен, а redirect_uri должен отсутствовать, иначе кошелек возвращает invalid_request.[1] Например, в документации EVO Wallet Молдовы описаны OpenID4VP 1.0 с direct_post.jwt в сценарии на одном устройстве, mdoc по ISO/IEC 18013-5 с профилем согласно OpenID4VC HAIP 1.0 и IETF Token Status List для отзыва.[11]

Одно устройство, разные устройства и Digital Credentials API

В ARF перечислены поддерживаемые удаленные комбинации: OpenID4VP в сочетании с механизмом передачи на основе перенаправлений и пользовательских схем URI; OpenID4VP или ISO/IEC 18013-7 в сочетании с W3C Digital Credentials API; и, опционально, ISO/IEC 18013-7 с перенаправлениями и пользовательскими схемами URI.[3]

Одно устройство

Пользовательская схема URI

  • Браузер передает openid4vp:// операционной системе
  • Кошелек открывается на том же телефоне

ARF 4.4.3.1

Разные устройства

QR-код

  • Компьютер показывает QR-код для сканирования
  • Уязвим для фишинга и ретрансляции

ARF 4.4.3.1

API браузера

Digital Credentials API

  • Браузер передает проверенный источник (origin)
  • Включен по умолчанию в Chrome 141

OpenID4VP, Приложение A

Три способа, которыми кошелек получает запрос OpenID4VP.[3][1][10]

В ARF указано, что пользовательские схемы URI «не рекомендуются для сценариев с разными устройствами», а в качестве альтернативы назван Digital Credentials API.[3] Через API кошелек получает источник (origin) верификатора, аутентифицированный браузером, «что важно для устойчивости к фишингу».[1] Спецификация W3C пока остается черновиком.[9] Что пользователь видит на телефоне:

Браузер: example.com

Подтвердите свою личность

Этот сайт запрашивает ваши данные у кошелька.

1Браузер передает URI openid4vp:// операционной системе.[3]

Кошелек EUDI

Проверка запроса

Кошелек открывается и подключается к доверяющей стороне.

2Кошелек аутентифицирует доверяющую сторону и проверяет, что она зарегистрировала.[3]

Кошелек EUDI

Выберите, чем поделиться

  • ФамилияПередаётся
  • Дата рожденияПередаётся
  • АдресНе передаётся

Поделиться

3Пользователь подтверждает атрибуты.[3]

Браузер: example.com

Данные получены

4Кошелёк отправляет ответ и возвращает пользователя.[1]

Пошаговая проверка представления SD-JWT VC

Представление SD-JWT VC содержит JWT, подписанный эмитентом, раскрытия, которые открыл пользователь, и Key Binding JWT. Проверяющая сторона «ОБЯЗАНА проверить каждое отдельное верифицируемое представление (Verifiable Presentation)» и отклонить любое представление с неверным nonce.[1]

1Проверьте подпись эмитента

Цепочка ключа ведёт к доверенному поставщику PID или аттестатов.

2Проверьте каждое раскрытие

Хеш каждого из них совпадает с дайджестом в подписанных данных.

3Проверьте Key Binding JWT

Подпись ключом владельца; nonce и audience совпадают.

4Проверьте отзыв

Прочитайте список статусов эмитента.

Все проверки пройдены

Да

Используйте раскрытые атрибуты

Нет

Отклоните и предложите другой способ

Проверки, которые проверяющая сторона выполняет для одного представления SD-JWT VC.[1][3]

Подпись эмитента. ARF называет её первой среди проверок доверяющей стороны. Якоря доверия берутся из доверенных списков (Trusted Lists, ETSI TS 119 612) и списков доверенных субъектов (Lists of Trusted Entities, ETSI TS 119 602).[3]

Раскрытия. Подписанные данные содержат массив дайджестов _sd; каждое раскрытие состоит из соли, имени утверждения и значения, например ["eluV5Og3gSNII8EYnsxA_A", "family_name", "Doe"].[1] Вычислите хеш каждого раскрытия и найдите его дайджест. Если совпадения нет, значит эмитент его не подписывал.

Key Binding JWT. Если требуется привязка к владельцу, кошелёк «ОБЯЗАН вернуть SD-JWT с Key Binding JWT». Его nonce должен совпадать с nonce вашего запроса, а aud с вашим Client Identifier или, при работе через Digital Credentials API, с вашим origin с префиксом origin:.[1] Пример из спецификации:

{ "nonce": "n-0S6_WzA2Mj", "aud": "x509_san_dns:client.example.org", "iat": 1709838604, "sd_hash": "Dy-RYwZfaaoC3inJbLslgPvMp09bH-clYP_3qbRqtW4" }

Отзыв. Доверяющая сторона проверяет, что поставщик «не отозвал PID или аттестат».[3] Например, молдавский EVO Wallet описывает для этого IETF Token Status List.[11]

Примечание

Портрет в PID становится обязательным только с 11 августа 2028 года, поэтому не планируйте сверку лица с портретом из кошелька до этой даты.[5]

Кратко о предъявлении mdoc по ISO/IEC 18013-7

Для mdoc VP Token содержит закодированный в base64url DeviceResponse по ISO/IEC 18013-5, который «содержит подпись или MAC над SessionTranscript», включая структуру передачи (handover) OpenID4VP.[1] Эта структура привязывает mdoc к вашему запросу так же, как nonce и audience привязывают SD-JWT VC.

Внимание

Право ЕС применяет «Приложение C к ISO/IEC 18013-7:2025» для mdoc через Digital Credentials API.[5] ISO указывает редакцию 18013-7 2024 года как отменённую и заменённую, поэтому проверьте, какую редакцию реализует ваша библиотека.[8]

В нашем сравнении SD-JWT VC и mdoc разобрано, когда подходит каждый формат.

Что профиль HAIP добавляет для верификаторов EUDI

High Assurance Interoperability Profile (HAIP) сужает набор вариантов OpenID4VP. ARF уже требует его для выпуска и указывает, что его использование «необходимо для обеспечения совместимости».[3] Для предъявления CIR 2026/1731 устанавливает «профиль OpenID4VC-HAIP» и «профиль ISO/IEC-mdoc».[5]

ТребованиеДля вашего верификатораИсточник
Сертификат доступаПодписывайте сертификатом доступа RP типа x509_hash, ETSI TS 119 475CIR 2026/1731[5]
Сертификат регистрацииВключите его в verifier_infoCIR 2026/1731[5]
РегистрацияРегистрируйтесь там, где вы учрежденыeIDAS, ст. 5b(1)[4]
Проверки на стороне кошелькаЭкземпляры кошелька проверяют сертификаты регистрации только с 11 августа 2028 года. Это не срок регистрацииCIR 2026/1731[5]

Сертификат регистрации «описывает предполагаемое использование доверяющей стороной и указывает атрибуты», которые она зарегистрировала. Регламент о регистрации применяется с 24 декабря 2026 года.[6] Дата 11 августа 2028 года касается только проверки этого сертификата на стороне кошелька, а не регистрации.[5] Германия формулирует это так: организация «получает сертификат доступа и сертификат регистрации для организации и сценария использования».[12] Регистрация подробно описана в нашем руководстве для доверяющих сторон EUDI Wallet.

Типичные ошибки при создании верификатора OpenID4VP

ОшибкаИсправление
Повторно используемые или короткие nonceНе менее 16 новых случайных байт на каждый запрос[1]
Нет проверки аудиторииСравнивайте aud со своим Client Identifier или origin[1]
Запрос незарегистрированных данныхФормируйте запрос DCQL на основе своей регистрации[4]
QR-коды с пользовательскими URI для разных устройствИспользуйте Digital Credentials API[3]
Доверие к trusted_authoritiesПроверяйте эмитента по спискам доверия самостоятельно[1]
Пропуск проверки отзываПроверяйте статус каждый раз[3]
Подпись с префиксом redirect_uriЕго нельзя подписать. Используйте x509_hash[1][5]

Использование кошелька также добровольное: доступ «никоим образом не должен ограничиваться или ставиться в невыгодные условия» для тех, кто им не пользуется. Поэтому ваш верификатор работает наряду с другим способом.[4]

Ресурсы для тестирования

Прежде чем тестировать с национальными кошельками, начните с эталонного ПО и тестов на соответствие.

  • Запустите тесты на соответствие на conformance.eudi.dev.[3]
  • Изучите документацию эталонной реализации на docs.eudi.dev. Это документация, а не тесты.[3]
  • Изучите демонстрационный верификатор Национального банка Молдовы и его исходный код.[13]
  • Прежде чем полагаться на браузерный способ, ознакомьтесь с черновиком Digital Credentials API.[9]

Даты для вашего плана тестирования см. в статье Сроки для кошелька EUDI в 2026 и 2027 годах.

Как Didit помогает с верификацией через кошелек EUDI

Прием кошелька EUDI скоро появится в Didit. Он есть в нашей дорожной карте, согласован с графиком внедрения кошелька EUDI и будет работать в том же процессе, который вы используете сегодня. А пока вы уже сейчас можете проверять людей удаленно.

Обязанности доверяющей стороны остаются за вами. В документации по кошелькам показано, как eID включаются для каждой страны.

Что предоставляет Didit

  • Вход через национальные eID и проверка документов в одном процессе
  • Доказательства по каждой проверке

Остается за вами

  • Ваша регистрация в качестве доверяющей стороны кошелька
  • Решение об онбординге и ваши политики

Спланируйте с нами путь к кошельку EUDI

Расскажите нам о своих странах и сценарии использования и начните уже сегодня с национальных eID и документов.

Связаться с намиНачать бесплатноЧитать документацию

Ключевые выводы

  • OpenID4VP 1.0 является окончательной спецификацией OpenID с 10 июля 2025 года.
  • Отправьте запрос DCQL, ограниченный вашей регистрацией, и новый nonce.
  • Проверьте подпись эмитента, каждое раскрытие, Key Binding JWT и статус отзыва.
  • Верификаторы EUDI подписывают запросы сертификатом доступа RP с префиксом x509_hash.
  • Частные доверяющие стороны, на которые распространяются требования, принимают кошелек до 24 декабря 2027 года.

Часто задаваемые вопросы

Что такое OpenID4VP?

OpenID for Verifiable Presentations, это протокол для запроса и предъявления учетных данных. Кошелек возвращает подписанные предъявления в VP Token, без обмена кодом авторизации или токеном доступа. Версия 1.0 стала окончательной спецификацией OpenID (OpenID Final Specification) 10 июля 2025 года.[1][2]

Использует ли кошелек EUDI протокол OpenID4VP?

Да, для удаленного предъявления, наряду с ISO/IEC 18013-7. Право ЕС устанавливает профиль OpenID4VC-HAIP и профиль ISO/IEC-mdoc.[3][5]

Что такое DCQL?

Digital Credentials Query Language, это запрос в формате JSON, в котором указаны учетные данные и атрибуты, нужные верификатору. Кошелек возвращает соответствующие предъявления. Для кошелька EUDI запрашивайте только те атрибуты, которые вы зарегистрировали.[1][4]

Какой режим ответа должен использовать верификатор EUDI?

Серверный верификатор использует direct_post или зашифрованный direct_post.jwt. При работе через Digital Credentials API используются режимы dc_api и dc_api.jwt.[1]

Как проверить Key Binding JWT?

Проверьте его подпись ключом, привязанным к учетным данным, затем сверьте nonce и audience с вашим запросом. При работе через Digital Credentials API значением audience является ваш origin.[1]

Какой префикс идентификатора клиента используют верификаторы EUDI?

x509_hash, с сертификатом доступа RP согласно ETSI TS 119 475. Регистрационный сертификат передается в verifier_info.[5]

Можно ли использовать QR-код между устройствами?

Можно, но ARF не рекомендует пользовательские схемы URI между устройствами из-за фишинга и релейных атак. В качестве альтернативы ARF называет Digital Credentials API.[3]

Можно ли сверять лицо с портретом из кошелька?

Пока надежно нельзя. Портрет становится обязательным элементом данных PID только с 11 августа 2028 года.[5]

Где можно протестировать верификатор OpenID4VP?

Пройдите тесты на соответствие на conformance.eudi.dev и изучите документацию эталонной реализации на docs.eudi.dev. Центральный банк Молдовы также опубликовал демонстрационный верификатор с исходным кодом.[3][13]

Источники

  1. OpenID for Verifiable Presentations 1.0, OpenID Foundation, окончательная спецификация.
  2. Окончательная спецификация OpenID for Verifiable Presentations 1.0 утверждена, OpenID Foundation, 10 июля 2025 г.
  3. Architecture and Reference Framework v3.0.0, eu-digital-identity-wallet на GitHub, релиз от 23 июля 2026 г.
  4. Регламент (ЕС) 2024/1183 (eIDAS 2), EUR-Lex, Официальный журнал от 30 апреля 2024 г.
  5. Имплементационный регламент Комиссии (ЕС) 2026/1731, EUR-Lex, Официальный журнал от 22 июля 2026 г.
  6. Имплементационный регламент Комиссии (ЕС) 2025/848 о регистрации полагающихся сторон кошельков, EUR-Lex, Официальный журнал от 7 мая 2025 г.
  7. Имплементационный регламент Комиссии (ЕС) 2024/2977 о данных идентификации лица, EUR-Lex, Официальный журнал от 4 декабря 2024 г.
  8. ISO/IEC 18013-7, страница стандарта на сайте ISO.
  9. Digital Credentials, черновик W3C.
  10. Digital Credentials API выпущен, Chrome for Developers.
  11. Руководство разработчика EVO Wallet, Правительство Молдовы, egov4dev.
  12. Частые вопросы о кошельке EUDI, eudi-wallet.gov.de.
  13. Демо-верификатор BNM, Правительство Молдовы, egov4dev.

OpenID4VP является той частью кошелька EUDI, с которой разработчики работают чаще всего, и она достаточно стабильна, чтобы строить на ее основе. Подход Didit к приему кошельков описан на странице решения для кошелька EUDI, а общая картина представлена в нашем обзоре eIDAS 2.

Проверяйте людей удаленно, пока кошельки внедряются

Используйте национальные eID и проверку по документу уже сейчас, а кошелек EUDI обсудите с нами.

Начать бесплатноСвязаться с нами

Инфраструктура для идентификации и борьбы с мошенничеством.

Единый API для KYC, KYB, мониторинга транзакций и проверки кошельков. Интеграция за 5 минут.

Попросите ИИ кратко изложить эту страницу