Ключевое слово в защите информации
ключевое слово
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline antonsay  
#1 Оставлено : 4 октября 2018 г. 13:37:47(UTC)
antonsay

Статус: Новичок

Группы: Участники
Зарегистрирован: 04.10.2018(UTC)
Сообщений: 3
Российская Федерация

Сказал(а) «Спасибо»: 1 раз
Добрый день.

На тестовой машине установлен КриптоПро CSP 4.0
Сформирован сертификат с поддержкой ГОСТ 2012 с использованием: https://cryptopro.ru/certsrv/certrqma.asp
Ссылка на скриншот: https://ibb.co/cCHnie

На C# написан код по получению OID алгоритма хэширования:

Код:

string _sOID = "";            
IntPtr hHashAlgInfo = IntPtr.Zero;
IntPtr hData = IntPtr.Zero;
CERT_CONTEXT pContext = (CERT_CONTEXT)Marshal.PtrToStructure(_hCertHandle, typeof(CERT_CONTEXT));
CERT_INFO pCertInfo = (CERT_INFO)Marshal.PtrToStructure(pContext.pCertInfo, typeof(CERT_INFO));
byte[]arData = BitConverter.GetBytes(Capi.CertOIDToAlgId(pCertInfo.SignatureAlgorithm.pszObjId));
hData = Marshal.AllocHGlobal(arData.Length);
Marshal.Copy(arData, 0, hData, arData.Length);
//// Поиск OID
hHashAlgInfo = CryptFindOIDInfo(CryptoConst.CRYPT_OID_INFO_ALGID_KEY, hData, OidGroup.HashAlgorithm);
CRYPT_OID_INFO pHashAlgInfo = (CRYPT_OID_INFO)Marshal.PtrToStructure(hHashAlgInfo, typeof(CRYPT_OID_INFO));
_sOID = pHashAlgInfo.pszOID;


В результате получаю: "1.2.643.2.2.9", что согласно таблице http://cpdn.cryptopro.ru/content/csp40/html/group___pro_c_s_p_ex_DP8.html соответствует szOID_CP_GOST_R3411.

При этом метод CryptSignMessage возвращает False при указании обозначенного выше OID, а отрабатывает только при явном указании OID "1.2.643.7.1.1.2.2", что соответствует szOID_CP_GOST_R3411_12_256 (собственно, именно этот алгоритм и выбирался при формировании тестового сертификата).

Подскажите, пожалуйста, как определить правильный OID в данном случае?

Причем, если я явно указываю имя контейнера и провайдер, то нужный OID удается получить для указанного сертификата, но это не совсем корректный способ (привожу куски кода):

Код:

CryptAcquireContext(ref hCrypto, contName, "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider", 
         80, CryptAcquireContextFlags.VerifyContext);
...
CryptGetProvParam(hCrypto, PP_ENUMALGS_EX, arData, ref iLen, iFlag);

IntPtr unPtr = Marshal.AllocHGlobal(iLen);
Marshal.Copy(arData, 0, unPtr, iLen);
PROV_ENUMALGS_EX pInfo = (PROV_ENUMALGS_EX)Marshal.PtrToStructure(unPtr, typeof(PROV_ENUMALGS_EX));

byte[] arDataAlg = BitConverter.GetBytes(pInfo.aiAlgid);
IntPtr hDataAlg = Marshal.AllocHGlobal(arDataAlg.Length);
Marshal.Copy(arDataAlg, 0, hDataAlg, arDataAlg.Length);

CryptFindOIDInfo(CRYPT_OID_INFO_ALGID_KEY, hDataAlg, OidGroup.HashAlgorithm);
CRYPT_OID_INFO pHashAlgInfo = (CRYPT_OID_INFO)Marshal.PtrToStructure(hHashAlgInfo2, typeof(CRYPT_OID_INFO));
_sOID = pHashAlgInfo.pszOID;

Отредактировано пользователем 4 октября 2018 г. 13:38:31(UTC)  | Причина: Не указана

Offline Александр Лавник  
#2 Оставлено : 4 октября 2018 г. 13:55:33(UTC)
Александр Лавник

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 30.06.2016(UTC)
Сообщений: 3,500
Мужчина
Российская Федерация

Сказал «Спасибо»: 53 раз
Поблагодарили: 808 раз в 745 постах
Автор: antonsay Перейти к цитате
Добрый день.

На тестовой машине установлен КриптоПро CSP 4.0
Сформирован сертификат с поддержкой ГОСТ 2012 с использованием: https://cryptopro.ru/certsrv/certrqma.asp
Ссылка на скриншот: https://ibb.co/cCHnie
...

Добрый день.

Для формирования тестового сертификата по ГОСТ Р 34.10-2012 используйте соответствующий тестовый удостоверяющий центр.
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Александр Лавник за этот пост.
antonsay оставлено 04.10.2018(UTC)
Offline antonsay  
#3 Оставлено : 4 октября 2018 г. 14:37:53(UTC)
antonsay

