SUPPORT-8592. Настройка sign::signer_subject переименована в sign::sign_cert_thumbprint

This commit is contained in:
alashkova 2024-10-22 15:22:21 +03:00
parent 59005fe670
commit 5a4ee2cb69
7 changed files with 61 additions and 65 deletions

View file

@ -90,9 +90,9 @@ fcgi_thread_pool_size = 1 *\# значение по умолчанию: 1*
- В секции **\[sign\]** задать настройки модуля подписания:
location = /sign *\# значение по умолчанию: /sign, должно совпадать со значением в nginx.conf*
signer_subject = signer@example.ru *\# email, ИНН, СНИЛС или любая другая строка из свойства контейнера «Субъект»*
sign_cert_thumbprint = sha1_thumbprint_of_signer_cert *\# SHA1 отпечаток сертификата, которым ИС подписывает секрет*
sign_cert_password = \*\*\*\* *\# пароль от контейнера*
- В секции **\[verify\]** задать настройки проверки подписи маркера доступа:
location = /verify *\# значение по умолчанию: /verify, должно совпадать со значением в nginx.conf*
esia_cert_thumbprint = sha1thumbprint *\# SHA1 отпечаток сертификата ЕСИА*
esia_cert_thumbprint = sha1_thumbprint_of_esia_cert *\# SHA1 отпечаток сертификата ЕСИА*

View file

@ -9,7 +9,7 @@ fcgi_listen_host = 127.0.0.1
[sign]
#location = /sign
signer_subject = signer@example.ru
sign_cert_thumbprint =
sign_cert_password = ****
[verify]

View file

@ -4,10 +4,10 @@
#include "utils/cryptopro.h"
#define SIGN_CONF_SECTION "sign"
#define SIGN_CONF_KEY_LOCATION "location"
#define SIGN_CONF_KEY_SIGNER "signer_subject"
#define SIGN_CONF_KEY_PASSWORD "sign_cert_password"
#define SIGN_CONF_SECTION "sign"
#define SIGN_CONF_KEY_LOCATION "location"
#define SIGN_CONF_KEY_SIGN_CERT_THUMBPRINT "sign_cert_thumbprint"
#define SIGN_CONF_KEY_SIGN_CERT_PASSWORD "sign_cert_password"
#define FCGI_OK_RESPONSE_FORMAT \
"Content-type: text/plain" CRLF\
@ -58,15 +58,15 @@ sign_conf_load(sign_conf_t *conf, const conf_file_context_t conf_file)
},
{
SIGN_CONF_SECTION,
SIGN_CONF_KEY_SIGNER,
&(conf->signer),
CONF_FILE_VALUE_STRING,
SIGN_CONF_KEY_SIGN_CERT_THUMBPRINT,
&(conf->sign_cert_thumbprint),
CONF_FILE_VALUE_STRT,
CONF_FILE_VALUE_NONE,
NULL
},
{
SIGN_CONF_SECTION,
SIGN_CONF_KEY_PASSWORD,
SIGN_CONF_KEY_SIGN_CERT_PASSWORD,
&(conf->sign_cert_password),
CONF_FILE_VALUE_STRT,
CONF_FILE_VALUE_PSWD,
@ -100,7 +100,7 @@ sign_conf_clear(sign_conf_t *conf)
str_t_clear(&conf->sign_cert_password);
str_t_clear(&conf->location);
free(conf->signer);
str_t_clear(&conf->sign_cert_thumbprint);
memset(conf, 0, sizeof(sign_conf_t));
}
@ -118,7 +118,9 @@ sign_service_create(const sign_conf_t *conf)
hsign->conf = conf;
cryptopro_context_set(&hsign->cryptopro_ctx, conf->signer, &conf->sign_cert_password);
cryptopro_context_set(&hsign->cryptopro_ctx,
&conf->sign_cert_thumbprint,
&conf->sign_cert_password);
LOG_TRACE("sign_service_create exit");
return (HSign)hsign;

View file

@ -11,7 +11,7 @@ typedef struct sign_service_t* HSign;
typedef struct sign_conf_s {
str_t location;
char *signer; /* субъект контейнера */
str_t sign_cert_thumbprint; /* SHA1 отпечаток сертификата ИС */
str_t sign_cert_password; /* пароль от контейнера */
} sign_conf_t;

View file

@ -44,7 +44,7 @@ cryptopro_sign(const cryptopro_context_t *ctx, const str_t *data, /*out*/ str_t
LOG_TRACE("cryptopro_sign enter");
assert(ctx != NULL);
assert(ctx->signer != NULL);
assert(!str_t_is_null(*ctx->cert_thumbprint));
assert(ctx->password != NULL);
assert(data != NULL && !str_t_is_null(*data));
assert(sign != NULL);
@ -209,19 +209,52 @@ cert_open_store()
}
static PCCERT_CONTEXT
get_signer_cert(const cryptopro_context_t *ctx, HCERTSTORE hStoreHandle)
get_cert_by_thumbprint(HCERTSTORE hStoreHandle, const str_t* thumbprint)
{
PCCERT_CONTEXT cert_ctx = cp_function_list.CertFindCertificateInStore(hStoreHandle,
str_t thumbprint_bin = str_t_null;
LOG_TRACE("get_cert_by_thumbprint enter");
if (hex_to_bin(thumbprint, &thumbprint_bin)) {
goto error;
}
CRYPT_HASH_BLOB hash = {
.pbData = (BYTE*)thumbprint_bin.data,
.cbData = thumbprint_bin.len
};
PCCERT_CONTEXT cert = cp_function_list.CertFindCertificateInStore(hStoreHandle,
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
0,
CERT_FIND_SUBJECT_STR,
ctx->signer,
CERT_FIND_HASH,
&hash,
NULL);
if (cert_ctx == NULL) {
if (cert == NULL) {
LOG_ERROR("Could not find certificate in store");
goto error;
}
str_t_clear(&thumbprint_bin);
LOG_TRACE("get_cert_by_thumbprint exit");
return cert;
error:
str_t_clear(&thumbprint_bin);
LOG_ERROR("get_cert_by_thumbprint exit with error");
return NULL;
}
static PCCERT_CONTEXT
get_signer_cert(const cryptopro_context_t *ctx, HCERTSTORE hStoreHandle)
{
PCCERT_CONTEXT cert_ctx = get_cert_by_thumbprint(hStoreHandle, ctx->cert_thumbprint);
if (cert_ctx == NULL) {
goto error;
}
if (set_password(cert_ctx, ctx->password)) {
goto error;
}
@ -292,45 +325,6 @@ error:
return -1;
}
static PCCERT_CONTEXT
get_cert_by_thumbprint(HCERTSTORE hStoreHandle, const str_t* thumbprint)
{
str_t thumbprint_bin = str_t_null;
LOG_TRACE("get_cert_by_thumbprint enter");
if (hex_to_bin(thumbprint, &thumbprint_bin)) {
goto error;
}
CRYPT_HASH_BLOB hash = {
.pbData = (BYTE*)thumbprint_bin.data,
.cbData = thumbprint_bin.len
};
PCCERT_CONTEXT cert = cp_function_list.CertFindCertificateInStore(hStoreHandle,
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
0,
CERT_FIND_HASH,
&hash,
NULL);
if (cert == NULL) {
LOG_ERROR("Could not find certificate in store");
goto error;
}
str_t_clear(&thumbprint_bin);
LOG_TRACE("get_cert_by_thumbprint exit");
return cert;
error:
str_t_clear(&thumbprint_bin);
LOG_ERROR("get_cert_by_thumbprint exit with error");
return NULL;
}
static int
alg_id_from_str(const str_t* alg, /*out*/ ALG_ID* alg_id)
{

View file

@ -8,17 +8,17 @@
typedef struct cryptopro_context_s {
const char *signer;
const str_t *cert_thumbprint;
const str_t *password;
} cryptopro_context_t;
static inline void
cryptopro_context_set(cryptopro_context_t *ctx, const char *signer, const str_t *password)
cryptopro_context_set(cryptopro_context_t *ctx, const str_t *cert_thumbprint, const str_t *password)
{
assert(ctx != NULL);
ctx->signer = signer;
ctx->cert_thumbprint = cert_thumbprint;
ctx->password = password;
}

View file

@ -46,13 +46,13 @@ chown -R ervu:ervu /var/opt/cprocsp/keys/ervu/key_cont.000/
```
Получить следующие значения:
- Поле "Субъект": любая подстрока из этого поля является signer_subject (нужно будет указать в конфигурационном файле модуля подписания)
- Поле "SHA1 отпечаток": это значение нужно будет указать в конфигурационном файле модуля подписания в качестве настройки \<sign_cert_thumbprint\>
- Поле "Ссылка на ключ": убедиться, что значение равно "Есть" (иначе необходимо проверить выполнение предыдущих шагов)
4. (опционально) Сделать тестовую подпись с помощью установленного контейнера и полученных значений \<signer_subject\> и \<sign_cert_password\>:
4. (опционально) Сделать тестовую подпись с помощью установленного контейнера и полученных значений \<sign_cert_thumbprint\> и \<sign_cert_password\>:
``` bash
touch test.txt
/opt/cprocsp/bin/amd64/cryptcp -signf -dn <signer_subject> ./test.txt
/opt/cprocsp/bin/amd64/cryptcp -signf -thumbprint <sign_cert_thumbprint> ./test.txt
rm -f test.txt test.txt.sgn
```