2024-08-21 12:47:16 +03:00
## Краткое описание
2024-11-14 12:16:55 +03:00
В модуле реализованы следующие функции:
- подпись данных
- проверка подписи маркера доступа
2025-08-19 11:40:27 +03:00
## Подпись данных
2024-08-21 12:47:16 +03:00
Приложение принимает POST-запрос по протоколу FastCGI (Content-Type: text/plain).
2025-01-21 09:52:06 +03:00
C помощью ДСЧ генерирует state - набор случайных символов, генерируется по стандарту UUID.
2025-01-10 15:30:09 +03:00
В строку, полученную в теле запроса, добавляет state.
В ответе возвращает подпись полученной строки в формате urlSafeBase64 (параметр "signature") и сгенерированный state (параметр "state") (Content-Type: application/json).
2024-08-21 12:47:16 +03:00
Пример выполнения запроса:
```
2025-01-17 11:35:51 +03:00
$ /opt/cprocsp/bin/amd64/curl -v http://127.0.0.1/sign -H "Content-Type: text/plain" -d "test"
* Trying 127.0.0.1:80...
* Connected to 127.0.0.1 (127.0.0.1) port 80
2024-08-21 12:47:16 +03:00
> POST /sign HTTP/1.1
2025-01-17 11:35:51 +03:00
> Host: 127.0.0.1
2024-08-21 12:47:16 +03:00
> User-Agent: curl/8.4.0
> Accept: */*
> Content-Type: text/plain
> Content-Length: 4
>
< HTTP / 1 . 1 200 OK
< Server: nginx / 1 . 24 . 0
2025-01-10 15:30:09 +03:00
< Date: Tue , 20 Aug 2024 12:00:25 GMT
< Content-Type: application / json
2024-08-21 12:47:16 +03:00
< Transfer-Encoding: chunked
< Connection: keep-alive
2025-01-10 15:30:09 +03:00
<
{
"signature": "urlSafeBase64_of_signed_string_test_with_state",
"state": "7c327cb7-7916-4255-bc46-85fbc5ad7d5f"
}
2024-08-21 12:47:16 +03:00
```
2025-08-19 11:40:27 +03:00
## Проверка подписи маркера доступа
2024-11-14 12:16:55 +03:00
Приложение принимает POST-запрос по протоколу FastCGI (Content-Type: text/plain).
Проверяет подпись маркера доступа, полученного в теле запроса.
В ответе возвращает один из следующих статус-кодов:
2025-08-19 11:40:27 +03:00
- `200 OK` - подпись валидна
- `401 Unauthorized` - подпись невалидна (в теле ответа возвращается код ошибки от криптопровайдера)
- `500 Internal Server Error` - внутренняя ошибка сервера (подробнее см. в `Обработка ошибок` )
2024-11-14 12:16:55 +03:00
Пример выполнения запроса:
```
2025-01-17 11:35:51 +03:00
$ /opt/cprocsp/bin/amd64/curl -v http://127.0.0.1/verify -H "Content-Type: text/plain" -d "some_valid_access_token"
* Trying 127.0.0.1:80...
* Connected to 127.0.0.1 (127.0.0.1) port 80
2024-11-14 12:16:55 +03:00
> POST /sign HTTP/1.1
2025-01-17 11:35:51 +03:00
> Host: 127.0.0.1
2024-11-14 12:16:55 +03:00
> User-Agent: curl/8.4.0
> Accept: */*
> Content-Type: text/plain
> Content-Length: 4
>
< HTTP / 1 . 1 200 OK
< Server: nginx / 1 . 24 . 0
< Date: Wed , 16 Oct 2024 09:55:46 GMT
< Transfer-Encoding: chunked
< Connection: keep-alive
<
```
2025-08-19 11:40:27 +03:00
## Обработка ошибок
В случае ошибки сервер возвращает ответ с о статус-кодом `500 Internal Server Error` и телом в формате JSON, содержащим поле `error_code` .
Пример ответа:
```json
{
"error_code": "CERT_TRUST_REVOCATION_STATUS_UNKNOWN"
}
```
### Возможные коды ошибок (`error_code`)
| Код | Описание |
|-----------------------------------------|----------|
| `CERT_TRUST_REVOCATION_STATUS_UNKNOWN` | Неизвестен статус отзыва сертификата или одного из сертификатов в цепочке (проблема с CRL) |
| `CERT_TRUST_IS_UNTRUSTED_ROOT` | Сертификат или цепочка сертификатов основана на ненадежном корневом сертификате |
| `CERT_TRUST_IS_NOT_TIME_VALID` | Этот сертификат или один из сертификатов в цепочке сертификатов является недопустимым по времени |
2024-09-12 13:35:57 +03:00
## Сборка из исходников
2024-08-21 12:47:16 +03:00
2024-09-12 13:35:57 +03:00
Инструкции по сборке из исходников см. "Инструкция по сборке.md"
2024-08-21 12:47:16 +03:00
2024-09-12 13:35:57 +03:00
Примечание. Чтобы задать произвольное имя конфигурационного файла, при сборке приложения необходимо задать параметр CONFIG_NAME.
Пример:
2024-08-21 12:47:16 +03:00
```
2024-09-12 13:35:57 +03:00
cmake -DCONFIG_NAME=/opt/ervu-sign-module.conf ..
2024-08-21 12:47:16 +03:00
```
2024-09-12 13:35:57 +03:00
## Установка
2024-08-21 12:47:16 +03:00
2024-09-12 13:35:57 +03:00
Инструкции по установке см. "Инструкция по установке.md"
2024-08-21 12:47:16 +03:00
2024-09-12 13:35:57 +03:00
## Настройка
2024-08-21 12:47:16 +03:00
2024-08-21 14:06:22 +03:00
Приложение настраивается в конфигурационном файле, заданном на этапе сборки (по умолчанию, /etc/ervu-sign-module.conf).
2024-08-21 12:47:16 +03:00
2024-11-14 12:16:55 +03:00
- В секции ** \[main\]** задать общие настройки:
worker_processes = 10 *\# количество воркеров (значение по умолчанию: 10)*
cp_file = libcapi20.so *\# путь до файла библиотеки криптопровайдера*
2025-02-24 15:43:55 +03:00
cp_name = Crypto-Pro GOST R 34.10-2012 KC2 CSP *\# название криптопровайдера*
cp_type = 80 *\# тип криптопровайдера*
2024-08-21 12:47:16 +03:00
- В секции ** \[fcgi\]** задать настройки fcgi-сервера:
fcgi_listen_port = 9009 *\# значение по умолчанию: 9009, должно совпадать с о значением в nginx.conf*
fcgi_listen_host = 127.0.0.1 *\# значение по умолчанию: 127.0.0.1, должно совпадать с о значением в nginx.conf*
fcgi_thread_pool_size = 1 *\# значение по умолчанию: 1*
- В секции ** \[sign\]** задать настройки модуля подписания:
2024-11-14 12:16:55 +03:00
location = /sign *\# значение по умолчанию: /sign*
sign_cert_thumbprint = sha1_thumbprint_of_signer_cert *\# SHA1 отпечаток сертификата, которым ИС подписывает секрет*
sign_cert_password = \*\*\*\* *\# пароль от контейнера*
2024-08-21 12:47:16 +03:00
2024-11-14 12:16:55 +03:00
- В секции ** \[verify\]** задать настройки проверки подписи маркера доступа:
location = /verify *\# значение по умолчанию: /verify*
2024-11-25 12:51:10 +03:00
esia_cert_thumbprint = sha1_thumbprint_of_esia_cert0,sha1_thumbprint_of_esia_cert1 *\# список SHA1 отпечатков сертификатов ЕСИА, указанных через запятую (без пробелов)*
2025-02-13 13:15:06 +03:00
## Логирование времени обработки запросов
***Для включения*** логирования времени обработки запросов необходимо задать переменную окружения SIGN_LOG_TIME:
```
export SIGN_LOG_TIME=on
```
***Для отключения*** логирования времени обработки запросов необходимо удалить переменную окружения SIGN_LOG_TIME:
```
unset SIGN_LOG_TIME
```