Показать/Скрыть содержание

    Обработка запроса на сертификат

    Обработка запроса на сертификат зависит от следующих факторов:

    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).

    1. Если запрос на сертификат перешел в 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"
    }
    
    В начало © ООО "КРИПТО-ПРО", 2000–2025