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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline LONG11  
#1 Оставлено : 29 марта 2021 г. 11:42:24(UTC)
LONG11

Статус: Активный участник

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

Сказал(а) «Спасибо»: 23 раз
Добрый день.
Подскажите, пожалуйста, возможный путь (прототип действий) для преобразования объекта контекста сертификата CERT_CONTEXT, полученного с Token носителя в объект CAPICOM.ICertificate с целью использования в КриптоПро ЭЦП для создания усовершенствованной подписи.

Использовать подход поиска сертификата в установленных в хранилище

Код:
CPSigner oSigner = new CPSigner();
CAPICOM.ICertificate Cert = GetCertificate(CertThumbprint);
oSigner.Certificate = Cert;


не всегда возможен. Так как поставлена задача читать сертификат только с токена и не добавлять его в хранилище.

Возможно, есть какие-то пути решения?

Offline Андрей *  
#2 Оставлено : 29 марта 2021 г. 12:30:58(UTC)
Андрей *

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

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

Сказал «Спасибо»: 401 раз
Поблагодарили: 1644 раз в 1260 постах
Здравствуйте.

На демо-странице посмотрите, там есть в async_code.js поиск\добавление в список сертификатов из контейнеров.

oStore.Open(cadesplugin.CADESCOM_CONTAINER_STORE);
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
LONG11 оставлено 29.03.2021(UTC)
Offline Андрей *  
#3 Оставлено : 29 марта 2021 г. 12:42:20(UTC)
Андрей *

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

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

Сказал «Спасибо»: 401 раз
Поблагодарили: 1644 раз в 1260 постах
Техническую поддержку оказываем тут
Наша база знаний
Offline LONG11  
#4 Оставлено : 29 марта 2021 г. 12:49:23(UTC)
LONG11

Статус: Активный участник

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

Сказал(а) «Спасибо»: 23 раз
Автор: Андрей * Перейти к цитате
https://docs.cryptopro.ru/cades/reference/cadescom/cadescom_interface/iabout5mediafilter

MEDIA_TYPE_SCARD


Большое спасибо за помощь.

