Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Наши способы организации безопасного удалённого доступа к рабочим местам и корпоративным ресурсам
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Artem Kozelev  
#1 Оставлено : 7 октября 2019 г. 16:48:25(UTC)
Artem Kozelev

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

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

Установил
КриптоПро CSP 5.0.11233
КриптоПро .Net Клиент 1.0.7132.2

Поставил
coreFx v2.2.5 по инструкции с вики

Создал самоподписанный ключ и установил

Код:
csptest -keyset -newkeyset -makecert -container test -keytype exchange



Создал приложение на asp.net core 3.0.
Добавил в приложение GostCryptography форк
Апнул до 3.0, добавил coreFx, который сбилдил

Скопировал из GostCryptography пример SignSmevRequest метода. Кидаю туда пример xmlDocument'а из того же теста. Сертификат достаю по отпечатку (thumbprint'у). Закидываю это в метод для подписания и... во время выполнения signedXml.ComputeSignature() (строка 73) у меня вылезает окно с предложением создать контейнер.

UserPostedImage

Если я его создаю, то все прекрасно отрабатывает и сообщение подписывается, но, очевидно, мне нужно использовать мой собственный, уже созданный, контейнер, привязанный к сертификату. Покапавшись глубже, можно заметить, что ранее, на моменте вызова метода signedXml.SetSigningCertificate(signingCertificate) (строка 54) в глубине вызывается метод расширение GetPrivateKeyInfo у класса X509CertificateHelper (строка 17). В этом методе, на строке 32 вызывается такая функция

Код:
_getPrivateKeyInfoMethod = typeof(X509Certificate2).GetMethod("GetPrivateKeyInfo", BindingFlags.Static | BindingFlags.NonPublic);

Так вот, она у меня всегда возвращает null, из-за чего весь метод возвращает null. Это далее приводит к тому, что в классе Gost3410AsymmetricAlgorithm в методе CreateProviderParameters (строка 714) создается рандомное имя контейнера на строке 748. Полагаю в итоге вся эта цепочка приводит к тому, что требуется создание нового контейнера для ключа, а может я не туда копаю. Но вопрос остается, как мне освободиться от постоянного окошка с созданием контейнера? Я не правильно что-то вызываю, неверно что-то установил или какая-то беда с моим сертификатом?

Отредактировано пользователем 8 октября 2019 г. 9:12:26(UTC)  | Причина: Не указана

Offline two_oceans  
#2 Оставлено : 8 октября 2019 г. 4:53:49(UTC)
two_oceans

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

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

Сказал(а) «Спасибо»: 63 раз
Поблагодарили: 228 раз в 214 постах
Добрый день. Предположу, что по какой-то причине контейнер не находится. Для поиска по thumbprint сертификата, этот сертификат должен присутсвовать в нужном хранилище и иметь привязку к контейнеру закрытого ключа. Тут еще важный момент в хранилище пользователя или в хранилище компьютера ищет библиотека GostCryptography. метод GetPrivateKeyInfo судя по названию извлекает информацию о привязке сертификата к контейнеру закрытого ключа, поэтому возврат null скорее всего говорит об отсутвии привязки. Создаваемое имя контейнера меняется? Если меняется, то привязки нет, если одинаковое, то привязка есть, но не найден контейнер, указаный в привязке.

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

Отредактировано пользователем 8 октября 2019 г. 4:54:20(UTC)  | Причина: Не указана

Offline Artem Kozelev  
#3 Оставлено : 8 октября 2019 г. 8:48:23(UTC)
Artem Kozelev

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

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

Мой контейнер, StoreLocation=CurrentUser, StoreName=My. Хранится в реестре.
Мой контейнер

Мой сертификат
Мой сертификат

Заметил, кстати, что когда мне предлагают создать контейнер, то создается контейнер не ГОСТ Р 34.10-2012 DH 256 бит, а ГОСТ Р 34.10-2001 DH.
Создаваемый GostCryptography контейнер
Создаваемый GostCryptography контейнер

По поводу метода, да, возможно он извлекает информацию о привязке сертификата к контейнеру, но конкретно та строчка что я кинул (строка 32), возвращает метод GetPrivateKeyInfo из класса X509Certificate2. Тот факт, что она возвращает null, говорит о том, что в классе X509Certificate2 метод GetPrivateKeyInfo не найден вовсе, а значит нечем извлекать информацию о привязке сертификата к контейнеру.
Так же наверное стоит упомянуть, что метод HasPrivateKey возвращает true, так что у сертификата установлен приватный ключ.

Отредактировано пользователем 8 октября 2019 г. 9:10:17(UTC)  | Причина: Не указана

Offline two_oceans  
#4 Оставлено : 8 октября 2019 г. 10:00:50(UTC)
two_oceans

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

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

Сказал(а) «Спасибо»: 63 раз
Поблагодарили: 228 раз в 214 постах
Ага, начинает вырисовываться. Gost3410AsymmetricAlgorithm это как я понимаю класс для гост-2001, потому он и создает контейнер гост-2001. Значит нужно использовать версии КриптоПро .NET и GostCryptography с поддержкой гост-2012.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.