Имя: Пароль:
1C
1С v8
1c 8.2 МенеджерКриптографии
0 Python
 
26.07.11
09:15
при создании объекта
МенеджерКриптографии = Новый МенеджерКриптографии("Microsoft RSA SChannel Cryptographic Provider", "",75);

вылетает ошибка "Ошибка при получении контекста модуля криптографии."
1 Python
 
26.07.11
09:17
попробовал провайдеры из етой ветки HKEY_LOCAL_MACHINE\SOFTWARE\Micr osoft\Cryptography\Defaults\Provider все равно не работает
2 vmv
 
26.07.11
09:34
Новый МенеджерКриптографии("Microsoft RSA SChannel Cryptographic Provider", "",75)

как-то подозрительно выглядит, хотя я не специалист по крипто
3 DmitrO
 
26.07.11
10:12
Менеджер = Новый МенеджерКриптографии("Microsoft Base Cryptographic Provider v1.0", "", 1);
4 RomaH
 
naïve
26.07.11
10:25
а откуда параметры брать для этого контсруктора

почему 1? почему 75?
5 DmitrO
 
26.07.11
10:47
Это комплексный ТИП провайдера. Определенные константы.
Определяет некоторые характеристики провайдера, такие как тип ключа обмена, тип сигнатуры, тип шифрования и хешинга.
Описывается в MSDN в разделе по криптографии.

Подсмотреть его можно в реестре в указанной в (1) ветке.
Создаются от туда не все, причина вероятно в 1С и в методах обеспечения функционала и в самом функционале, которые должен обеспечивать интерфейс механизма криптографии встроенный в платформу 8.2.
6 Python
 
26.07.11
18:11
шибка при вызове метода контекста (Подписать)
   НоваяПодпись = МенеджерКриптографии.Подписать(ПолноеИмяфайла,ПолноеИмяфайла1,Сертификат);    
по причине:
Сертификат отсутствует в персональном хранилище сертификатов.
7 oleg_km
 
26.07.11
22:16
Проверяйте, каком хранилище лежит ваш сертификат (консоль certificates.msc). Там несколько хранилищ: личные, других пользователей и т.д. Еще есть вроде как хранилище не пользователя, а компьютера. Потом какой тип имеет параметр Сертификат? Если строковый, то тоже нужно какой реквизит сертификата подразумевается: Понятное имя, Субъект. Я уже сталкивался с этим: WinAPI дает возможность выбрать любое свойство для идентификации, а скажем WinHTTP только по свойству Кому выдан. С этими обертками, что от 1С, что от MS все очень урбно получается. Они реализуют только часть функционала, на их взгляд наиболее востребованную и ты неожиданно натыкаешься на ограничение их реализации
8 zak555
 
26.07.11
22:38
закладка
9 Python
 
27.07.11
19:51
функция ПолучитьСписокСертификатовПоТипуОбекта(ТипОбъекта)Экспорт
   Перем результат;
   
       //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
   // Данный фрагмент построен конструктором.
   // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

   Запрос = Новый Запрос;
   Запрос.Текст =
       "ВЫБРАТЬ
       |    ЭЦП.видОбъекта,
       |    ЭЦП.Сертификат,
       |    ЭЦП.Порядок,
       |    ТИПЗНАЧЕНИЯ(ЭЦП.видОбъекта) КАК Тип
       |ИЗ
       |    РегистрСведений.ЭЦП КАК ЭЦП
       |ГДЕ
       |    ТИПЗНАЧЕНИЯ(ЭЦП.видОбъекта) = ТИПЗНАЧЕНИЯ(&видОбъекта)
       |
       |УПОРЯДОЧИТЬ ПО
       |    ЭЦП.Порядок";

   Запрос.УстановитьПараметр("видОбъекта", типОбъекта);

   РезультатЗапроса = Запрос.Выполнить();

   ТаблицаРезультатов = РезультатЗапроса.выгрузить();

   Сертификаты = НОвый СписокЗначений();
   
   Для Каждого строкаТаблицыРезультатов из ТаблицаРезультатов цикл
       
       ХранилищеСерификатов = строкаТаблицыРезультатов.Сертификат.Хранилище;
       
       Если ТипЗнч(ХранилищеСерификатов) <> Тип("ДвоичныеДанные") Тогда
           Данные = ХранилищеСерификатов.Получить();
       Иначе
           Данные = ХранилищеСерификатов;
       КонецЕсли;
   
       Если Данные <> Неопределено тогда
           
                 Сертификаты.Добавить(новый СертификатКриптографии(Данные));
       КонецЕсли;    

       
       
   КонецЦикла;    
   //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
   возврат  Сертификаты
