Имя: Пароль:
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
Так открытым ключем вроде как не подписывают. Открытым ключем ключем шифруют. По смыслу так получается
Ошибка? Это не ошибка, это системная функция.