Merge branch 'develop' into feature/8703_verify_cert_chain
# Conflicts: # Инструкция по установке.md
This commit is contained in:
commit
ad521f7890
12 changed files with 277 additions and 27 deletions
|
|
@ -2,7 +2,7 @@ CMAKE_MINIMUM_REQUIRED (VERSION 3.0)
|
|||
|
||||
SET (CMAKE_C_COMPILER "gcc")
|
||||
|
||||
PROJECT (ervu-sign-module VERSION 1.1.0 LANGUAGES C)
|
||||
PROJECT (ervu-sign-module VERSION 1.2.0 LANGUAGES C)
|
||||
|
||||
IF (CMAKE_VERBOSE)
|
||||
SET (CMAKE_VERBOSE_MAKEFILE 1)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
ARG BUILDER_IMAGE=repo.micord.ru/alt/alt-cprocsp:c10f1-5.0.13000-20240827
|
||||
ARG BUILDER_IMAGE=repo.micord.ru/alt/alt-cprocsp:c10f1-5.0.13000-20241129
|
||||
ARG RUNTIME_IMAGE=registry.altlinux.org/basealt/altsp:c10f1
|
||||
|
||||
FROM ${BUILDER_IMAGE} AS builder
|
||||
|
|
|
|||
|
|
@ -95,4 +95,4 @@ sign_cert_password = \*\*\*\* *\# пароль от контейнера*
|
|||
|
||||
- В секции **\[verify\]** задать настройки проверки подписи маркера доступа:
|
||||
location = /verify *\# значение по умолчанию: /verify*
|
||||
esia_cert_thumbprint = sha1_thumbprint_of_esia_cert *\# SHA1 отпечаток сертификата ЕСИА*
|
||||
esia_cert_thumbprint = sha1_thumbprint_of_esia_cert0,sha1_thumbprint_of_esia_cert1 *\# список SHA1 отпечатков сертификатов ЕСИА, указанных через запятую (без пробелов)*
|
||||
|
|
|
|||
152
docs/Инструкция по обновлению сертификатов.md
Normal file
152
docs/Инструкция по обновлению сертификатов.md
Normal file
|
|
@ -0,0 +1,152 @@
|
|||
## Обновление сертификата для подписи
|
||||
|
||||
### Установка ключевой пары ИС, зарегистрированной в ЕСИА
|
||||
|
||||
1. Запросить у руководителя проекта реестра повесток контейнер с новым ключом ИС, зарегистрированной в ЕСИА.
|
||||
|
||||
2. Установить полученную ключевую пару для пользователя, от которого запускается модуль подписания (команды выполняются от имени **ervu**).
|
||||
Внимание! В следующих командах необходимо заменить ***key_cont.000*** на название контейнера, полученного на предыдущем шаге.
|
||||
|
||||
```
|
||||
mkdir /var/opt/cprocsp/keys/ervu/
|
||||
cp -r key_cont.000/ /var/opt/cprocsp/keys/ervu/
|
||||
chmod 700 /var/opt/cprocsp/keys/ervu/key_cont.000
|
||||
chmod 600 /var/opt/cprocsp/keys/ervu/key_cont.000/*
|
||||
chown -R ervu:ervu /var/opt/cprocsp/keys/ervu/key_cont.000/
|
||||
/opt/cprocsp/bin/amd64/csptest -absorb -certs -autoprov
|
||||
```
|
||||
|
||||
3. Получить перечень сертификатов:
|
||||
```
|
||||
/opt/cprocsp/bin/amd64/certmgr -list
|
||||
```
|
||||
|
||||
Для нового сертификата получить следующие значения:
|
||||
- Поле "SHA1 отпечаток": это значение нужно будет указать в конфигурационном файле модуля подписания в качестве настройки <sign_cert_thumbprint>
|
||||
- Поле "Ссылка на ключ": убедиться, что значение равно "Есть" (иначе необходимо проверить выполнение предыдущих шагов)
|
||||
- Поля "URL сертификата УЦ": по ссылкам, указанным в этом значении, скачать сертификаты УЦ и установить их (описано далее)
|
||||
- Поля "URL списка отзыва": в случае отсутствия доступа к УЦ, по ссылкам, указанным в этом значении, скачать CRL и установить их (описано далее)
|
||||
|
||||
4. Установить сертификаты УЦ (поля "URL сертификата УЦ" в свойствах сертификата). Для каждого сертификата выполнить команду от имени **root**:
|
||||
``` bash
|
||||
/opt/cprocsp/bin/amd64/certmgr -install -store mRoot -file <sign_ca_cert>.cer
|
||||
```
|
||||
|
||||
5. В случае отсутствия доступа к УЦ, установить CRL (поле "URL списка отзыва" в свойствах сертификата). Для каждого CRL выполнить команду от имени **ervu**:
|
||||
``` bash
|
||||
/opt/cprocsp/bin/amd64/certmgr -install -store uCA -crl -file <sign_ca_crl>.crl
|
||||
```
|
||||
|
||||
6. Проверить цепочку сертификатов (команда выполняется от имени **ervu**):
|
||||
``` bash
|
||||
/opt/cprocsp/bin/amd64/certmgr -list -thumbprint <sign_cert_thumbprint> -chain
|
||||
```
|
||||
|
||||
Результатом команды должна быть строка "Цепочка сертификатов: Успешно проверена."
|
||||
|
||||
Подробнее о проверке цепочки сертификатов здесь: https://www.altlinux.org/%D0%9A%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%9F%D1%80%D0%BE#%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D1%86%D0%B5%D0%BF%D0%BE%D1%87%D0%BA%D0%B8_%D1%81%D0%B5%D1%80%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D0%B2
|
||||
|
||||
7. (опционально) Сделать тестовую подпись с помощью установленного контейнера и полученных значений \<sign_cert_thumbprint\> и \<sign_cert_password\>:
|
||||
``` bash
|
||||
touch test.txt
|
||||
/opt/cprocsp/bin/amd64/cryptcp -signf -thumbprint <sign_cert_thumbprint> -pin <sign_cert_password> -errchain ./test.txt
|
||||
rm -f test.txt test.txt.sgn
|
||||
```
|
||||
|
||||
### Настройка ervu-sign-module.
|
||||
|
||||
1. В конфигурационном файле /etc/ervu-sign-module.conf в секции [sign] прописать новые значения:
|
||||
```
|
||||
[sign]
|
||||
sign_cert_thumbprint = sha1_thumbprint_of_signer_cert # SHA1 отпечаток сертификата, которым ИС подписывает секрет
|
||||
sign_cert_password = **** # пароль от контейнера
|
||||
```
|
||||
|
||||
2. Перезапустить службу:
|
||||
```
|
||||
systemctl restart ervu-sign-module
|
||||
```
|
||||
|
||||
3. (опционально) Удалить старый сертификат для подписи
|
||||
|
||||
3.1. Удалить старый сертификат из хранилища:
|
||||
```
|
||||
/opt/cprocsp/bin/amd64/certmgr -delete -thumbprint <old_sign_cert_thumbprint>
|
||||
```
|
||||
где <old_sign_cert_thumbprint> - SHA1 отпечаток старого сертификата
|
||||
|
||||
3.2. Удалить директорию со старым контейнером:
|
||||
```
|
||||
rm -rf /var/opt/cprocsp/keys/ervu/<key_cont.000>
|
||||
```
|
||||
где <key_cont.000> - название директории со старым контейнером
|
||||
|
||||
|
||||
## Обновление сертификата ЕСИА для проверки ЭП маркера доступа
|
||||
|
||||
### Установка сертификата ЕСИА.
|
||||
|
||||
1. Скачать сертификаты тестовой и продуктивной сред ЕСИА, используемые для формирования электронных подписей ответов как поставщика, по ссылке: https://esia.gosuslugi.ru/public/esia.zip
|
||||
|
||||
2. Из списка сертификатов выбрать тот, который подходит под конфигурацию стенда (в зависимости от алгоритма подписи и от того, является ли среда тестовой или продуктивной).
|
||||
|
||||
3. Установить выбранный сертификат для пользователя, выполнив команду от имени **ervu**:
|
||||
```
|
||||
/opt/cprocsp/bin/amd64/certmgr -install -file '<esia_cert>.cer'
|
||||
```
|
||||
где <esia_cert>.cer - название файла выбранного сертификата.
|
||||
|
||||
Результатом команды будет список полей сертификата. Из него необходимо получить следующие значения:
|
||||
- Поле "SHA1 отпечаток": это значение нужно будет указать в конфигурационном файле модуля подписания в качестве настройки <esia_cert_thumbprint>.
|
||||
- Поле "Алгоритм подписи": проверить, что значение совпадает с настройками ИС в ЕСИА.
|
||||
- Поле "Истекает": проверить, что срок действия сертификата не истёк.
|
||||
- Поля "URL сертификата УЦ": по ссылкам, указанным в этом значении, скачать сертификаты УЦ и установить их (описано далее)
|
||||
- Поля "URL списка отзыва": в случае отсутствия доступа к УЦ, по ссылкам, указанным в этом значении, скачать CRL и установить их (описано далее)
|
||||
|
||||
4. Установить сертификаты УЦ (поля "URL сертификата УЦ" в свойствах сертификата). Для каждого сертификата выполнить команду от имени **root**:
|
||||
|
||||
``` bash
|
||||
/opt/cprocsp/bin/amd64/certmgr -install -store mRoot -file <esia_ca_cert>.cer
|
||||
```
|
||||
|
||||
5. В случае отсутствия доступа к УЦ, установить CRL (поле "URL списка отзыва" в свойствах сертификата). Для каждого CRL выполнить команду от имени **ervu**:
|
||||
|
||||
``` bash
|
||||
/opt/cprocsp/bin/amd64/certmgr -install -store uCA -crl -file <esia_ca_crl>.crl
|
||||
```
|
||||
|
||||
6. Проверить цепочку сертификатов (команда выполняется от имени **ervu**):
|
||||
|
||||
``` bash
|
||||
/opt/cprocsp/bin/amd64/certmgr -list -thumbprint <esia_cert_thumbprint> -chain
|
||||
```
|
||||
|
||||
Результатом команды должна быть строка "Цепочка сертификатов: Успешно проверена."
|
||||
|
||||
Подробнее о проверке цепочки сертификатов здесь: https://www.altlinux.org/%D0%9A%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%9F%D1%80%D0%BE#%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D1%86%D0%B5%D0%BF%D0%BE%D1%87%D0%BA%D0%B8_%D1%81%D0%B5%D1%80%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D0%B2
|
||||
|
||||
### Настройка ervu-sign-module.
|
||||
|
||||
1. В конфигурационном файле /etc/ervu-sign-module.conf в секции \[verify\] добавить новое значение:
|
||||
|
||||
```
|
||||
[verify]
|
||||
esia_cert_thumbprint = old_esia_cert_thumbprint,esia_cert_thumbprint # список SHA1 отпечатков сертификатов ЕСИА, указанных через запятую (без пробелов)
|
||||
```
|
||||
|
||||
где <old_esia_cert_thumbprint> - SHA1 отпечаток старого сертификата ЕСИА.
|
||||
|
||||
Примечание. SHA1 отпечаток старого сертификата ЕСИА необходимо оставить в списке esia_cert_thumbprint до тех пор, пока срок его действия не истечет.
|
||||
|
||||
2. Перезапустить службу:
|
||||
|
||||
```
|
||||
systemctl restart ervu-sign-module
|
||||
```
|
||||
|
||||
3. (опционально) Удалить старый сертификат ЕСИА.
|
||||
|
||||
```
|
||||
/opt/cprocsp/bin/amd64/certmgr -delete -thumbprint <old_esia_cert_thumbprint>
|
||||
```
|
||||
где <old_esia_cert_thumbprint> - SHA1 отпечаток старого сертификата ЕСИА.
|
||||
|
|
@ -73,7 +73,6 @@ fcgi_request_get_param(const FCGX_Request* request, const char* name, /*out*/ bo
|
|||
{
|
||||
assert(request != NULL);
|
||||
assert(name != NULL);
|
||||
assert(err != NULL);
|
||||
|
||||
char* param_value = FCGX_GetParam(name, request->envp);
|
||||
if (param_value == NULL) {
|
||||
|
|
|
|||
|
|
@ -146,17 +146,29 @@ typedef fcgi_handler_status_t (*fcgi_request_handler_pt)(const FCGX_Request* req
|
|||
typedef fcgi_request_handler_pt (*FCGI_REQUEST_FINALIZE_HANDLER)(int rc);
|
||||
|
||||
|
||||
static inline void
|
||||
fcgi_print_log(const FCGX_Request* request, const char* status)
|
||||
{
|
||||
const char* uri = fcgi_request_get_param(request, FCGI_PARAM_NAME_REQUEST_URI, NULL);
|
||||
uri = uri != NULL ? uri : "nil";
|
||||
|
||||
const char* method = fcgi_request_get_param(request, FCGI_PARAM_NAME_REQUEST_METHOD, NULL);
|
||||
method = method != NULL ? method : "nil";
|
||||
|
||||
LOG_INFO("%s %s, '%s'", method, uri, status);
|
||||
}
|
||||
|
||||
static inline fcgi_handler_status_t
|
||||
fcgi_200_ok_handler(const FCGX_Request* request, void* ctx __attribute__((unused)))
|
||||
{
|
||||
LOG_INFO("response status: '200 OK'");
|
||||
LOG_DEBUG("response status: '200 OK'");
|
||||
return FCGI_CHECK_PRINTF_STATUS(request, FCGI_200_RESPONSE_FORMAT, 200);
|
||||
}
|
||||
|
||||
static inline fcgi_handler_status_t
|
||||
fcgi_400_bad_request_handler(const FCGX_Request* request, void* ctx __attribute__((unused)))
|
||||
{
|
||||
LOG_INFO("response status: '400 Bad Request'");
|
||||
fcgi_print_log(request, "400 Bad Request");
|
||||
return FCGI_CHECK_PRINTF_STATUS(request, FCGI_400_RESPONSE_FORMAT, 400);
|
||||
}
|
||||
|
||||
|
|
@ -164,7 +176,7 @@ fcgi_400_bad_request_handler(const FCGX_Request* request, void* ctx __attribute_
|
|||
static inline fcgi_handler_status_t
|
||||
fcgi_401_unauthorized_handler(const FCGX_Request* request, void* ctx __attribute__((unused)))
|
||||
{
|
||||
LOG_INFO("response status: '401 Unauthorized'");
|
||||
fcgi_print_log(request, "401 Unauthorized");
|
||||
return FCGI_CHECK_PRINTF_STATUS(request, FCGI_401_RESPONSE_FORMAT, 401);
|
||||
}
|
||||
|
||||
|
|
@ -172,7 +184,7 @@ fcgi_401_unauthorized_handler(const FCGX_Request* request, void* ctx __attribute
|
|||
static inline fcgi_handler_status_t
|
||||
fcgi_404_not_found_handler(const FCGX_Request* request, void* ctx __attribute__((unused)))
|
||||
{
|
||||
LOG_INFO("response status: '404 Not Found'");
|
||||
fcgi_print_log(request, "404 Not Found");
|
||||
return FCGI_CHECK_PRINTF_STATUS(request, FCGI_404_RESPONSE_FORMAT, 404);
|
||||
}
|
||||
|
||||
|
|
@ -180,7 +192,7 @@ fcgi_404_not_found_handler(const FCGX_Request* request, void* ctx __attribute__(
|
|||
static inline fcgi_handler_status_t
|
||||
fcgi_405_method_not_allowed_handler(const FCGX_Request* request, void* ctx __attribute__((unused)))
|
||||
{
|
||||
LOG_INFO("response status: '405 Method Not Allowed'");
|
||||
fcgi_print_log(request, "405 Method Not Allowed");
|
||||
return FCGI_CHECK_PRINTF_STATUS(request, FCGI_405_RESPONSE_FORMAT, 405);
|
||||
}
|
||||
|
||||
|
|
@ -188,7 +200,7 @@ fcgi_405_method_not_allowed_handler(const FCGX_Request* request, void* ctx __att
|
|||
static inline fcgi_handler_status_t
|
||||
fcgi_406_not_acceptable_handler(const FCGX_Request* request, void* ctx __attribute__((unused)))
|
||||
{
|
||||
LOG_INFO("response status: '406 Not Acceptable'");
|
||||
fcgi_print_log(request, "406 Not Acceptable");
|
||||
return FCGI_CHECK_PRINTF_STATUS(request, FCGI_406_RESPONSE_FORMAT, 406);
|
||||
}
|
||||
|
||||
|
|
@ -196,7 +208,7 @@ fcgi_406_not_acceptable_handler(const FCGX_Request* request, void* ctx __attribu
|
|||
static inline fcgi_handler_status_t
|
||||
fcgi_413_request_entity_too_large_handler(const FCGX_Request* request, void* ctx __attribute__((unused)))
|
||||
{
|
||||
LOG_INFO("response status: '413 Request Entity Too Large'");
|
||||
fcgi_print_log(request, "413 Request Entity Too Large'");
|
||||
return FCGI_CHECK_PRINTF_STATUS(request, FCGI_413_RESPONSE_FORMAT, 413);
|
||||
}
|
||||
|
||||
|
|
@ -204,7 +216,7 @@ fcgi_413_request_entity_too_large_handler(const FCGX_Request* request, void* ctx
|
|||
static inline fcgi_handler_status_t
|
||||
fcgi_500_internal_server_error_handler(const FCGX_Request* request, void* ctx __attribute__((unused)))
|
||||
{
|
||||
LOG_ERROR("response status: '500 Internal Server Error'");
|
||||
fcgi_print_log(request, "500 Internal Server Error");
|
||||
return FCGI_CHECK_PRINTF_STATUS(request, FCGI_500_RESPONSE_FORMAT, 500);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -63,8 +63,8 @@ verify_conf_load(verify_conf_t *conf, const conf_file_context_t conf_file)
|
|||
{
|
||||
VERIFY_CONF_SECTION,
|
||||
VERIFY_CONF_KEY_THUMBPRINT,
|
||||
&conf->esia_cert_thumbprint,
|
||||
CONF_FILE_VALUE_STRT,
|
||||
&conf->esia_cert_thumbprint_list,
|
||||
CONF_FILE_VALUE_STRING_LIST,
|
||||
CONF_FILE_VALUE_NONE,
|
||||
NULL
|
||||
},
|
||||
|
|
@ -91,7 +91,7 @@ verify_conf_clear(verify_conf_t *conf)
|
|||
if (conf == NULL) return;
|
||||
|
||||
str_t_clear(&conf->location);
|
||||
str_t_clear(&conf->esia_cert_thumbprint);
|
||||
string_list_clear(&conf->esia_cert_thumbprint_list);
|
||||
|
||||
memset(conf, 0, sizeof(verify_conf_t));
|
||||
}
|
||||
|
|
@ -188,6 +188,8 @@ fcgi_401_bad_signature_handler(const FCGX_Request* request, void *ctx)
|
|||
return HANDLER_ERROR;
|
||||
}
|
||||
|
||||
fcgi_print_log(request, "401 Unauthorized");
|
||||
|
||||
return HANDLER_SUCCESS;
|
||||
}
|
||||
|
||||
|
|
@ -238,6 +240,42 @@ fcgi_verify_request_clear(fcgi_verify_request_t *req_info)
|
|||
memset(req_info, 0, sizeof(fcgi_verify_request_t));
|
||||
}
|
||||
|
||||
static int
|
||||
verify_sign_using_thumbprint_list(const string_list_t* thumbprint_list, const str_t* alg,
|
||||
const str_t* header_payload, const str_t* sign,
|
||||
bool* is_verified, char** verify_error)
|
||||
{
|
||||
int rc = -1;
|
||||
|
||||
LOG_TRACE("verify_sign_using_thumbprint_list enter");
|
||||
|
||||
for (size_t i = 0; i < thumbprint_list->size; i++) {
|
||||
const char *cert_thumbprint = thumbprint_list->list[i];
|
||||
str_t thumbprint = {
|
||||
.data = (char*) cert_thumbprint,
|
||||
.len = strlen(cert_thumbprint)
|
||||
};
|
||||
|
||||
LOG_DEBUG("Try to verify jwt using cert with thumbprint '%s'...", cert_thumbprint);
|
||||
|
||||
rc = cryptopro_verify(&thumbprint, alg, header_payload, sign, is_verified, verify_error);
|
||||
if (rc) {
|
||||
LOG_ERROR("cryptopro_verify() failed for cert with thumbprint '%s'", cert_thumbprint);
|
||||
}
|
||||
|
||||
if (*is_verified) {
|
||||
LOG_DEBUG("jwt verified using cert with thumbprint '%s'", cert_thumbprint);
|
||||
break;
|
||||
} else {
|
||||
LOG_DEBUG("Could not veify jwt using cert with thumbprint '%s'. Desc: %s",
|
||||
cert_thumbprint, *verify_error);
|
||||
}
|
||||
}
|
||||
|
||||
LOG_TRACE("verify_sign_using_thumbprint_list exit");
|
||||
return rc;
|
||||
}
|
||||
|
||||
static fcgi_handler_status_t
|
||||
verify_jwt_sign(fcgi_verify_request_t* req_info, const verify_service_t *ctx)
|
||||
{
|
||||
|
|
@ -286,8 +324,9 @@ verify_jwt_sign(fcgi_verify_request_t* req_info, const verify_service_t *ctx)
|
|||
goto error;
|
||||
}
|
||||
|
||||
if (cryptopro_verify(&ctx->conf->esia_cert_thumbprint, &alg, &header_payload, &sign,
|
||||
&is_verified, &req_info->verify_error)) {
|
||||
if (verify_sign_using_thumbprint_list(&ctx->conf->esia_cert_thumbprint_list, &alg,
|
||||
&header_payload, &sign, &is_verified,
|
||||
&req_info->verify_error)) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,12 +5,13 @@
|
|||
|
||||
#include "utils/conf_file_context.h"
|
||||
#include "utils/str_t.h"
|
||||
#include "utils/types.h"
|
||||
|
||||
typedef struct verify_service_t* HVerify;
|
||||
|
||||
typedef struct verify_conf_s {
|
||||
str_t location;
|
||||
str_t esia_cert_thumbprint;
|
||||
string_list_t esia_cert_thumbprint_list;
|
||||
|
||||
} verify_conf_t;
|
||||
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
#include <assert.h>
|
||||
|
||||
#define KEY_FILE_DEFAULT_LIST_SEPARATOR ' '
|
||||
#define KEY_FILE_DEFAULT_LIST_SEPARATOR ','
|
||||
|
||||
|
||||
typedef GKeyFile conf_file_context_s;
|
||||
|
|
|
|||
|
|
@ -383,8 +383,10 @@ get_signer_cert(const cryptopro_context_t *ctx, HCERTSTORE hStoreHandle)
|
|||
goto error;
|
||||
}
|
||||
|
||||
if (set_password(cert_ctx, ctx->password)) {
|
||||
goto error;
|
||||
if (!str_t_is_null(*ctx->password)) {
|
||||
if (set_password(cert_ctx, ctx->password)) {
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
LOG_DEBUG("The signer's certificate was found");
|
||||
|
|
@ -499,6 +501,10 @@ get_verify_error(char** verify_error)
|
|||
|
||||
size_t size = strlen(err_string) + 4 /*error code*/ + 1 /*terminating null*/;
|
||||
|
||||
if (*verify_error != NULL) {
|
||||
free(*verify_error); // в ответе отдаем последнюю ошибку
|
||||
}
|
||||
|
||||
*verify_error = malloc(size);
|
||||
if (*verify_error == NULL) {
|
||||
LOG_ERROR("get_verify_error failed. Could not allocate memory for error string "
|
||||
|
|
@ -593,7 +599,8 @@ cryptopro_verify(const str_t* cert_thumbprint, const str_t* alg, const str_t* da
|
|||
if (*verify_error == NULL) {
|
||||
goto exit;
|
||||
}
|
||||
LOG_WARN("%s", *verify_error);
|
||||
LOG_WARN("%s, cert_thumbprint: %.*s", *verify_error,
|
||||
(int) cert_thumbprint->len, cert_thumbprint->data);
|
||||
}
|
||||
|
||||
rc = 0;
|
||||
|
|
|
|||
40
Инструкция по обновлению с версии 1.1.0 до 1.2.0.txt
Normal file
40
Инструкция по обновлению с версии 1.1.0 до 1.2.0.txt
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
В версии 1.2.0 появились следующие функции:
|
||||
- Проверка цепочки сертификатов при подписи секрета
|
||||
- Проверка цепочки сертификатов при проверке ЭП маркера доступа.
|
||||
|
||||
Для обновления приложения необходимо выполнить следующие шаги (команды выполняются от имени root):
|
||||
|
||||
1. Остановить службу:
|
||||
```
|
||||
systemctl stop ervu-sign-module
|
||||
```
|
||||
|
||||
2. Обновить приложение:
|
||||
```
|
||||
cp ./ervu-sign-module /opt/ervu-sign-module/
|
||||
```
|
||||
|
||||
3. Установить корневые сертификаты УЦ для сертификата, используемого для подписи секрета (поля "URL сертификата УЦ" в свойствах сертификата). Для каждого сертификата выполнить команду от имени root:
|
||||
|
||||
``` bash
|
||||
/opt/cprocsp/bin/amd64/certmgr -install -store mRoot -file <sign_ca_cert>.cer
|
||||
```
|
||||
|
||||
4. Установить корневые сертификаты УЦ для сертификата ЕСИА (поля "URL сертификата УЦ" в свойствах сертификата ЕСИА). Для каждого сертификата выполнить команду от имени root:
|
||||
|
||||
``` bash
|
||||
/opt/cprocsp/bin/amd64/certmgr -install -store mRoot -file <esia_ca_cert>.cer
|
||||
```
|
||||
|
||||
5. Запустить службу:
|
||||
```
|
||||
systemctl start ervu-sign-module
|
||||
```
|
||||
|
||||
6. Проверить версию приложения:
|
||||
```
|
||||
curl -v http://127.0.0.1/version
|
||||
```
|
||||
|
||||
Статус-код ответа должен быть равен 200 OK.
|
||||
В ответе должна быть возвращена строчка "1.2.0".
|
||||
|
|
@ -59,7 +59,7 @@ chown -R ervu:ervu /var/opt/cprocsp/keys/ervu/key_cont.000/
|
|||
- Поле "SHA1 отпечаток": это значение нужно будет указать в конфигурационном файле модуля подписания в качестве настройки \<sign_cert_thumbprint\>
|
||||
- Поле "Ссылка на ключ": убедиться, что значение равно "Есть" (иначе необходимо проверить выполнение предыдущих шагов)
|
||||
- Поля "URL сертификата УЦ": по ссылкам, указанным в этом значении, скачать сертификаты УЦ и установить их (описано далее)
|
||||
- Поля "URL списка отзыва": по ссылкам, указанным в этом значении, скачать CRL и установить их (описано далее)
|
||||
- Поля "URL списка отзыва": в случае отсутствия доступа к УЦ, по ссылкам, указанным в этом значении, скачать CRL и установить их (описано далее)
|
||||
|
||||
4. Установить сертификаты УЦ (поля "URL сертификата УЦ" в свойствах сертификата). Для каждого сертификата выполнить команду от имени **root**:
|
||||
``` bash
|
||||
|
|
@ -83,7 +83,7 @@ chown -R ervu:ervu /var/opt/cprocsp/keys/ervu/key_cont.000/
|
|||
7. (опционально) Сделать тестовую подпись с помощью установленного контейнера и полученных значений \<sign_cert_thumbprint\> и \<sign_cert_password\>:
|
||||
``` bash
|
||||
touch test.txt
|
||||
/opt/cprocsp/bin/amd64/cryptcp -signf -thumbprint <sign_cert_thumbprint> -errchain ./test.txt
|
||||
/opt/cprocsp/bin/amd64/cryptcp -signf -thumbprint <sign_cert_thumbprint> -pin <sign_cert_password> -errchain ./test.txt
|
||||
rm -f test.txt test.txt.sgn
|
||||
```
|
||||
|
||||
|
|
@ -113,16 +113,16 @@ rm -f test.txt test.txt.sgn
|
|||
- Поле "Алгоритм подписи": проверить, что значение совпадает с настройками ИС в ЕСИА.
|
||||
- Поле "Истекает": проверить, что срок действия сертификата не истёк.
|
||||
- Поля "URL сертификата УЦ": по ссылкам, указанным в этом значении, скачать сертификаты УЦ и установить их (описано далее)
|
||||
- Поля "URL списка отзыва": по ссылкам, указанным в этом значении, скачать CRL и установить их (описано далее)
|
||||
- Поля "URL списка отзыва": в случае отсутствия доступа к УЦ, по ссылкам, указанным в этом значении, скачать CRL и установить их (описано далее)
|
||||
|
||||
4. Установить сертификаты УЦ (поля "URL сертификата УЦ" в свойствах сертификата). Для каждого сертификата выполнить команду от имени **root**:
|
||||
``` bash
|
||||
/opt/cprocsp/bin/amd64/certmgr -install -store mRoot -file <sign_ca_cert>.cer
|
||||
/opt/cprocsp/bin/amd64/certmgr -install -store mRoot -file <esia_ca_cert>.cer
|
||||
```
|
||||
|
||||
5. В случае отсутствия доступа к УЦ, установить CRL (поле "URL списка отзыва" в свойствах сертификата). Для каждого CRL выполнить команду от имени **ervu**:
|
||||
``` bash
|
||||
/opt/cprocsp/bin/amd64/certmgr -install -store uCA -crl -file <sign_ca_crl>.crl
|
||||
/opt/cprocsp/bin/amd64/certmgr -install -store uCA -crl -file <esia_ca_crl>.crl
|
||||
```
|
||||
|
||||
6. Проверить цепочку сертификатов (команда выполняется от имени **ervu**):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue