1 (2017-11-03 14:50:19 отредактировано krasnov)

Тема: ms crypto api по 2012 сертификату берется 2001 провайдер

Доброго времени суток всем!

Предыстория.
Работаем через MS Crypto API.
Сертификат устанавливаем в системное хранилище Windows через Сигнатуру на закладке Сертификаты:

  1. выбираем Текущий пользователь

  2. выбираем файл с раширением cer (предварительно выгруженный из Справочника сертификатов)

  3. Хранилище - Личное

  4. Имя ключа сертификата - выбираем то что на считывателе (в данном случае флеш накопитель)

  5. Имя - пишем какое-нибудь понятное имя

  6. нажимаем кропку Установить.

Далее программно ищем сертификат в хранилище, берем его контекст и смотрим CERT_KEY_PROV_INFO_PROP_ID в его св-вах, получаем CRYPT_KEY_PROV_INFO, находим в структуре контейнер, имя провайдера и его тип и получаем ссылку на криптопровайдер через CryptAcquireContext. Далее подписываем, заполняя CMSG_SIGNER_ENCODE_INFO и тд.

История.
Всё работало хорошо на разных компьютерах, пока не появился один, где берется не тот провайдер и следом не тот алгоритм хэширования. Затем уже не проверяется подпись, тк на другой стороне по сертификату берутся 2012е алгоритмы.

Условный лог проблемной машины:

--------------------------------------------------
Фильтрация сертификатов: UserKeyId=40 50 13 70 BC 10 F2 74 E0 01 22 09 58 7F 6F 94. Осталось 1
--------------------------------------------------
Provider: ContainerName=4903RHGVBZ01. ProvName=Validata GOST R 34.10-2001 CSP. ProvType=75.
--------------------------------------------------
HashAlgInCryptoProvider: alg=1.2.643.2.2.9 - ГОСТ Р 34.11-94.
--------------------------------------------------
Sign: cert=40501370BC10F274E0012209587F6F94-CN=PROCESSING**9, OU=********05, O=OK**5, L=REGRNP, S=**, C=RU. keyspec=1. halg=1.2.643.7.1.1.3.2-ГОСТ Р 34.11-2012/ГОСТ Р 34.10-2012.

Условный лог здоровой машины:

--------------------------------------------------
Фильтрация сертификатов: UserKeyId=40 50 13 70 cb 53 60 43 a6 d3 6f 23 58 60 8e ce. Осталось 1
--------------------------------------------------
Provider: ContainerName=0903V285XB01. ProvName=Validata GOST R 34.10-2012 CSP. ProvType=80.
--------------------------------------------------
HashAlgInCryptoProvider: alg=1.2.643.7.1.1.2.2 - ГОСТ Р 34.11-2012.
-------------------------------------------------- 
Sign: cert=40501370CB536043A6D36F2358608ECE-CN=PROCESSING**5, OU=********11, O=OK**1, L=REGRNP, S=**, C=RU. keyspec=1. halg=1.2.643.7.1.1.3.2-ГОСТ Р 34.11-2012/ГОСТ Р 34.10-2012.

Подскажите куда копать, что посмотреть и проверить?

2

Re: ms crypto api по 2012 сертификату берется 2001 провайдер

Добрый день!

Скорее всего на проблемной машине ключ сгенерирован по 2001 ГОСТу. Для проверки нужно открыть сертификат в Справочнике Сертификатов, алгоритм указан в поле "Ключ проверки ЭП" на вкладке "Состав".

3

Re: ms crypto api по 2012 сертификату берется 2001 провайдер

alart пишет:

Добрый день!
Скорее всего на проблемной машине ключ сгенерирован по 2001 ГОСТу. Для проверки нужно открыть сертификат в Справочнике Сертификатов, алгоритм указан в поле "Ключ проверки ЭП" на вкладке "Состав".

Такие данные я проверял, к сожалению они не имеют отличий от рабочих машин сертификатов.

Ключ проверки ЭП Владельца:
  Алгоритм ключа проверки ЭП: Подпись ГОСТ Р 34.10-2012
  Ключ проверки ЭП ГОСТ Р 34.10-2012:
   Параметры алгоритма:
    Параметры ключа: Параметры Диффи-Хеллмана вариант провайдера
    Параметры ключа: Хэш ГОСТ Р 34.11-2012
   Длина ключа: 512 бит
   
Алгоритм ЭП: Подпись ГОСТ Р 34.10-2012 с хэш ГОСТ Р 34.11-2012

Тут скорее всего дело в машине. Может быть регистрация криптопровайдера поломана или какая связь алгоритмов с криптопровайдером?

4

Re: ms crypto api по 2012 сертификату берется 2001 провайдер

Можно попробовать удалить сертификат из системного хранилища Windows и потом заново его установить.

И напишите, пожалуйста, какая версия Сигнатуры используется на проблемной машине.