Статус: Новичок

Группы: Участники
Зарегистрирован: 04.10.2018(UTC)
Сообщений: 3
Российская Федерация

Сказал(а) «Спасибо»: 1 раз
Автор: Александр Лавник Перейти к цитате

Добрый день.

Для формирования тестового сертификата по ГОСТ Р 34.10-2012 используйте соответствующий тестовый удостоверяющий центр.



Спасибо, всему виной была некорректная ссылка. Проблема решена.
Offline antonsay  
#4 Оставлено : 4 октября 2018 г. 15:46:19(UTC)
antonsay

Статус: Новичок

Группы: Участники
Зарегистрирован: 04.10.2018(UTC)
Сообщений: 3
Российская Федерация

Сказал(а) «Спасибо»: 1 раз
Возник дополнительный вопрос:
Можно ли получить по этой ссылке: соответствующий тестовый удостоверяющий центр - сертификат с усиленной цифровой подписью?

Если да, то снова возникает проблема с тем, что указанный мной код возвращает OID "1.2.643.7.1.1.2.2", хотя должен вернуть "1.2.643.7.1.1.2.3".
И в свойствах полученного сертификата указано, что алгоритм хэширования подписи - ГОСТ Р 34.11-2012 256 бит, а открытый ключ: ГОСТ Р 34.10-2012 512 бит
Offline two_oceans  
#5 Оставлено : 5 октября 2018 г. 5:49:34(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 397 раз в 367 постах
Не так давно был аналогичный вопрос. https://www.cryptopro.ru...aspx?g=posts&t=14368
И еще было. ссылку так сразу не вспомню, пересказываю своими словами.

Похоже Вас вводят в заблуждение алгоритмы сертификата удостоверяющего центра. "Алгоритм подписи" и "Алгоритм хэширования подписи" соответствуют сертификату удостоверяющего центра, то есть речь идет о проверке подписи самого Вашего сертификата, а не об алгоритме, которым будете подписывать Вы сами этим сертификатом. Алгоритм своего сертификата и ключа нужно определять по полю "Открытый ключ". Программно это соответствует структуре PublicKeyInfo (pContext^.pCertInfo^.SubjectPublicKeyInfo в записи Дельфи), где есть информация об алгоритме хэширования, алгоритме подписи, параметрах алгоритмов. Обратите внимание, что у ГОСТ-2012 параметры хэширования отсутствуют и в соответствующем поле сертификата указан "заполнитель", который ничего не значит и который не нужно никуда передавать. В приведенном фрагмент кода как я понимаю, Вы тоже смотрите на поле "Алгоритм подписи" (pContext^.pCertInfo^.SignatureAlgorithm), что логически неверно и работает правильно только когда алгоритм и длина ключа удостоверяющего центра совпадает с алгоритмом и длиной ключа сертификата. Для аккредитованных Минкомсвязью удостоверяющих центров (АУЦ) алгоритм совпадает (так как запрещено подписывать сертификаты ГОСТ-2012 подписью ГОСТ-2001 и наоборот), про различия длины ключа гост-2012 мне пока не ясно будет ли она всегда совпадать у АУЦ, а вот у тестовых и зарубежных УЦ очень часто алгоритмы отличаются.

Тестовый УЦ ГОСТ-2012 подписывает сертификаты алгоритмом ГОСТ-2012 256 бит, а ключ похоже в Вашем случае выбирали для ГОСТ-2012 512 бит? Аналогично можно предположить, что в первом сообщении тестировался тестовый сертификат ГОСТ-2012, который УЦ подписал ГОСТ-2001. По аналогичным соображениям (чтобы не вводить в заблуждение различное ПО, которое смотрит не в то поле) Минкомсвязь рекомендовала аккредитованным удостоверяющим центрам подавать заявки на сертификаты ГОСТ-2012 256 бит, так как сам сертификат Минкомсвязи именно этого алгоритма.

У меня в поле открытый ключ показывается двойное обозначение длины 256 (512) и 512 (1024), это тоже нормально и зависит от описания оидов в реестре, первая цифра по названию алгоритма, вторая настоящий размер ключа (реально ключ в 2 раза длиннее чем длина в названии алгоритма).

Про усиление не могу точно подсказать, скорее всего тестовый сертификат без усиления цифровой подписи самого сертификата. Получится ли у Вас использовать усиленную подпись эти сертификатом - скорее да, но там много других нюансов, оид усиления по идее Вы уже сами доопределите по оиду в сертификате.

Отредактировано пользователем 5 октября 2018 г. 8:18:17(UTC)  | Причина: добавлена ссылка на аналогичный вопрос

thanks 1 пользователь поблагодарил two_oceans за этот пост.
dirt оставлено 10.09.2020(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.