Я очень не умен ( и снова не понял примера...если C#

Код:
CPStore oStore = new CPStore(); // это интерфейс CAdESCOM.CPStore
oStore.Open([b]CADESCOM_STORE_LOCATION.CADESCOM_CONTAINER_STORE[/b]); // то тут ошибка: невозможно преобразовать CAdESCOM в CAPICOM


Но ведь oStore это итак CAdESCOM...

Отредактировано пользователем 29 марта 2021 г. 14:38:50(UTC)  | Причина: Не указана

Offline LONG11  
#5 Оставлено : 29 марта 2021 г. 14:49:02(UTC)
LONG11

Статус: Активный участник

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

Сказал(а) «Спасибо»: 23 раз
Андрей, прошу прощения, но не смог разобраться, поэтому изменил предыдущий пост, если не затруднит, помогите с ответом на вопрос по ошибке в предыдущем посте.

PS, поступил так: oStore.Open((CAPICOM.CAPICOM_STORE_LOCATION)CADESCOM_STORE_LOCATION.CADESCOM_CONTAINER_STORE);

Отредактировано пользователем 29 марта 2021 г. 15:47:15(UTC)  | Причина: Не указана

Offline LONG11  
#6 Оставлено : 1 апреля 2021 г. 17:11:00(UTC)
LONG11

Статус: Активный участник

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

Сказал(а) «Спасибо»: 23 раз
А может есть способ преобразовать хотя бы x509 .NET в ICertificate Capicom?

Так не работает:
Код:
CAPICOM.ICertificate Cert = null;
Cert.Import(Convert.ToBase64String(x509.GetRawCertData()));
Offline Андрей *  
#7 Оставлено : 1 апреля 2021 г. 17:35:03(UTC)
Андрей *

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

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

Сказал «Спасибо»: 401 раз
Поблагодарили: 1644 раз в 1260 постах
Автор: LONG11 Перейти к цитате
А может есть способ преобразовать хотя бы x509 .NET в ICertificate Capicom?

Так не работает:
Код:
CAPICOM.ICertificate Cert = null;
Cert.Import(Convert.ToBase64String(x509.GetRawCertData()));


что ожидается\зачем?
Техническую поддержку оказываем тут
Наша база знаний
Offline LONG11  
#8 Оставлено : 1 апреля 2021 г. 17:44:28(UTC)
LONG11

Статус: Активный участник

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

Сказал(а) «Спасибо»: 23 раз
Автор: Андрей * Перейти к цитате
Автор: LONG11 Перейти к цитате
А может есть способ преобразовать хотя бы x509 .NET в ICertificate Capicom?

Так не работает:
Код:
CAPICOM.ICertificate Cert = null;
Cert.Import(Convert.ToBase64String(x509.GetRawCertData()));


что ожидается\зачем?


Все та же навязчивая идея, с которой не отстают: имея контейнер и сертификат только на токене подписать усовершенствованной подписью. Без (как уже предлагалось хранилища сертификата в личном).

Понятно, что я получаю контекст сертификата, понятно, что я могу получить x509 с привязкой к контейнеру (и этим x509) подписывать из NET.
Но как только речь об усовершенствованной подписи - то самое (как я понимаю) легкий путь - это CAPICOM (CadesCom) от продукта КриптоПро ЭЦП, но для него тип получаемого сертификата - это CAPICOM.Icertificate. Который я не понимаю как еще получить, кроме как перебором store Личное (store Capicom). А у меня в личном ничего не должно быть - только токен.

Отредактировано пользователем 1 апреля 2021 г. 17:45:08(UTC)  | Причина: Не указана

Offline two_oceans  
#9 Оставлено : 2 апреля 2021 г. 8:30:28(UTC)
two_oceans

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

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

Сказал(а) «Спасибо»: 95 раз
Поблагодарили: 341 раз в 321 постах
Ну если включена служба "распространение сертификатов" и носитель именно токен, распознанный как смарт-карта, то "Личное" уже автоматом подтянет сертификат с токена, как только вставите токен.

Ближе к теме - теоретически в CryptoApi на хранилище "личное" свет клином не сошелся и теоретически можно использовать в CertOpenStore другие типы хранилищ. Если сможете использовать токен как хранилище некого типа - получите желаемый результат без махинаций с типами.

Есть тип хранилища CERT_STORE_PROV_SMART_CARD, но с пометкой что не используется. Возможно CERT_STORE_PROV_SERIALIZED или CERT_STORE_PROV_FILENAME подойдет для создания импровизированного хранилища, хотя это и выглядит притянутым за уши.
thanks 1 пользователь поблагодарил two_oceans за этот пост.
LONG11 оставлено 02.04.2021(UTC)
Offline LONG11  
#10 Оставлено : 2 апреля 2021 г. 12:37:02(UTC)
LONG11

Статус: Активный участник

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

Сказал(а) «Спасибо»: 23 раз
Автор: two_oceans Перейти к цитате
Ну если включена служба "распространение сертификатов" и носитель именно токен, распознанный как смарт-карта, то "Личное" уже автоматом подтянет сертификат с токена, как только вставите токен.

Ближе к теме - теоретически в CryptoApi на хранилище "личное" свет клином не сошелся и теоретически можно использовать в CertOpenStore другие типы хранилищ. Если сможете использовать токен как хранилище некого типа - получите желаемый результат без махинаций с типами.

Есть тип хранилища CERT_STORE_PROV_SMART_CARD, но с пометкой что не используется. Возможно CERT_STORE_PROV_SERIALIZED или CERT_STORE_PROV_FILENAME подойдет для создания импровизированного хранилища, хотя это и выглядит притянутым за уши.


Собственно, решение у нас простое, но оно оправдано для нас:
Люди заходят на терминальный сервер Windows. Далее в 1С (самописная). Пакетного подписания документов нет (для нас это вредно, надо чтобы каждый вдумчиво подписывался). В каждом документе 1С – кнопка «Подписать».
По кнопке виртуальным принтером получаем (для первой подписи) файл PDF. Далее реализованная на C# COM компонента с помощью CryptoApi: открывает контекст криптопровайдера (и, кстати, не закрывает его, не освобождая до момента закрытия самой 1С – это позволяет обращаться при повторном нажатии кнопки к кешу, и последующее подписание производится мгновенно и не требует повторного ввода пароля), далее перечисляются все контейнеры с флагом UNIQUE, чтобы получить в идентификаторе контейнера, что это Токен, получаем из контейнера контекст сертификата и производим встроенную в PDF открепленную подпись.
Для пользователя всего одна кнопка Подписать. Нет доп диалогов выбора сертификата. То есть интерфейсно все мило. Работать с кешем вынув ключ также не получится (не продвинутому пользователю), так как каждый раз производится опрос контейнеров. И при вставке пользователем другого Токена – будет подпись другим Токеном, так же без доп вопросов. Бизнесс-логика правомерности подписания того или иного документа тем или иным сертификатом реализована в 1С (проверка фирмы, и тд). То есть пользователю важно хранить свой ключ (так как люди разные и пароли по умолчанию не всегда меняются). То есть у нас Токен возведен в высшую ценность, бережется и тд.
Решение было (и есть) рабочее, пока не встал вопрос об усовершенствованной подписи. Конкретно сейчас для нас ее применение не столь необходимо, но как я понимаю руководство, это «красиво», это задел на будущее, да и ПО куплено, так почему бы и нет.
Я, не владея премудростями, решил, что CadesCom – хорошее решение. Проверил тестовые примеры – все отлично работает. Но контекст сертификата для CadesCom свой, и легко получается перебором из своего же типа (CadesCom-ного) хранилища.
Моя же идея сводится к тому, как имея контекст сертификата хоть x509, хоть CERT_CONTEXT CryptoApi подсунуть его CadesCom-у и выполнить подпись. Пока для меня это неразрешимая задача ).


