Обработка запроса на сертификат
Обработка запроса на сертификат зависит от следующих факторов:
1. Способ создания запроса на сертификат:
- информационной системой с использованием REST API сервера,
- Пользователем из мобильного приложения.
2. Хранение ключа подписи:
- на сервере,
- в мобильном приложении или на съемном носителе (Рутокен NFC).
Тип хранения ключа определяется флагом isClient
у объекта Certificate
( Android , iOS ).
3. Статусом запроса на сертификат
Статус определяется полем state у объекта Certificate ( Android , iOS ).
Способ создания запроса на сертификат
Запрос на сертификат создан на сервере
Если запрос на сертификат создан Информационной системой с использованием REST API сервера, то мобильное приложение может получить список сертификатов и запросов на сертификаты при помощи метода Cert.getCertList (Android , iOS).
В полученном списке объектов Certificate ( Android , iOS )
необходимо выбрать объекты type
:req.
У выбранных объектов необходимо проверить статус state. Дальнейшие шаги обработки запроса на сертификат зависят от статуса запроса.
1. Если статус запроса PENDING
, REGISTRATION
, то дополнительные действия по обработке запроса не требуется.
Необходимо дождаться обработки запроса на сертификат в Удостоверяющим Центре (УЦ).
Время обработки запроса зависит от бизнес-сценария (может быть от секунд до суток и более).
2. Если статус запроса SIGN_WAIT
, то требуются действия для обработки запроса на сертификат.
Данный статус запроса говорит о том, что на сервере создан шаблон запроса на сертификат и необходимо
создать ключ подписи в мобильном приложении, подписать запрос на сертификат и отправить запрос на сертификат на сервер.
Для выполнения этих действий необходимо использовать следующие методы:
- Cert.createKeyAndSignRequest Android, iOS - создание ключа подписи в мобильном устройстве и подписание запроса на сертификат, отправка запроса на сервер.
- Cert.signRequest Android , iOS - создание ключа подписи в мобильном устройстве и подписание запроса на сертификат.
- Cert.sendSingRequest Android , iOS - отправка запроса на сертификат на сервер.
Примечание
Метод createKeyAndSignRequest объединяет в себе вызовы методов signRequest и sendSingRequest.
Использование методов signRequest и sendSingRequest может быть полезным при выпуске сертификата с
использованием модуля КриптоПро УЦ 2.0. Обработка запроса может занять продожительное время, превышающее
timeout запроса SDK на сервер. В этом случае надежнее отдельным вызовом создать ключ подписи и подписать
запрос на сертификат, используя метод signRequest. Полученный запрос на сертификат сохранить в Мобильном приложении.
Далее отправить запрос на сертификат, используя метод sendSingRequest. Если метод sendSingRequest вернет ошибку time-out, то
необходимо проверить статус запроса на сертификат ( getCertList). Если запрос на сертификат остался в статусе SIGN_WAIT
,
то необходимо повторить отправку запроса на сертификат на сервере (sendSingRequest).
При выпуске сертификата с использованием модуля КриптоПро УЦ 2.0, вызов sendRequest или createKeyAndSignRequest может получить от сервера выпущенный сертификат и связать его с ключом подписи в мобильном приложении. Если метод возвращает объект Certificate ( Android , iOS ) с параметрами:
- type=
crt
- state:
ACTIVE
илиOUT_OF_ORDER
(оба статуса говорят о том, что сертификат может быть использован для подписи),
то процесс выпуска сертификата завершен.
Если метод вернет объект Certificate ( Android , iOS ) с параметрами
- type=
req
, - state:
PENDING
,
то запрос на сертификат обрабатывается в УЦ, и необходимо дождаться его обработки (перехода в статус ACCEPTED
).
- Если запрос на сертификат перешел в
state
ACCEPTED, то запрос на сертификат обработан и сертификат выпущен.
Если используется ключ, хранимый в мобильном приложении (isClient
:true), то выпущенный сертификат нужно связать с ключом подписи.
Для этого требуется:
- у запроса на сертификат получить значение поля cid (ID выпущенного сертификата),
- в списке объектов полученном при вызове getCertList найти объект по
type
:crt и cid=YYY, - вызвать метод
installCertificate
( Android , iOS. В метод нужно передать объект запроса на сертификат (type
:req и rid=XXX) и сертификат (type
:crt, cid=YYY, certificate.getContent()).
Запрос на сертификат создается пользователем в мобильном приложении
Для создания запроса на сертификат из мобильного приложения (МП) необходимо выполнить следующие шаги:
1. Проверить, разрешено ли настройками сервера создание запроса на сертификат из МП (опционально)
Для этого необходимо вызвать метод Policy.getParamDSS ( Android , iOS )
и проверить значение флага clientSignEnrollmentEnabled
.
Если значение флага false, то настройками сервера запрещено создание запроса на сертификат из МП.
2. Получить список модулей УЦ.
Для этого необходимо вызвать метод Policy.getCaParams ( Android , iOS ).
Метод getCaParams возвращает объект CaParams (Android , iOS), содержащий в поле caPolicies список модулей УЦ.
Пользователю можно предоставить выбор модуля УЦ, к которому требуется отправить запрос на сертификат.
3. Проверить наличие необработанных запросов на сертификаты.
Для этого необходимо вызвать метод Cert.getCertList (Android , iOS).
В полученном списке объектов Certificate (Android , iOS)
нужно выбрать объекты type
:req.
У выбранных объектов необходимо проверить статус state. Если в списке есть запросы в статусе PENFING или SIGN_WAIT, то создание нового запроса на сертификат невозможно. Требуется удалить запрос на сертификат или дождаться обработки ранее созданных запросов на сертификаты.
4. Выбрать тип хранения ключа подписи (опционально)
В зависимости от настроек сервера пользователь может создать ключ:
- в мобильном приложении или на съемном носителе (Рутокен NFC),
- на сервере.
Для этого необходимо вызвать метод Policy.getParamDSS (Android , iOS)
и проверить значение флага IsServerKeysSupported
и isMobileKeysSupported
.
От выбранного способа хранения ключа зависит метод создания запроса на сертификат:
- Cert.getCert Android , iOS - создание запроса на сертификат c хранением ключа подписи на сервере.
- Cert.getClientCert Android , iOS - создание запроса на сертификат c хранением ключа подписи в мобильном устройстве.
5. Сформировать запрос на сертификат
Для создания запроса на сертификат необходимо:
используя метод Policy.getCaParams Android, iOS, получить список модулей УЦ, доступных для обработки запросов и сертификатов;
для выбранного пользователем модуля УЦ:
- заполнить имя субъекта,
- выбрать шаблон сертификата;
отправить запрос на сертификат, используя метод getCert или getClientCert.
Примечание
Если пользователем выбран сценарий выпуска сертификата с хранением ключа подписи в мобильном приложении или на съемном носителе (Рутокен NFC), то необходимы дальнейшие шаги по обработке запроса на сертификат (см. п.6). На следующем шаге необходимо создать ключ подписи и подписать запрос на сертификат.
6. Создать ключ подписи (опционально)
Данный шаг выполняется только при хранении ключа подписи в мобильном приложении или на съемном носителе (Рутокен NFC).
Шаг может быть выполнен, только в том случае, если у запроса на сертификат поле state:SIGN_WAIT
и isClient
:true.
Для выполнения этих действий необходимо использовать методы:
- Cert.createKeyAndSignRequest Android, iOS - создание ключа подписи в МП и подписание запроса на сертификат, отправка запроса на сервер.
- Cert.signRequest Android , iOS - создание ключа подписи в МП и подписание запроса на сертификат.
- Cert.sendSingRequest Android , iOS - отправка запроса на сертификат на сервер.
Примечание
Метод createKeyAndSignRequest объединяет в себе вызовы методов signRequest и sendSingRequest.
Использование методов signRequest и sendSingRequest может быть полезным при выпуске сертификата с
использованием модуля КриптоПро УЦ 2.0. Обработка запроса может занять продожительное время, превышающее
timeout запроса SDK на сервер. В этом случае надежнее отдельным вызовом создать ключ подписи и подписать
запрос на сертификат, используя метод signRequest. Полученный запрос на сертификат сохранить в МП.
Далее отправить запрос на сертификат используя метод sendSingRequest. Если метод sendSingRequest вернет ошибку time-out, то
необходимо проверить статус запроса на сертификат ( getCertList). Если запрос на сертификат остался в статусе SIGN_WAIT
,
то необходимо повторить отправку запроса на сертификат на сервере (sendSingRequest).
При выпуске сертификат с использованием модуля КриптоПро УЦ 2.0 вызов sendRequest или createKeyAndSignRequest может получить от сервера выпущенный сертификат и связать его с ключом подписи в мобильном приложении. Если метод возвращает объект Certificate (Android , iOS) с параметрами:
- type=
crt
- state:
ACTIVE
илиOUT_OF_ORDER
(оба статуса говорят о том, что сертификат может быть использован для подписи),
то процесс выпуска сертификата завершен.
Если метод вернет объект Certificate ( Android , iOS ) с параметрами
- type=
req
- state:
PENDING
,
то запрос на сертификат обрабатывается в УЦ, и необходимо дождаться его обработки (перехода в статус ACCEPTED
).
Ожидание выпуска сертификата можно выполнить через периодический опрос метода
Cert.getCertList (Android , iOS).
Если запрос на сертификат перешел в state
:ACCEPTED, то запрос на сертификат обработан и сертификат выпущен.
Выпущенный сертификат нужно связать с ключом подписи. Для этого требуется:
- у запроса на сертификат получить значение поля cid (ID выпущенного сертификата);
- в списке объектов полученном при вызове getCertList найти объект по
type
:crt и cid=YYY; - вызвать метод
installCertificate
( Android , iOS. В метод необходимо передать объект запроса на сертификат (type
:req и rid=XXX) и сертификат (type
:crt, cid=YYY, certificate.getContent()).
Расширения сертификата
При создании запроса на сертификат из мобильного приложения расширения, которые требуется добавить в сертификат, могут быть переданы через
дополнительные параметры в ключе ExtensionsData
.
Для указания расширений запроса на сертификат необходимо использовать методы:
- getClientCertEx - при создании запроса на сертификат с ключом, хранимом на мобильном устройстве или токене
- getCertEx - при создании запроса на сертификат с ключом, хранимом на сервере.
Значение ключа ExtensionsData
представляет собой строку в кодировке Base64, в которой
закодирован список JSON-объектов.
Каждый JSON-объект представляет собой объект CertExtensionData, состоящий из следующих данных:
Поле | Тип | Описание |
---|---|---|
Oid | string | Объектный идентификатор расширения сертификата. |
Value | byte[] | Закодированное значение расширения сертификата. |
Critical | bool | Флаг критичности расширения. |
Таким образом, значение ключа ExtensionsData
должно быть сформировано в следующем порядке.
1. Сформировать JSON-список объектов CertExtensionData
.
2. Представить указанный JSON-список в виде строки UTF-8, после чего закодировать в Base64.
Пример
В примере ниже приведено расширение с OID шаблона сертификата КриптоПро УЦ 2.0.
[
{
"OID":"1.3.6.1.4.1.311.21.7",
"Critical":true,
"Value":"MCYGHiqFAwICMgEJh/DgTobuzwyF6ZFbgq+0XIHKVYKzRAIBAQIBAA=="
},
{
"OID":"1.3.6.1.4.1.311.21.7",
"Critical":true,
"Value":"MCYGHiqFAwICMgEJh/DgTobuzwyF6ZFbgq+0XIHKVYKzRAIBAQIBAA=="
}
]
Итоговое значение ключа ExtensionsData
:
W3siT2lkIjoiMS4yLjY0My4xMDAuMTE0IiwiVmFsdWUiOiJBZ0VB...
Набор расширений также может быть задан администратором в настройках модуля УЦ.
Пусть к файлу, содержащему набор расширений, задается в параметре -ExtensionsConfig
Формат файла с набором расширений:
OID='OID1' Critical='true' Value='MCYGHi....BAA=='
OID='OID2' Critical='false' Value='MCYGHi....BAA=='
...
OID='OIDN' Critical='true' Value='MCYGHi....BAA=='
Тип идентификации заявителя (Identification kind)
Одним из видов расширений, включаемых в запрос на сертификат при помощи параметра ExtensionsData
,
является информация о типе идентификации заявителя при выдаче сертификата. Доступно включение следующих
типов идентификации заявителя (см. Приказ ФСБ РФ от 29.01.2021 N 31):
- при личном присутствии;
- без личного присутствия с использованием квалифицированной ЭП при наличии действующего квалифицированного сертификата;
- без личного присутствия путем предоставления информации, указанной в документе, удостоверяющем личность гражданина Российской Федерации за пределами территории Российской Федерации, содержащем электронный носитель информации с записанными на нем персональными данными владельца паспорта, включая биометрические персональные данные;
- без его личного присутствия путем предоставления сведений из единой системы идентификации и аутентификации и единой биометрической системы в порядке, установленном Федеральным законом от 27 июля 2006 г. N 149-ФЗ "Об информации, информационных технологиях и о защите информации".
Значение "При личном присутствии"
Для добавления данного расширения необходимо внутрь ExtensionsData
поместить представленный ниже JSON-объект CertExtensionData
:
{
"OID":"1.2.643.100.114",
"Critical":false,
"Value":"AgEA"
}
Значение "Без личного присутствия с использованием квалифицированной ЭП"
Для добавления данного расширения необходимо внутрь ExtensionsData
поместить представленный ниже JSON-объект CertExtensionData
:
{
"OID":"1.2.643.100.114",
"Critical":false,
"Value":"AgEB"
}
Значение "Без личного присутствия с использованием персональных данных, записанных на электронный носитель из заграничного паспорта"
Для добавления данного расширения необходимо внутрь ExtensionsData
поместить представленный ниже JSON-объект CertExtensionData
:
{
"OID":"1.2.643.100.114",
"Critical":false,
"Value":"AgEC"
}
Значение "Без личного присутствия с использованием сведений из ЕСИА и ЕБС"
Для добавления данного расширения необходимо внутрь ExtensionsData
поместить представленный ниже JSON-объект CertExtensionData
:
{
"OID":"1.2.643.100.114",
"Critical":false,
"Value":"AgED"
}