Выпуск сертификата пользователя
Раздел содержит руководство разработчика по выпуску сертификата пользователя. В разделе приведены основные сценарии использования, примеры HTTP-запросов и ответов сервисов DSS.
В разделе приведены сценарии выпуска сертификата:
Перед началом интеграции Администратору DSS необходимо:
- Выпустить и зарегистрировать на DSS cертификат аутентификации Оператора DSS
- Зарегистрировать OAuth-клиента
- Подключить к Сервису Подписи модуль взаимодействия с УЦ
Общий подход для Пользователей и Операторов при выпуске сертификата:
- Аутентификация на Центре Идентификации
- Получение параметров выпуска запроса на сертификат
- Создание запроса на сертификат
- Подтверждение создания запроса на сертификат (для пользователей)
- Установка сертификата
Примечание
В примере рассматривается выпуск сертификата пользователя через Сторонний УЦ. Созданный на шаге 3 запрос на сертификат (PKCS#10) Пользователь или Оператор самостоятельно передать в УЦ для выпуска Сертификата. Выпущенный сертификат должен быть установлен на Сервисе Подписи через API.
Создание запроса на сертификат
Параметры выпуска запроса на сертификат можно получить из Политики Сервиса Подписи (метод /policy). Политика Сервиса Подписи содержит:
- Список параметров Удостоверяющих Центров, подключенных к DSS
- Список криптопровайдеров, подключенных к DSS
Каждый элемент списка параметров УЦ содержит:
- Идентификатор Удостоверяющего Центра
- Тип Удостоверяющего Центра
- Шаблон различительного имени (Distinguished Name)
- Список шаблонов сертификатов
- Отображаемое имя
В интерфейсе интегрируемой системы должна быть возможность выбора Удостоверяющего Центра, для которого будет создан запрос на сертификат.
Для каждого Удостоверяющего Центра Сервис Подписи передаёт отображаемое имя (DSSCAPolicy -> Name
), которое может быть показано пользователю.
Для выбранного пользователем Удостоверяющего Центра в интерфейсе интегрируемой системы должна отображаться форма для заполнения Идентифицирующих данных.
Форма составляется в соответстии с шаблоном имени (DSSCAPolicy -> NamePolicy
). У каждого компонента имени в шаблоне есть отображаемое имя (Name
), строковый идентификатор (StringIdentifier
)
и требование к заполнению (IsRequired
).
Так же на форме создания запроса должен быть отображен спискок шаблонов сертификатов (EkuTemplates
). Каждый шаблон сертификата имеет отображаемое имя.
Если Политика Сервиса Подписи содержит более одного криптопровайдера, то необходимо предоставить пользователю возможность выбора.
Данные с формы передаются в метод /requests для создания запроса на сертификат:
- Идентификатор Удостоверяющего Центра
- Различительное имя
- Шаблон сертификата
- ПИН-код на закрытый ключ (опционально)
- Идентификатор криптопровайдера (опционально)
Данные передаются в структуре CertificateRequest.
Идентификатор Удостоверяющего Центра (AuthorityId
) является константой. Он может быть получен от Администратора DSS и зафиксирован в настройках интегрируемой системы.
Примечание
Если Удостоверяющий Центр с заданным идентификатором отсутствует в Политике Сервиса Подписи, то либо он недоступен в данный момент, либо был отключен Администратором DSS. Для выяснения причин недоступности Удостоверяющего Центра следует обратиться к Администратору DSS.
Различительное имя может быть передано в двух форматах:
- Список пар oid:value (
DistinguishedName
) - Строковое представление (
RawDistinguishedName
)
Объектные идентификаторы (OID) компонентов имени указаны в шаблоне имени.
Примечание
Строковое представление различительного имени кодируется согласно RFC 1779.
Шаблон сертификата представляет собой набор объектных идентификаторов, которые попадут в расширение Enhanced Key Usage (EKU) запроса на сертификат, или идентификатор шаблона сертификата КриптоПро УЦ 2.0, который попадёт в расширение Certificate Template (1.3.6.1.4.1.311.21.7).
Шаблон передаётся через разные поля запроса на сертификат в зависимости от типа:
- Enhanced key usage - передаётся в дополнительных параметрах запроса
Parameters
в ключеEkuString
в формате oid1,oid2,...,oidN.
Примечание
Данный шаблон используется при создании запроса на сертификат к Удостоверяющему Центру типа 0 (КриптоПро УЦ 1.5) и 2 (Сторонний УЦ).
- Certificate Template - передаётся в параметре
Template
запроса на сертификат.
Примечание
Данный шаблон используется при создании запроса на сертификат к Удостоверяющему Центру типа 1 (КриптоПро УЦ 2.0) и 2 (Сторонний УЦ).
Идентификатор криптопровайдера должен быть задан, если в Политике Сервиса Подписи доступно более одного криптопровайдера.
Идентификатор криптопровайдера (DSSCSPPolicy -> GroupId
) передаётся в дополнительных параметрах запроса в ключе GroupId
Создание запроса на сертификат с подтверждением при помощи вторичной аутентификации
При создании запроса на сертификат с подтверждением при помощи вторичной аутентификации требуется выполнить следующую последовательность действий (шагов):
- Создание транзакции на Сервисе Подписи
- Подтверждение транзакции на Сервисе Подтверждения Операций
- Получение результата операции на Сервисе Подписи
При этом в массив параметров транзакции метода /transactions должны быть отображены следующие поля запроса на сертификат:
CertificateRequest | Параметры транзакции |
---|---|
AuthorityId | CAId |
PinCode | Не используется |
Template | CertTemplateOid |
DistinguishedName | Не используется |
RawDistinguishedName | CertSubjectName |
Parameters ->EkuString | EkuString |
Parameters ->GroupId | GroupId |
Примечание
При создании запроса на сертификат с подтверждением с подтверждением при помощи вторичной аутентификации различительное имя может быть передано только в строковом представлении.
Примеры запросов
Пример запроса с указанием различительного имени в строковом представлении:
POST https://host/SignServer/rest/api/requests HTTP/1.1
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGci ... 2bgrniEg
Content-Type: application/json; charset=utf-8
Host: host
Content-Length: 153
Expect: 100-continue
{
"AuthorityId":11,
"PinCode":"",
"RawDistinguishedName":"CN=dssUser,C=RU",
"Parameters":
{"EkuString":"1.2.643.2.2.34.2,1.2.643.2.2.34.4,1.3.6.1.5.5.7.3.2"}
}
Пример запроса с указанием различительного имени в виде набора компонентов:
POST https://host/SignServer/rest/api/requests HTTP/1.1
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJ ... PhYmXscTmwGkD8b1SWy0nYQ
Content-Type: application/json; charset=utf-8
Host: host
Content-Length: 169
Expect: 100-continue
{
"AuthorityId":11,
"PinCode":"",
"DistinguishedName":{"2.5.4.3":"dssUser","2.5.4.6":"RU"},
"Parameters":
{
"EkuString":"1.2.643.2.2.34.2,1.2.643.2.2.34.4,1.3.6.1.5.5.7.3.2"
}
}
Пример запроса с указанием шаблона сертификата:
POST https://host/SignServer/rest/api/requests HTTP/1.1
Authorization: Bearer eyJ0eXAiOiJKV ... Ysj1GpIVmR2hw
Content-Type: application/json; charset=utf-8
Host: host
Content-Length: 135
Expect: 100-continue
{
"AuthorityId":11,
"PinCode":"",
"Template":"1.3.6.1.5.5.7.3.2",
"DistinguishedName":{"2.5.4.3":"dssUser","2.5.4.6":"RU"},
"Parameters":{}}
Пример ответа:
HTTP/1.1 200 OK
Content-Length: 723
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS/7.5
Date: Tue, 04 Sep 2018 13:35:02 GMT
{
"CertificateType":"ServerSide",
"Base64Request":"MIIBQDCB8AIBADAfMQswCQYD ... iOibLabDHz2VYlG8CsaxjE",
"CertificateAuthorityID":11,
"CADisplayName":null,
"DistName":"CN=dssUser, C=RU",
"Subject":"dssUser",
"Status":"PENDING",
"ID":22,
"CARequestID":null,
"CertificateID":0,
"RequestType":"Certificate",
"GroupID":"e8e67f9e-7eed-4116-ad98-20582e4d766e"}
Запрос на сертификат с подтверждением с подтверждением при помощи вторичной аутентификации:
POST https://host/SignServer/rest/api/transactions HTTP/1.1
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGci ... pz4erYJpgoN_RgQLA
Content-Type: application/json; charset=utf-8
Host: host
Content-Length: 200
Expect: 100-continue
{
"OperationCode":16,
"Parameters":
[
{"Name":"CertSubjectName","Value":"CN=dssUser,C=RU"},
{"Name":"CAId","Value":"11"},
{"Name":"EkuString","Value":"1.2.643.2.2.34.2,1.2.643.2.2.34.4,1.3.6.1.5.5.7.3.2"}
]}
Типовые ошибки
HTTP-код | Ошибка | Описание |
---|---|---|
400 | pending_requests_exist | У пользователя есть необработанный запрос на сертификат (статус PENDING). |
Обработка ответа Сервиса Подписи
При успешном создании запроса на сертификат Сервис Подписи в ответе вернёт структуру DSSCertRequest.
Дальнейшее поведение пользователя зависит от значения поля Status
в структуре DSSCertRequest и типа УЦ, на котором создавался запрос на сертификат.
ACCEPTED - запрос на сертификат принят и обработан УЦ. В данном случае в поле CertificateID
будет записан идентификатор выпущенного сертификата.
REGISTRATION - запрос на сертификат принят в КриптоПро УЦ 2.0 и находится на этапе регистрации пользователя УЦ. В зависимости от настроек подключения DSS к КриптоПро УЦ 2.0, необходимо:
- ожидать одобрения запроса на сертификат Администратором УЦ;
- одобрить запрос Оператором DSS.
PENDING - запрос на сертификат находится в обработке. Если запрос отправлен на КриптоПро УЦ 2.0, то в зависимости от настроек подключения DSS к КриптоПро УЦ 2.0 необходимо:
- ожидать одобрения запроса на сертификат Администратором УЦ;
- одобрить запрос Оператором DSS.
Если запрос создавался через "Сторонний Удостоверяющий Центр", необходимо:
- скачать запрос на сертификат по идентификатору /requests;
- передать запроса на сертификат в УЦ;
- выпущенный сертификат установить в DSS.
Запрос на сертификат (PKCS#10) в формате Base64 содержится в поле Base64Request
структуры DSSCertRequest.
REJECTED - запрос отклонён. Дальнейшая обработка запроса невозможна. Для выяснения причин отклонения запроса необходимо обратиться к Администратору УЦ.
Выпуск сертификата Оператором DSS
Аутентификация Оператора DSS на Центре Идентификации
Аутентификация Оператора DSS производится по сертификату (HTTPS с аутентификацией клиента).
Для получения AccessToken используется OAuth сценарий с использованием кода авторизации. Подробная информация по протоколу аутентификации: The OAuth 2.0 Authorization Framework
Администратор DSS должен предварительно настроить OAuth клиента на сервере DSS:
- создав нового клиента:
Add-DssClient -Identifier testClient -Name testClient -Description "Test Client Description" -RedirectUri urn:ietf:wg:oauth:2.0:oob:auto -AllowedFlow ResourceOwner,AuthorizationCode
- измененив настройки существующего клиента:
Set-DssClient -ClientId testClient -RedirectUri urn:ietf:wg:oauth:2.0:oob:auto -AllowedFlow ResourceOwner,AuthorizationCode
Примечание
Значение RedirectUri
urn:ietf:wg:oauth:2.0:oob:auto говорит серверу DSS о том, что AccessToken необходимо вернуть непосредственно в ответе на запрос клиента.
Данное значение используется в тех случаях, когда для клиента трудозатратно открыть слушателя на другом URL.
Последовательность шагов:
- Инициация аутентификации, путём отправки запроса на конечную точку /authorize/certificate по HTTPS с аутентификацией по сертификату.
- Получение кода авторизации.
- Получение AccessToken по коду авторизации.
- Получение делегирующего AccessToken.
AccessToken
, полученный на шаге 3, позволит Оператору DSS получить Политику Сервиса Подписи.
Для выполнения действий от имени пользователя на Сервисе Подписи необходимо получить делегирующий AccessToken. Делегирующий AccessToken позволит Оператору DSS выпустить сертификат пользователя, просмотреть список сертификатов и запросов пользователя и т.п.
Инициация аутентификации
Конечная точка для аутентификации Оператора DSS: /authorize/certificate
Параметры запроса:
redirect_uri
– зарегистрированный на Центре Идентификации адрес возврата (по этому адресу будет возвращён запрошенный код авторизации). Допустимые значения данного параметра сохраняются в ЦИ на этапе регистрации клиента.response_type
– в данном сценарии всегда должен иметь значение code.scope
– области использования маркера. Должен содержать значение dss.resource
– идентификатор Сервиса Подписи.
Примеры запросов
GET https://host/STS/oauth/authorize/certificate?client_id=testClient&response_type=code&scope=dss&redirect_uri=urn:ietf:wg:oauth:2.0:oob:auto&resource=urn:cryptopro:dss:signserver:signserver
Host: host
Connection: Keep-Alive
Получение кода авторизации
В случае успешной аутентификации
- ответ сервера будет иметь статус HTTP 302
- В заголовке
Location
будет сожержаться адрес получения AccessToken.
Т.е. в примере используется специальное значение redirect_uri
, то клиенту необходимо из заголовка Location
извлечь значение параметра code.
Значение параметра code будет использовано для получения AccessToken на следующем шаге.
Пример ответа
HTTP/1.1 302 Found
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Location: urn:ietf:wg:oauth:2.0:oob:auto?code=65e4322a9751cf9ba43012692ce02ec1
Date: Fri, 07 Sep 2018 10:30:24 GMT
Content-Length: 0
Типовые ошибки
HTTP-код | Ошибка | Описание |
---|---|---|
400 | invalid_client | OAuth-клиент не зарегистрирован или неверно указан clienID |
400 | unauthorized_client | OAuth-клиент использует незарегистрированный сценарий аутентификации (Flow) |
400 | invalid_request | Неверно сформирован параметр resource |
500 | An error has occurred | 1. Проверяющая сторона с идентификатором resource не зарегистрирована. |
Получение AccessToken
Для получения маркера доступа используется конечная точка oauth/token.
Параметры запроса:
grant_type
- тип разрешения, в данном сценарии равен authorization_code.code
– код авторизации, полученный на предыдущем шаге.resource
– идентификатор Сервиса Подписи.redirect_uri
– зарегистрированный на Центре Идентификации адрес возврата.
В заголовке Authorization HTTP-запроса клиент должен передать идентификатор OAuth-клиента и секрет (если используется): Authorization: Basic Base64(<client_id>:<secret>)
Пример запроса
POST https://host/STS/oauth/token HTTP/1.1
Authorization: Basic dGVzdENsaWVudDo=
Content-Type: application/x-www-form-urlencoded
Host: host
Content-Length: 180
Expect: 100-continue
grant_type=authorization_code&code=65e4322a9751cf9ba43012692ce02ec1&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob%3Aauto&resource=urn%3Acryptopro%3Adss%3Asignserver%3Asignserver
В случае успешной аутентификации ответ будет содержать:
access_token
- AccessToken, выпущенный Центром Идентификации DSStoken_type
- Тип токенаexpires_in
- Время жизни токена в секундах
Значение параметра access_token
необходимо будет использовать при обращениях к Сервису Подписи.
Примечание
Данный access_token
не даёт право Оператору DSS выполнять операции на Сервисе Подписи от имени пользователей.
access_token
может быть использован для получения Политики Сервиса Подписи.
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 2268
Content-Type: application/json; charset=utf-8
Expires: -1
{"access_token":"eyJ0eXAiOiJKV1Q ... LnS1sAunDSE1hh3A5n8W7lhPSM4z_VA","expires_in":300,"token_type":"Bearer"}
HTTP-код | Ошибка | Описание |
---|---|---|
400 | invalid_client | OAuth-клиент не зарегистрирован или неверно указан clienID |
400 | unauthorized_client | OAuth-клиент использует незарегистрированный сценарий аутентификации (Flow) |
400 | invalid_request | Неверно сформирован параметр resource |
400 | invalid_grant | Невалидный код авторизации. |
500 | An error has occurred | 1. Проверяющая сторона с идентификатором resource не зарегистрирована. |
Получение делегирующего AccessToken
Для получения AccessToken для делегирования используется конечная точка oauth/token. Подробная информация по протоколу получения AccessToken для делегирования: OAuth 2.0 Token Exchange.
Параметры запроса:
grant_type
- тип разрешения, в данном сценарии равен urn:ietf:params:oauth:grant-type:token-exchange.resource
– идентификатор Сервиса Подписи.actor_token
- AccessToken, полученный на предыдущем шагеactor_token_type
– тип маркера доступа, должен иметь значение urn:ietf:params:oauth:token-type:jwt.subject_token_type
– тип маркера доступа, должен иметь значение urn:ietf:params:oauth:token-type:jwt.subject_token
– неподписанный JWT-токен, содержащий логин управляемого пользователя.
В декодированном виде subject_token имеет вид:
{
"alg": "none",
"typ": "JWT"
}.
{
"unique_name": "mydss",
"nbf": 1488312889,
"exp": 1488316489,
"iat": 1488312889
}
.
Пример кодирования JWT-токена можно посмотреть по ссылке.
Первая часть (до точки) называется header, вторая – payload. Для получения закодированного значения необходимо выполнить следующее преобразование:
Base64UrlEncode(Utf8GetBytes(header)) + “.” + Base64UrlEncode(Utf8GetBytes(payload)) + “.”
Внимание!
Символ “.” в конце получившегося значения является обязательным.
В заголовке Authorization HTTP-запроса клиент должен передать идентификатор OAuth-клиента и секрет (если используется): Authorization: Basic Base64(<client_id>:<secret>)
Пример запроса
POST https://host/STS/oauth/token HTTP/1.1
Authorization: Basic dGVzdENsaWVudDo=
Content-Type: application/x-www-form-urlencoded
Host: host
Content-Length: 2529
Expect: 100-continue
grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange&actor_token=eyJ0eXAiOiJKV1QiLCJhbGc ... E1hh3A5n8W7lhPSM4z_VA&actor_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Ajwt&subject_token=e30.eyJ1bmlxdWVfbmFtZSI6Im15ZHNzIn0.&subject_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Ajwt&resource=urn%3Acryptopro%3Adss%3Asignserver%3Asignserver
В случае успешной аутентификации ответ будет содержать:
access_token
- делегирующий AccessToken, выпущенный Центром Идентификации DSStoken_type
- Тип токенаexpires_in
- Время жизни токена в секундах
Значение параметра access_token
необходимо будет использовать при обращениях к Сервису Подписи.
Пример ответа
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 2475
Content-Type: application/json; charset=utf-8
Expires: -1
{"access_token":"eyJ0eXAiOiJKV1QiL ... hOX-7aUneD_po8p5uD3nJGQ5VIHJHiwg4vA","expires_in":300,"token_type":"Bearer"}
Получение Политики Сервиса Подписи
Пример запроса
GET https://host/SignServer/rest/api/policy HTTP/1.1
Authorization: Bearer eyJ0eXAiOiJK ... K0ePGIpg
Host: host
Пример ответа
HTTP/1.1 200 OK
Content-Length: 4821
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS/7.5
Date: Mon, 03 Sep 2018 09:21:40 GMT
{
"CAPolicy":
[{
"ID":11,
"Name":"Out of Band",
"Active":true,
"AllowUserMode":false,
"SNChangesEnable":true,
"NamePolicy":
[
{"IsRequired":false,"Order":2,"OID":"1.2.840.113549.1.9.1","Name":"E-Mail","Value":null,"StringIdentifier":"E"},
{"IsRequired":false,"Order":8,"OID":"1.2.643.3.131.1.1","Name":"ИНН","Value":null,"StringIdentifier":"INN"},
{"IsRequired":false,"Order":4,"OID":"2.5.4.7","Name":"Населенный пункт","Value":null,"StringIdentifier":"L"},
{"IsRequired":false,"Order":7,"OID":"1.2.643.100.1","Name":"ОГРН","Value":null,"StringIdentifier":"OGRN"},
{"IsRequired":false,"Order":5,"OID":"2.5.4.10","Name":"Организация","Value":null,"StringIdentifier":"O"},
{"IsRequired":false,"Order":6,"OID":"2.5.4.11","Name":"Подразделение","Value":null,"StringIdentifier":"OU"},
{"IsRequired":false,"Order":3,"OID":"2.5.4.8","Name":"Регион","Value":null,"StringIdentifier":"S"},
{"IsRequired":false,"Order":9,"OID":"2.5.4.6","Name":"Страна","Value":null,"StringIdentifier":"C"},
{"IsRequired":true,"Order":1,"OID":"2.5.4.3","Name":"Общее имя","Value":null,"StringIdentifier":"CN"}
],
"EKUTemplates":
{
"Временный сертификат администратора УЦ":["1.2.643.2.2.34.2","1.2.643.2.2.34.4","1.3.6.1.5.5.7.3.2"],
"Временный сертификат оператора УЦ":["1.2.643.2.2.34.2","1.2.643.2.2.34.5","1.3.6.1.5.5.7.3.2"],
"Временный сертификат пользователя УЦ":["1.2.643.2.2.34.2 ","1.3.6.1.5.5.7.3.2"],
"Временный сертификат пользователя УЦ1":["1.2.643.2.2.34.6","1.3.6.1.5.5.7.3.2"],
"Сертификат пользователя УЦ":["1.2.643.2.2.34.6","1.3.6.1.5.5.7.3.2"]
},
"CAType":"DSSOutOfBandEnroll",
"ValidationMode":"CertificateAuthority"
}],
"CSPsPolicy":
[
{
"ID":"67e6f39d-c6c5-4ce6-9535-4e22bae84786",
"GroupID":"e8e67f9e-7eed-4116-ad98-20582e4d766e",
"TypeID":2,
"ProviderName":"Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider",
"ProviderType":75,"KeyLength":512,"HashAlgorithms":["GOST R 34.11-94"],
"Description":"GOST 2001"
},
{
"ID":"60e9912c-68a8-4608-b1c2-0c6a074456e8",
"GroupID":"648092d3-46a9-422a-9240-d32c58cc498b",
"TypeID":2,
"ProviderName":"Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider",
"ProviderType":80,
"KeyLength":512,
"HashAlgorithms":["GR 34.11-2012 256"],
"Description":"GOST 2012"
}
],
"ActionPolicy":[{"DisplayName":"Выпуск маркера (вход в ЦИ)","Uri":"http://dss.cryptopro.ru/identity/claims/action/Issue","Action":"Issue","MfaRequired":false},{"DisplayName":"Подпись документа","Uri":"http://dss.cryptopro.ru/identity/claims/action/SignDocument","Action":"SignDocument","MfaRequired":true},{"DisplayName":"Подпись пакета документов","Uri":"http://dss.cryptopro.ru/identity/claims/action/SignDocuments","Action":"SignDocuments","MfaRequired":false},{"DisplayName":"Расшифрование документа","Uri":"http://dss.cryptopro.ru/identity/claims/action/DecryptDocument","Action":"DecryptDocument","MfaRequired":false},{"DisplayName":"Создание запроса на сертификат","Uri":"http://dss.cryptopro.ru/identity/claims/action/CreateRequest","Action":"CreateRequest","MfaRequired":false},{"DisplayName":"Смена пин-кода закрытого ключа","Uri":"http://dss.cryptopro.ru/identity/claims/action/ChangePin","Action":"ChangePin","MfaRequired":false},{"DisplayName":"Обновление сертификата","Uri":"http://dss.cryptopro.ru/identity/claims/action/RenewCertificate","Action":"RenewCertificate","MfaRequired":false},{"DisplayName":"Отзыв сертификата","Uri":"http://dss.cryptopro.ru/identity/claims/action/RevokeCertificate","Action":"RevokeCertificate","MfaRequired":false},{"DisplayName":"Приостановление действия сертификата","Uri":"http://dss.cryptopro.ru/identity/claims/action/HoldCertificate","Action":"HoldCertificate","MfaRequired":false},{"DisplayName":"Возобновление действия сертификата","Uri":"http://dss.cryptopro.ru/identity/claims/action/UnholdCertificate","Action":"UnholdCertificate","MfaRequired":false},{"DisplayName":"Удаление сертификата","Uri":"http://dss.cryptopro.ru/identity/claims/action/DeleteCertificate","Action":"DeleteCertificate","MfaRequired":false},{"DisplayName":"Доступ к закрытому ключу","Uri":"http://dss.cryptopro.ru/identity/claims/action/PrivateKeyAccess","Action":"PrivateKeyAccess","MfaRequired":false}],
"PinCodeMode":"Allow",
"TspServices":[{"Name":"TestTSP","Title":"TestTSP","Url":"http://TEST-DSS-W8R2/TSP/tsp.srf"}],
"TransactionConfirmation":"NotSet",
"AllowedSignatureTypes":["GOST3410","CMS","CAdES","XMLDSig","MSOffice","PDF"]}
Создание запроса на сертификат
Пример запроса
Согласно параметрам УЦ из Политики Сервиса Подписи Оператор формирует запроса на сертификат.
POST https://host/SignServer/rest/api/requests HTTP/1.1
Authorization: Bearer eyJ0eXAiOiJKV1 ... soOAiQOhtllgg
Content-Type: application/json; charset=utf-8
Host: host
Content-Length: 167
Expect: 100-continue
{"AuthorityId":11,"PinCode":"","DistinguishedName":{"2.5.4.3":"mydss","2.5.4.6":"RU"},"Parameters":{"EkuString":"1.2.643.2.2.34.2,1.2.643.2.2.34.4,1.3.6.1.5.5.7.3.2"}}
Пример ответа
HTTP/1.1 200 OK
Content-Length: 719
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS/7.5
{
"CertificateType": "ServerSide",
"Base64Request": "MIIBPjCB7gIBADAdMQswCQYD ... 9MmKj3pHKCuhwuZCfzU+gKLUzWrQ==",
"CertificateAuthorityID": 11,
"CADisplayName": null,
"DistName": "CN=mydss, C=RU",
"Subject": "mydss",
"Status": "PENDING",
"ID": 23,
"CARequestID": null,
"CertificateID": 0,
"RequestType": "Certificate",
"GroupID": "e8e67f9e-7eed-4116-ad98-20582e4d766e"
}
Установка сертификата
Сервер вернул запрос на сертификат в поле Base64Request
. Запрос на сертификат необходимо передать в Удостоверяющий Центр для выпуска сертификата.
Пример запроса
POST https://host/SignServer/rest/api/certificates HTTP/1.1
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJHMDFHMjU2 ... PYErWVsOP9IM7oahdJ3iRg
Content-Type: application/json; charset=utf-8
Host: host
Content-Length: 1154
Expect: 100-continue
{"Certificate":"MIIDHTCCAsygAwIBAgITEgAs1guTuGxFdbofF ... qJNHeSr2QvryU0IPn1jRE/VZnuEMf80PZ1\r\n"}
Пример ответа
HTTP/1.1 200 OK
Content-Length: 1491
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS/7.5
{
"CertificateType": "ServerSide",
"ID": 14,
"DName": "CN=mydss, C=RU",
"CertificateBase64": "MIIDHTCCAsygAwIBAgITEgAs ... NHeSr2QvryU0IPn1jRE/VZnuEMf80PZ1",
"Status": {
"Value": "ACTIVE",
"RevocationInfo": null,
"PinCode": null,
"ActiveCertId": 0
},
"IsDefault": false,
"CertificateAuthorityID": 11,
"CspID": "e8e67f9e-7eed-4116-ad98-20582e4d766e",
"HashAlgorithms": ["GOST R 34.11-94"],
"ProviderName": null,
"ProviderType": 0,
"PrivateKeyNotBefore": null,
"PrivateKeyNotAfter": null,
"HasPin": false,
"FriendlyName": ""
}
HTTP-код | Ошибка | Описание |
---|---|---|
400 | invalid_certificate_format | Сертификат имеет неверный формат. Например, сертификат передан с заголовками. |
Выпуск сертификата Пользователем DSS
Аутентификация пользователя на Центре Идентификации
В примере рассматривается авторизация с использованием учётных данных пользователя (логин/пароль). Подробная информация по протоколу аутентификации: The OAuth 2.0 Authorization Framework
Параметры запроса:
grant_type
- тип разрешения, в данном сценарии равен password.password
– пароль пользователя.resource
– идентификатор Сервиса Подписи.
В заголовке Authorization HTTP-запроса клиент должен передать идентификатор OAuth-клиента и секрет (если используется): Authorization: Basic Base64(<client_id>:<secret>)
Примечание
В примере значение параметр password оставлено пустым, так как пользователю в качестве первичной аутентификации назначен метод "Только Идентификация"
Примеры запросов
POST https://host/STS/oauth/token HTTP/1.1
Authorization: Basic dGVzdENsaWVudDo=
Content-Type: application/x-www-form-urlencoded
Host: host
Content-Length: 101
Expect: 100-continue
Connection: Keep-Alive
grant_type=password&username=mydss&password=&resource=urn%3Acryptopro%3Adss%3Asignserver%3Asignserver
В случае успешной аутентификации ответ будет содержать:
access_token
- AccessToken, выпущенный Центром Идентификации DSStoken_type
- Тип токенаexpires_in
- Время жизни токена в секундах
Значение параметра access_token
необходимо будет использовать при обращениях к Сервису Подписи и Сервису Подтверждения Операций.
Пример ответа
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 2017
Content-Type: application/json; charset=utf-8
Expires: -1
{
"access_token":"eyJ0eXAiOiJKV ... 5Wti-H8CeXycwB6A",
"expires_in":300,
"token_type":"Bearer"
}
Типовые ошибки
HTTP-код | Ошибка | Описание |
---|---|---|
400 | invalid_client | OAuth-клиент не зарегистрирован или неверно указан clienID |
400 | unauthorized_client | OAuth-клиент использует незарегистрированный сценарий аутентификации (Flow) |
400 | invalid_request | Неверно сформирован параметр resource |
500 | An error has occurred | 1. Проверяющая сторона с идентификатором resource не зарегистрирована. |
Получение Политики Сервиса Подписи
Пример запроса
GET https://host/SignServer/rest/api/policy HTTP/1.1
Authorization: Bearer eyJ0eXAiOiJK ... K0ePGIpg
Host: host
Пример ответа
HTTP/1.1 200 OK
Content-Length: 4821
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS/7.5
Date: Mon, 03 Sep 2018 09:21:40 GMT
{
"CAPolicy":
[{
"ID":11,
"Name":"Out of Band",
"Active":true,
"AllowUserMode":false,
"SNChangesEnable":true,
"NamePolicy":
[
{"IsRequired":false,"Order":2,"OID":"1.2.840.113549.1.9.1","Name":"E-Mail","Value":null,"StringIdentifier":"E"},
{"IsRequired":false,"Order":8,"OID":"1.2.643.3.131.1.1","Name":"ИНН","Value":null,"StringIdentifier":"INN"},
{"IsRequired":false,"Order":4,"OID":"2.5.4.7","Name":"Населенный пункт","Value":null,"StringIdentifier":"L"},
{"IsRequired":false,"Order":7,"OID":"1.2.643.100.1","Name":"ОГРН","Value":null,"StringIdentifier":"OGRN"},
{"IsRequired":false,"Order":5,"OID":"2.5.4.10","Name":"Организация","Value":null,"StringIdentifier":"O"},
{"IsRequired":false,"Order":6,"OID":"2.5.4.11","Name":"Подразделение","Value":null,"StringIdentifier":"OU"},
{"IsRequired":false,"Order":3,"OID":"2.5.4.8","Name":"Регион","Value":null,"StringIdentifier":"S"},
{"IsRequired":false,"Order":9,"OID":"2.5.4.6","Name":"Страна","Value":null,"StringIdentifier":"C"},
{"IsRequired":true,"Order":1,"OID":"2.5.4.3","Name":"Общее имя","Value":null,"StringIdentifier":"CN"}
],
"EKUTemplates":
{
"Временный сертификат администратора УЦ":["1.2.643.2.2.34.2","1.2.643.2.2.34.4","1.3.6.1.5.5.7.3.2"],
"Временный сертификат оператора УЦ":["1.2.643.2.2.34.2","1.2.643.2.2.34.5","1.3.6.1.5.5.7.3.2"],
"Временный сертификат пользователя УЦ":["1.2.643.2.2.34.2 ","1.3.6.1.5.5.7.3.2"],
"Временный сертификат пользователя УЦ1":["1.2.643.2.2.34.6","1.3.6.1.5.5.7.3.2"],
"Сертификат пользователя УЦ":["1.2.643.2.2.34.6","1.3.6.1.5.5.7.3.2"]
},
"CAType":"DSSOutOfBandEnroll",
"ValidationMode":"CertificateAuthority"
}],
"CSPsPolicy":
[
{
"ID":"67e6f39d-c6c5-4ce6-9535-4e22bae84786",
"GroupID":"e8e67f9e-7eed-4116-ad98-20582e4d766e",
"TypeID":2,
"ProviderName":"Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider",
"ProviderType":75,"KeyLength":512,"HashAlgorithms":["GOST R 34.11-94"],
"Description":"GOST 2001"
},
{
"ID":"60e9912c-68a8-4608-b1c2-0c6a074456e8",
"GroupID":"648092d3-46a9-422a-9240-d32c58cc498b",
"TypeID":2,
"ProviderName":"Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider",
"ProviderType":80,
"KeyLength":512,
"HashAlgorithms":["GR 34.11-2012 256"],
"Description":"GOST 2012"
}
],
"ActionPolicy":[{"DisplayName":"Выпуск маркера (вход в ЦИ)","Uri":"http://dss.cryptopro.ru/identity/claims/action/Issue","Action":"Issue","MfaRequired":false},{"DisplayName":"Подпись документа","Uri":"http://dss.cryptopro.ru/identity/claims/action/SignDocument","Action":"SignDocument","MfaRequired":true},{"DisplayName":"Подпись пакета документов","Uri":"http://dss.cryptopro.ru/identity/claims/action/SignDocuments","Action":"SignDocuments","MfaRequired":false},{"DisplayName":"Расшифрование документа","Uri":"http://dss.cryptopro.ru/identity/claims/action/DecryptDocument","Action":"DecryptDocument","MfaRequired":false},{"DisplayName":"Создание запроса на сертификат","Uri":"http://dss.cryptopro.ru/identity/claims/action/CreateRequest","Action":"CreateRequest","MfaRequired":false},{"DisplayName":"Смена пин-кода закрытого ключа","Uri":"http://dss.cryptopro.ru/identity/claims/action/ChangePin","Action":"ChangePin","MfaRequired":false},{"DisplayName":"Обновление сертификата","Uri":"http://dss.cryptopro.ru/identity/claims/action/RenewCertificate","Action":"RenewCertificate","MfaRequired":false},{"DisplayName":"Отзыв сертификата","Uri":"http://dss.cryptopro.ru/identity/claims/action/RevokeCertificate","Action":"RevokeCertificate","MfaRequired":false},{"DisplayName":"Приостановление действия сертификата","Uri":"http://dss.cryptopro.ru/identity/claims/action/HoldCertificate","Action":"HoldCertificate","MfaRequired":false},{"DisplayName":"Возобновление действия сертификата","Uri":"http://dss.cryptopro.ru/identity/claims/action/UnholdCertificate","Action":"UnholdCertificate","MfaRequired":false},{"DisplayName":"Удаление сертификата","Uri":"http://dss.cryptopro.ru/identity/claims/action/DeleteCertificate","Action":"DeleteCertificate","MfaRequired":false},{"DisplayName":"Доступ к закрытому ключу","Uri":"http://dss.cryptopro.ru/identity/claims/action/PrivateKeyAccess","Action":"PrivateKeyAccess","MfaRequired":false}],
"PinCodeMode":"Allow",
"TspServices":[{"Name":"TestTSP","Title":"TestTSP","Url":"http://TEST-DSS-W8R2/TSP/tsp.srf"}],
"TransactionConfirmation":"NotSet",
"AllowedSignatureTypes":["GOST3410","CMS","CAdES","XMLDSig","MSOffice","PDF"]}