Как мне кажется нужно двигаться в следующем направлении, использовать:
"КриптоПро ЭЦП SDK. Интерфейс языка C. Интерфейс клиентских приложений языка C спроектирован таким образом, чтобы дополнять или замещать функции Crypto API для работы с подписанными сообщениями и предоставляет две группы функций - низкоуровневые функции и упрощённые функции."

Вот пример:
https://cpdn.cryptopro.ru/content/cades/samplesimplifiedapisign.html

Но как это вызвать из C# я не очень понимаю. Я даже не очень понял, возможно ли просто рядом со своей dll (NET) положить:
В ряде случаев требуется установить только cades.dll или cadescom.dll, не устанавливая при этом КриптоПро ЭЦП SDK полностью. В таких случаях можно воспользоваться следующими дистрибутивами.
Не регистрируя как COM. И вызывать просто [DllImport("cades.dll")]

Отредактировано пользователем 2 апреля 2021 г. 13:01:27(UTC)  | Причина: Не указана

Offline two_oceans  
#11 Оставлено : 2 апреля 2021 г. 13:33:35(UTC)
two_oceans

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

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

Сказал(а) «Спасибо»: 95 раз
Поблагодарили: 341 раз в 321 постах
Вообще в NET не особо углубляюсь, но насколько понимаю, возможно смешивание библиотек.

Суть в том, что для своих библиотек NET использует управляемую память - автоматически выделяет/освобождает, а вот с внешними библиотеками надо использовать неуправляемую память и вручную выделять/освобождать. Мне где-то попадался пример как создавать запросы на сертификат подобным образом, обращаясь к CryptoApi прямо из NET (без классов криптографии), найду - отпишу. Для самой простой подписи этого и хватит. С усовершенствованной посложнее.
Далее для COM библиотек нужно еще и инициализировать систему COM.
Offline LONG11  
#12 Оставлено : 2 апреля 2021 г. 13:46:14(UTC)
LONG11

Статус: Активный участник

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

Сказал(а) «Спасибо»: 23 раз
Автор: two_oceans Перейти к цитате
Вообще в NET не особо углубляюсь, но насколько понимаю, возможно смешивание библиотек.

Суть в том, что для своих библиотек NET использует управляемую память - автоматически выделяет/освобождает, а вот с внешними библиотеками надо использовать неуправляемую память и вручную выделять/освобождать. Мне где-то попадался пример как создавать запросы на сертификат подобным образом, обращаясь к CryptoApi прямо из NET (без классов криптографии), найду - отпишу. Для самой простой подписи этого и хватит. С усовершенствованной посложнее.
Далее для COM библиотек нужно еще и инициализировать систему COM.


С обращением из Net к неуправляемой памяти и прочей маршализации структур - проблем нет особо. Благодаря форуму из NET научился работать с CryptoApi.
Другое дело, что плаваю вообще в понятии "усовершенствованная подпись", то есть понятно, что это заверенное время и проверка действительности всех сертификатов в цепочке. Но не понятно, как этим пользоваться из WinCryptoApi применительно к ГОСТ. Как я понимаю, решение КриптоПро ЭЦП и реализовано, чтобы помочь встраиванию в прикладные системы усовершенствованную подпись. И реализовано это как COM (CadesCom) для подключения как плагином, так и различным языкам (хоть VBA, VBS, ...Net). А также есть реализация в виде библиотек для языка С/С++. И в этом примере (выше) для С я (как я понял) используется для подписания как раз контекст сертификата WinCryptoApi и казалось бы проблема решена.

Но...мне не хватает знаний понять: 1) вообще прав ли я в своих рассуждениях; 2) можно ли подключить эту неуправляемую dll к С# и как объявлять вызовы и структуру...

Так как использование COM требует и контекста сертификата в типах Capi/Cades COM, а в примере языка С мне показалось, что контекст родной WinCryptoApi.

PS:
Нашел, что почитать умное.

Отредактировано пользователем 2 апреля 2021 г. 14:32:20(UTC)  | Причина: Не указана

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