SUPPORT-8592. Переименована настройка sign::pin в sign::sign_cert_password

This commit is contained in:
alashkova 2024-10-22 11:31:34 +03:00
parent 4c1e5c3562
commit 59005fe670
7 changed files with 30 additions and 32 deletions

View file

@ -91,7 +91,7 @@ fcgi_thread_pool_size = 1 *\# значение по умолчанию: 1*
- В секции **\[sign\]** задать настройки модуля подписания:
location = /sign *\# значение по умолчанию: /sign, должно совпадать со значением в nginx.conf*
signer_subject = signer@example.ru *\# email, ИНН, СНИЛС или любая другая строка из свойства контейнера «Субъект»*
pin = \*\*\*\* *\# пароль от контейнера*
sign_cert_password = \*\*\*\* *\# пароль от контейнера*
- В секции **\[verify\]** задать настройки проверки подписи маркера доступа:
location = /verify *\# значение по умолчанию: /verify, должно совпадать со значением в nginx.conf*

View file

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

View file

@ -7,7 +7,7 @@
#define SIGN_CONF_SECTION "sign"
#define SIGN_CONF_KEY_LOCATION "location"
#define SIGN_CONF_KEY_SIGNER "signer_subject"
#define SIGN_CONF_KEY_PIN "pin"
#define SIGN_CONF_KEY_PASSWORD "sign_cert_password"
#define FCGI_OK_RESPONSE_FORMAT \
"Content-type: text/plain" CRLF\
@ -66,8 +66,8 @@ sign_conf_load(sign_conf_t *conf, const conf_file_context_t conf_file)
},
{
SIGN_CONF_SECTION,
SIGN_CONF_KEY_PIN,
&(conf->pin),
SIGN_CONF_KEY_PASSWORD,
&(conf->sign_cert_password),
CONF_FILE_VALUE_STRT,
CONF_FILE_VALUE_PSWD,
NULL
@ -94,10 +94,10 @@ sign_conf_clear(sign_conf_t *conf)
if (conf == NULL) return;
if (conf->pin.data != 0) {
explicit_bzero(conf->pin.data, conf->pin.len);
if (conf->sign_cert_password.data != 0) {
explicit_bzero(conf->sign_cert_password.data, conf->sign_cert_password.len);
}
str_t_clear(&conf->pin);
str_t_clear(&conf->sign_cert_password);
str_t_clear(&conf->location);
free(conf->signer);
@ -118,7 +118,7 @@ sign_service_create(const sign_conf_t *conf)
hsign->conf = conf;
cryptopro_context_set(&hsign->cryptopro_ctx, conf->signer, &conf->pin);
cryptopro_context_set(&hsign->cryptopro_ctx, conf->signer, &conf->sign_cert_password);
LOG_TRACE("sign_service_create exit");
return (HSign)hsign;

View file

@ -12,7 +12,7 @@ typedef struct sign_conf_s {
str_t location;
char *signer; /* субъект контейнера */
str_t pin; /* pin-код от контейнера */
str_t sign_cert_password; /* пароль от контейнера */
} sign_conf_t;

View file

@ -16,7 +16,7 @@ static HCERTSTORE cert_open_store();
static PCCERT_CONTEXT get_signer_cert(const cryptopro_context_t *ctx, HCERTSTORE hStoreHandle);
static int set_pin(PCCERT_CONTEXT pSignerCert, const str_t *pin);
static int set_password(PCCERT_CONTEXT cert_ctx, const str_t *password);
bool
cryptopro_init(const char* cp_file)
@ -45,7 +45,7 @@ cryptopro_sign(const cryptopro_context_t *ctx, const str_t *data, /*out*/ str_t
assert(ctx != NULL);
assert(ctx->signer != NULL);
assert(ctx->pin != NULL);
assert(ctx->password != NULL);
assert(data != NULL && !str_t_is_null(*data));
assert(sign != NULL);
@ -211,45 +211,43 @@ cert_open_store()
static PCCERT_CONTEXT
get_signer_cert(const cryptopro_context_t *ctx, HCERTSTORE hStoreHandle)
{
PCCERT_CONTEXT pSignerCert;
pSignerCert = cp_function_list.CertFindCertificateInStore(hStoreHandle,
PCCERT_CONTEXT cert_ctx = cp_function_list.CertFindCertificateInStore(hStoreHandle,
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
0,
CERT_FIND_SUBJECT_STR,
ctx->signer,
NULL);
if (pSignerCert == NULL) {
if (cert_ctx == NULL) {
LOG_ERROR("Could not find certificate in store");
goto error;
}
if (set_pin(pSignerCert, ctx->pin)) {
if (set_password(cert_ctx, ctx->password)) {
goto error;
}
LOG_DEBUG("The signer's certificate was found");
return pSignerCert;
return cert_ctx;
error:
if (pSignerCert) {
cp_function_list.CertFreeCertificateContext(pSignerCert);
if (cert_ctx) {
cp_function_list.CertFreeCertificateContext(cert_ctx);
}
LOG_ERROR("get_signer_cert exit with error");
return NULL;
}
static int
set_pin(PCCERT_CONTEXT pSignerCert, const str_t *pin)
set_password(PCCERT_CONTEXT cert_ctx, const str_t *password)
{
DWORD dwSize;
if (!cp_function_list.CertGetCertificateContextProperty(
pSignerCert,
cert_ctx,
CERT_KEY_PROV_INFO_PROP_ID,
NULL,
&dwSize)) {
LOG_ERROR("Error getting key property");
LOG_ERROR("set_pin exit with error. Last error code: 0x%08x", cp_function_list.GetLastError());
LOG_ERROR("set_password exit with error. Last error code: 0x%08x", cp_function_list.GetLastError());
return -1;
}
@ -257,7 +255,7 @@ set_pin(PCCERT_CONTEXT pSignerCert, const str_t *pin)
CRYPT_KEY_PROV_INFO* pKeyInfo = (CRYPT_KEY_PROV_INFO*) pKeyInfoBuffer;
if (!cp_function_list.CertGetCertificateContextProperty(
pSignerCert,
cert_ctx,
CERT_KEY_PROV_INFO_PROP_ID,
pKeyInfo,
&dwSize)){
@ -272,14 +270,14 @@ set_pin(PCCERT_CONTEXT pSignerCert, const str_t *pin)
memset(&keyProvParam, 0, sizeof(CRYPT_KEY_PROV_PARAM));
keyProvParam.dwFlags = 0;
keyProvParam.dwParam = keyType;
keyProvParam.cbData = (DWORD)(pin->len + 1);
keyProvParam.pbData = (BYTE*) pin->data;
keyProvParam.cbData = (DWORD)(password->len + 1);
keyProvParam.pbData = (BYTE*) password->data;
pKeyInfo->cProvParam = 1;
pKeyInfo->rgProvParam = &keyProvParam;
if (!cp_function_list.CertSetCertificateContextProperty(
pSignerCert,
cert_ctx,
CERT_KEY_PROV_INFO_PROP_ID,
0,
pKeyInfo)) {
@ -290,7 +288,7 @@ set_pin(PCCERT_CONTEXT pSignerCert, const str_t *pin)
return 0;
error:
LOG_ERROR("set_pin exit with error. Last error code: 0x%08x", cp_function_list.GetLastError());
LOG_ERROR("set_password exit with error. Last error code: 0x%08x", cp_function_list.GetLastError());
return -1;
}

View file

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

View file

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