КонецФункции

Функция ПодписатьФайл(Сертификат, полноеИмяФайла = неопределено) экспорт
   
   //Если Не ПодключитьРасширениеРаботыСКриптографией() Тогда
   //    Сообщить(НСтр("ru = 'Для требуемой операции необходимо установить расширение работы с криптографией'", "ru"));
   //    Возврат неопределено;
   //КонецЕсли;
   МенеджерКриптографии = Новый МенеджерКриптографии("Microsoft Enhanced Cryptographic Provider v1.0", "", 1);
   //МенеджерКриптографии = Новый МенеджерКриптографии("Microsoft Enhanced Cryptographic Provider v1.0",,РежимВключенияСертификатовКриптографии.ВключатьСертификатСубъекта);
   //МенеджерКриптографии = Новый МенеджерКриптографии("Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider", "",1);
       //МенеджерКриптографии = Новый МенеджерКриптографии("Microsoft Base Cryptographic Provider v1.0", "",1);
       //МенеджерКриптографии = Новый МенеджерКриптографии("Microsoft RSA SChannel Cryptographic Provider", "",1);
   //сообщить(Сертификат);
   
   //
   //МенеджерКриптографии.АлгоритмПодписи   = "Microsoft Enhanced Cryptographic Provider v1.0";
   //новыйСертификат = новый СертификатКриптографии();
   //
   //МенеджерКриптографии = Новый МенеджерКриптографии();
   
   Если полноеИмяФайла = неопределено тогда
       
       Диалог = РаботаСФайлами.ПолучитьДиалогВыбораФайлов(Истина);

       Если Не Диалог.Выбрать() Тогда
           Возврат неопределено;
       КонецЕсли;

       Для каждого ПолученноеИмяФайла Из Диалог.ВыбранныеФайлы Цикл

           ПолученныйФайл = Новый Файл(ПолученноеИмяФайла);
           Состояние("Добавляется файл: " + ПолученныйФайл.Имя);
           Отказ = Ложь;
           
           ПолноеИмяфайла = ПолученныйФайл.ПолноеИмя;
           
       КонецЦикла;
       
   конецЕсли;    
   
   ПолноеИмяфайла1 = "c:\temp";
   НоваяПодпись = МенеджерКриптографии.Подписать(ПолноеИмяфайла,Сертификат);    
   
   
   возврат НоваяПодпись;
КонецФункции

Процедура Кнопка1Нажатие(Элемент)
   // Вставить содержимое обработчика.
   
   ДанныеОСертификатах = ПолучитьСписокСертификатовПоТипуОбекта(Документы.ЕЦП_п.ПустаяСсылка());
   
   Для каждого Сертификат из ДанныеОСертификатах цикл
       
       
       ПодписатьФайл(Сертификат.Значение);
       
   КонецЦикла;    
КонецПроцедуры

я беру сертификат из двоичный даных - он там есть
10 loh_pedalny
 
27.07.11
20:08
мдя... В курсе, что сертификаты хранятся не в Регистрах сведений, а в хранилище сертификатов на компе?
11 loh_pedalny
 
27.07.11
20:09
+(10) этим кодом с таким же успехом можно и жпегами попробовать поставить подпись
12 Python
 
27.07.11
20:15
сертификаты можно хранить и в двоичных данных
13 loh_pedalny
 
27.07.11
20:19
можно, но только менеджер криптографии от MS о них ничо не знает. Их поначалу неплохо бы в хранилище импортировать, а уж потом...
14 oleg_km
 
28.07.11
08:14
А действительно, как сертификат попал в регистр сведений, из какого файла? Раз им подписываю сообщение, значит это сертификат с закрытым ключем. Разве можно держать сертификат с закрытым ключем для MS криптопровайдера в файле? По-моему только в p12 для импорта. Если кто знает - подскажите, а то надоедает каждый раз импортировать в хранилице
15 Python
 
28.07.11
18:25
алгоритм 1.2.804.2.1.1.1.1.3.1.1
а если это открытый ключ то как им подписать
16 oleg_km
 
28.07.11
19:10
Так открытым ключем вроде как не подписывают. Открытым ключем ключем шифруют. По смыслу так получается
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn