Имя: Пароль:
1C
 
МенеджерКриптографии. Как использовать?
0 Help1с
 
21.03.16
09:39
Добрый день.
Как я понял нельзя в 1с понять файл содержит подпись или нет. Как проверить файл содержит ЭЦП или нет?

Может кто подскажет как должен работать механизм проверки подписанного файла в 1С?
1 Help1с
 
21.03.16
09:39
Мое видение процесса:
1. Получаем файл от контрагента.
2. В конфигурации должен быть регистр соответствия Сертификатов конкретному Контрагенту.
3. Методом перебора всех сертификатов и проверкой наличия данного сертификата в полученном файле узнаем что это за контрагент.
4. Проверяем действительность сертификата.

Пункт 3 не нравится.
Пункт 4 не знаю как реализовать.
2 Fedor-1971
 
21.03.16
10:09
(1) Для начала ответь на вопрос: каким ПО криптографии собираешься пользоваться? Avest, Copicom или нечто другое. Как определишься - выясняешь методы работы выбранной системы.

В идеале, работа с шифрованными данными выглядит так:
1. Получили файл
2. Скормили его системе шифрования, на предмет определения есть подпись или нет
3. Попросили расшифровать, если подпись есть
Вполне вероятно, что п.2 и п.3 выполняются за одно действие.

Не изобретай велосипед, там где он не нужен. До тебя уже всё сделали и придумали как хранить сертификаты (выпуск, отзыв, обмен, локальное хранилище, обмен с выше стоящим УЦ), как проверять их актуальность, как использовать в шифровании/дешифровании данных и проч.
3 Help1с
 
21.03.16
10:45
(2) посмотреть бы этот велосипед. :)
про первый вопрос - вообще думал что КриптоПро буду использовать и МенеджерКриптографии.
4 Fedor-1971
 
21.03.16
11:38
(3) вот и почитай как работает, где хранит ключи, как получает сертификат, какие функции доступны для программного использования.
Как минимум на сайте производителя.
На сколько я помню, там целая система замкнутая на носитель контейнера, вроде всё на нём и хранится.
5 Help1с
 
21.03.16
12:03
(4) дело в том, что у нас контейнера быть не может. мы же просто получаем подписанный файл.
6 Fedor-1971
 
21.03.16
12:40
(5) о на как! Тогда о каких сертификатах идёт речь?
"подписанный файл" - по сути проходит двойное шифрование, сначала шифруется область подписи, т.е. с используется шифрование на основе закрытого ключа отправителя (для проверки именно отправителя), потом шифруется всё сообщение твоим открытым ключом.
По получении расшифровываем своим закрытым ключом всё сообщение и проверяем подпись используя открытый ключ отправителя.
Могу ошибаться в деталях, но общая идеология именно такая.

Изучил бы для начала предметную область.
А без минимальных знаний в оной вопросы "Как должна работать проверка подписи в 1С" аналогичны "Есть ли жизнь на Марсе?"
7 Serginio1
 
21.03.16
12:56
(3) Если, что посмотри http://www.cryptopro.ru/products/net
8 Гость из Мариуполя
 
гуру
21.03.16
13:11
(6) офигеть ты загнул.
сходи на сайт bus.gov.ru
выбери любое учреждение.
перейди в раздел "Подробная информация"
открой там "Документы"
о чудо! все документы подписаны ЭЦП! ЭЦП можно посмотреть. Документы можно скачать. При этом моего ключа ни открытого, ни закрытого нету и в помине. Нету у меня ключа вообще. А ЭЦП у документов, размещенных на сайте, есть. И я эту ЭЦП вижу.

Во, к примеру, первый попавшийся: Открывай "Документы" и любуйся на "Подпись". http://bus.gov.ru/pub/agency/109629

ситуация точь в точь как в (5).

Так что предметнаяобласть - она тоже.. разная.. И кой-кому тоже бы не помешало ее подучить. :)
9 Borteg
 
21.03.16
13:17
(8) шифруется сообщение при передаче от одного пользователя к другому, чтобы при перехвате сообщение не могли открыть, а только конечный получатель своим закрытым ключом. Если они лежат в открытым доступе значит расшифровка уже была произведена, электронную подпись ты тоже видишь, не имея сертификата открытого ключа ты не сможешь проверить подлинность этой электронной подписи, так как не сможешь сформировать хэш документа и сверить его с хэшем в электронной подписи.
10 Borteg
 
21.03.16
13:19
(9) + с первого апреля этого года, проверка хэша в электронной подписи является обязательным условием для юридической значимости документа, если подпись не хранит хэш - документ не имеет силы
11 Гость из Мариуполя
 
гуру
21.03.16
13:39
(9) Я согласен, что шифруется и т.д. и т.п. Для двухстороннего обмена.
Но.. не надо.. смешивать шифрование и подпись.
Для признания юридической значимости документ не обязательно шифровать. Котировочные заявки на госзакупках, электронные аукционы, госконтракты по их итогам т.д.и т.п. Я для кого bus.gov.ru привел? могу еще на zakupki.gov.ru отправить.
В общем. ситация схожая с (5) - сплошь и рядом.

Так что для двухстороннего обмена - одно дело. Можно и шифровать, и обменяться открытыми ключами и т.д.

Для документов же, выложенных в публичный доступ, можно использовать, к примеру - http://www.cryptopro.ru/sites/default/files/products/office-signature/2.0.11386/cryptopro_office_signature.pdf
там и про хэширование, и крипто.net упомянут

а также можно посмотреть, к примеру, вот сюда http://cryptoarm.ru
12 Borteg
 
21.03.16
13:52
(11) если у тебя нету открытого ключа ты не сможешь проверить подлинность подписи.
13 Borteg
 
21.03.16
13:52
(11) так же как и подлинность документа
14 Help1с
 
21.03.16
13:53
как бы это все в 1с реализовать...
15 Serginio1
 
21.03.16
14:06
16 Serginio1
 
21.03.16
14:11
17 Serginio1
 
21.03.16
14:23
18 Help1с
 
21.03.16
15:14
Serginio1 спасибо за ссылки. читаю :)
19 Help1с
 
22.03.16
09:21
нашел вот такой код:

&НаКлиенте
Процедура ПроверитьПодпись(Команда)
    МенеджерКриптографии = Новый МенеджерКриптографии("Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider", "", 75);
    МенеджерКриптографии.ПроверитьПодпись("D:\ФайлДляПодписи.txt", "D:\Подпись.txt");
    Сообщить("Подпись верна!");
КонецПроцедуры

где лучше хранить подпись? у нас не будет файла. это я про свои пункты 2 и 3 из (1) - не нравится мне такая схема.
20 Help1с
 
22.03.16
12:37
Как лучше и как правильно связать подпись с контрагентом?
когда мы получаем файл мы не знаем кто его отправил. нужно все имеющиеся подписи проверить? может есть более красивый вариант?
21 Help1с
 
23.03.16
14:04
Делаю:
МенеджерКриптографии.ПроверитьСертификат(Сертификат);

Выходит ошибка:
Сертификат не предназначен для указанного использования

что это?
22 Serginio1
 
23.03.16
15:03
А у тебя Крипто про то стоит?
23 Help1с
 
24.03.16
09:44
(22) да.
24 Serginio1
 
24.03.16
10:02
(23) Попробуй 7, пока в теме молчание
Использование классов .Net в 1С для новичков
25 Help1с
 
24.03.16
11:35
(24) спасибо. почитаю.
26 Help1с
 
24.03.16
11:46
(25) не понятно куда копать, там не то что мне нужно. (
27 Garykom
 
гуру
24.03.16
11:52
ТСу продавть СП еще не предлагали?

СертификатКриптографии.ОткрытыйКлюч (CryptoCertificate.PublicKey)
СертификатКриптографии (CryptoCertificate)
ОткрытыйКлюч (PublicKey)
Использование:

Только чтение.
Описание:

Тип: ДвоичныеДанные.
Содержит данные открытого ключа.

Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
28 Serginio1
 
24.03.16
12:13
(26) Что из этого тебе не нужно
КриптоПро .NET - программный продукт, позволяющий использовать средство криптографической защиты информации (СКЗИ) КриптоПро CSP на платформе Microsoft .NET Framework. КриптоПро .NET является новой версией существовавшего ранее программного продукта КриптоПро Sharpei и реализует набор интерфейсов для доступа к криптографическим операциям .NET Cryptographic Provider:
хэширование;
подпись;
шифрование;
MAC;
генерация ключей и т.д.
29 Help1с
 
24.03.16
12:13
(27) сертификаты в системе я вижу. вопрос как прочитать сертификат и подпись в документе ексель.
30 Garykom
 
гуру
24.03.16
12:20
(29) "Подпись" (ЭП/ЭЦП) это хеш файла (который подписываем) зашифрованный приватным (или открытым) ключем (из пары ключей открытый/приватный)

"Проверка подписи" это берется изначальный файл и считается его хеш снова. Затем берется зашифрованный хеш, расшифровывается нужным ключем (вторым к тому которым был зашифрован). И сверяется 2 хеша на совпадение.
31 Garykom
 
гуру
24.03.16
12:21
(30)+ Если хеш файла был зашифрован приватным ключем контрагента (которого у вас понятно нет он чужой).
То проверять подпись нужно открытым ключем контрагента (взять его из сертификата ключа контрагента)
32 Help1с
 
24.03.16
12:27
(30) как можно получить изначальный файл?
33 Garykom
 
гуру
24.03.16
12:29
(32) эээ, вам бы сферу деятельности сменить... точно знаю что дикая нехватка кадров есть в рабочих сферах
34 Serginio1
 
24.03.16
12:31
35 Garykom
 
гуру
24.03.16
12:33
Обычно то что называют "подписанным файлом" это по сути просто зашифрованный изначальный файл (возможно к которому добавили его хеш) и зашифровали приватным ключем.

Поэтому если расшифровать открытым ключем то и получится "исходный файл".

Смотреть по размеру этого "подписанного" если он всегда одинаковый и не зависит от размера исходного то это только хеш с подписью. Если большой то сам файл исходный внутри.
36 tank_25
 
24.03.16
12:33
(33)(34)
Какие все умные.
Из встроенного языка 1С как получить первичный файл без подписи?
37 Garykom
 
гуру
24.03.16
12:35
(35)+ И чтобы было понятно то шифрованный файл это когда подписывают открытым ключем получателя. Тогда только зная приватный ключ (получателя) можно расшифровать.
Проверки подписи в этом смысле нет потому что открытый ключ получателя много кому известен.
38 Garykom
 
гуру
24.03.16
12:35
(36) Обратиться к специалистам?
39 tank_25
 
24.03.16
12:36
(38) Вот обращаемся.
Есть пример хотя бы приблизительный?
40 tank_25
 
24.03.16
12:37
+(39) Вот есть на входе файл с подписью, не зашифрованный.
41 Garykom
 
гуру
24.03.16
12:39
(39) Платным специалистам
42 Help1с
 
24.03.16
12:42
(40) +1
Дано: Файл Эксель подписанный контрагентом. Сертификат контрагента у нас отсутствует.
Необходимо: Выполнить проверку действительности подписи, если подпись действительна, то выполняем операции с файлом. Еще нужно по полученному сертификату найти контрагента.
43 tank_25
 
24.03.16
12:43
(41) Понятно. Нет бы честно признаться, что средствами встроенного языка это сделать нельзя. Начинаются тут отмазки.
44 Help1с
 
24.03.16
12:44
(43) как я понял это можно сделать СОМ объектом, типа КапиКом, но он снят с поддержки, и у меня не получилось.
45 Garykom
 
гуру
24.03.16
12:54
(42) >Сертификат контрагента у нас отсутствует.

У вас нет образца подписи совсем (в переводу на ручную).
Что с чем вы собираетесь сверять?
46 Garykom
 
гуру
24.03.16
12:55
(45)+ смените работу... пока вам ее принудительно не предложили поменять с такими знаниями
47 Help1с
 
24.03.16
12:58
(45) для начала нужно из файла получить сертификат. вы знаете как это сделать?
48 Garykom
 
гуру
24.03.16
13:02
(47) А с какого перепугу там должен он быть?
49 MishaD
 
24.03.16
13:03
(47) надеюсь не из файла Excel ?
50 Help1с
 
24.03.16
13:04
(48) контрагент подписал файл эксель. нужно получить из этого эксель подпись, из подписи получить сертификат(ы) и проверить его на актуальность.
51 Help1с
 
24.03.16
13:05
(49) в том то и дело что из эксель.
52 Help1с
 
24.03.16
13:05
(50) + я так представляю порядок работы.
53 Garykom
 
гуру
24.03.16
13:22
(50) >контрагент подписал файл эксель. нужно получить из этого эксель подпись, из подписи получить сертификат(ы) и проверить его на актуальность.

Если вы сумеете это сделать то нобелевка за вскрытие криптографии вам обеспечена!
54 Garykom
 
гуру
24.03.16
13:25
(53)+ причем сделать без использования отдельно переданного/полученного сертификата подписи контрагента (с открытым ключом внутри его)
55 Garykom
 
гуру
24.03.16
13:27
(53)+ хотя насчет нобелевки это я погорячился... просто не доживете... раньше закопают
56 Serginio1
 
24.03.16
13:51
57 Help1с
 
24.03.16
13:52
(53) в чем проблема? я же визуально из экселя вижу подпись файла, могу провалиться в сертификат, сохранить его как файл.
теперь это нужно сделать в 1с, чтобы пользователь не проверял наличие подписи визуально.
58 Help1с
 
24.03.16
13:55
(56) это не то. визуально ручками посмотреть подпись можем без проблем. как бы это автоматизировать.
59 Garykom
 
гуру
24.03.16
13:55
(57) если в сам файл включен сертификат то надо его просто  оттуда вытащить логично же
60 Garykom
 
гуру
24.03.16
13:56
(59) можно один раз и руками
61 Help1с
 
24.03.16
13:58
(59) в этом и вопрос. вы знаете как это сделать из 1с?
62 DGorgoN
 
24.03.16
14:01
(12) Шифрование бывает асинхронным, когда для проверки подавленности может быть 1 доступный публичный ключ, а вот для подписания документа уже закрытый.
63 Serginio1
 
24.03.16
14:06
http://www.google.ru/url?sa=t&rct=j&q=&esrc=s&source=web&cd=11&ved=0ahUKEwi-pYDPltnLAhXiJ5oKHbvvBQM4ChAWCBswAA&url=http%3A%2F%2Fwww.kmscity.ru%2Fassets%2Factivity%2Fmunzakaz%2Fproverka_zayavok.doc&usg=AFQjCNEmSSm18pPzc_eU8oZdGPAg5lYc_A

МЕТОДИЧЕСКИЕ  РЕКОМЕНДАЦИИ
по проверке заявок участников размещения заказов, направляемых заказчикам, уполномоченным органам в форме электронных документов, подписанных ЭЦП, для участия в открытых конкурсах и запросах котировок
64 DGorgoN
 
24.03.16
14:10
65 Help1с
 
24.03.16
14:15
(63) это не автоматизированная проверка. нужно этот алгоритм автоматизировать :)
66 Help1с
 
24.03.16
14:17
(64) это не то. (((
67 Garykom
 
гуру
24.03.16
14:47
(61) если сертификат включен в подписанный файл то знаю, если не включен то никак

500 руб в час
68 Help1с
 
24.03.16
15:11
(67) готов заплатить 500, если это действительно то что нужно.
69 Serginio1
 
24.03.16
15:19
(68) Ты хоть читал 63
70 Serginio1
 
24.03.16
15:20
Тебе нужно из файла сохранить сертификат
71 Garykom
 
гуру
24.03.16
15:22
(68) ТЗ?
72 Help1с
 
24.03.16
15:29
(69) да. мне нужно чтобы это делало 1с. руками этоделать умеем.
73 Help1с
 
24.03.16
15:31
(71) файл подписан сертификатом. из файла получить подпись и сертификат.
74 Serginio1
 
24.03.16
15:50
(72) Смотри 7. Там есть примеры в SDK. В 1С не сможешь.
75 Serginio1
 
24.03.16
15:52
Вот пример только проверки подписи SOAP https://www.cryptopro.ru/blog/2012/05/16/podpis-soobshchenii-soap-dlya-smev-s-ispolzovaniem-kriptopro-net
76 Garykom
 
гуру
24.03.16
15:55
(73) насчет разных типов файлов и видов сертификатов с разными системами эцп в курсе?
77 Serginio1
 
24.03.16
16:14
78 Help1с
 
25.03.16
07:46
(76) я скину подписанный файл, нужно эту подпись прочитать и получить сертификат. желательно бесплатными средствами. договорились?
79 Help1с
 
25.03.16
08:07
(77) спасибо, хорошая ссылка!
80 Help1с
 
25.03.16
10:06
как перевести на 1с следующий код:

Option Explicit

Const CAPICOM_VERIFY_SIGNATURE_ONLY = 0
Const ForReading = 1

Dim oSignedData
Set oSignedData = CreateObject("CAdESCOM.CadesSignedData")
' Загрузка подписанных данных для проверки.
Dim Message : Message = LoadFile("test.sig")
' Подпись совмещенная.
oSignedData.Verify Message, False

я вот так делаю:
    КапиКом = Новый COMОбъект("CAdESCOM.CadesSignedData");
    Проверка = КапиКом.Verify(Файл);

выходит ошибка:
{Форма.Форма.Форма(22)}: Ошибка при вызове метода контекста (Verify)
    Проверка = КапиКом.Verify(Файл);
по причине:
Произошла исключительная ситуация (CAdESCOM.CadesSignedData.1): Встречено неверное значение тега ASN1.
81 Help1с
 
25.03.16
11:42
подниму
82 Help1с
 
25.03.16
14:11
ап
83 Help1с
 
28.03.16
10:05
попробую поднять
84 Serginio1
 
28.03.16
19:16
Попробуй 24
85 Help1с
 
29.03.16
07:17
(84) что такое 24?
86 Serginio1
 
29.03.16
07:59
(23) Попробуй 7, пока в теме молчание
Использование классов .Net в 1С для новичков

http://www.cryptopro.ru/products/net
Использование классов .Net в 1С для новичков
87 Help1с
 
29.03.16
08:05
(86) я так и пытаюсь сейчас сделать. вот это мне нужно как COMОбъект подключить. пока не нашел как. https://msdn.microsoft.com/ru-ru/library/system.io.packaging.packagedigitalsignaturemanager.packagedigitalsignaturemanager(v=vs.90).aspx
88 Serginio1
 
29.03.16
08:09
(87) Ты статью прочитай. Там все подробно описано http://catalog.mista.ru/public/448668/
89 Serginio1
 
29.03.16
08:14
PackageDigitalSignatureManager=Врап.ПолучитьТипИзСборки("System.IO.Packaging.PackageDigitalSignatureManager","WindowsBase.dll");
90 Help1с
 
29.03.16
08:14
(88) ошибка. не создает такой COM объект:
врап=новый COMОбъект("NetObjectToIDispatch45")
91 Help1с
 
29.03.16
08:16
Ошибка при вызове конструктора (COMОбъект)
    врап=новый COMОбъект("NetObjectToIDispatch45");    
по причине:
-2147221005(0x800401F3): Недопустимая строка с указанием класса
92 Help1с
 
29.03.16
08:24
(89) в файле из статьи есть компонента NetObjectToIDispatch45? http://catalog.mista.ru/public/download.php?file=238585&pub=238584
93 Serginio1
 
29.03.16
08:35
94 Help1с
 
29.03.16
08:49
(93) спасибо. буду пробовать. кажется накнец-то нашел что нужно :)
95 Help1с
 
29.03.16
10:33
(89) COMОбъект создался. как до методов достучаться?
96 Help1с
 
29.03.16
10:35
пока не могу понять как с этим объектом работать. как ему передать подписанный файл для проверки
97 Garykom
 
гуру
29.03.16
10:45
(96) Каким именно объектом? "NetObjectToIDispatch45" просто позволяет классы .net использовать из 1С.

Не зная (не изучив) C# и .Net оно чем поможет?
98 Help1с
 
29.03.16
10:50
(97) надеюсь что поможет и смогу выполнить задачу. :)
99 Garykom
 
гуру
29.03.16
10:58
(98) Каким образом?

1. Каким образом сделана подпись в файлах? Средствами ms office или http://www.cryptopro.ru/products/office/signature или еще что

2. В курсе про https://ca.kontur.ru/faq/teh/43 - несовместимость в некоторых случая подписей?

3. Что будете делать если отправитель поменяет алгоритм подписи? Где тех мануал по подписям с отправителем/подписантом?
100 Garykom
 
гуру
29.03.16
11:01
(99)+ для простоты и надежности обычно договариваются о том что к примеру используем КриптоПро одной версии, один стандарт ЭЦП и один вид контейнера внутри которого как в архиве любые уже документы. И подписан сам контейнер и уже стандартно все поддается автоматизации.
101 Garykom
 
гуру
29.03.16
11:02
(100)+ А всяческие привязки в МС Офисам идут лесом, у нас он только на 2 компах к примеру есть и все в остальных LibreOffice и GoogleOffice
102 Serginio1
 
29.03.16
12:04
(99) Для этого и существуют сертификаты.

Сертификат открытого ключа выдаётся центром сертификации и состоит из таких полей как: сам открытый ключ владельца сертификата, срок действия, имя эмитента (центра сертификации), имя владельца сертификата и, самой важной части, цифровой подписи. Цифровая подпись гарантирует невозможность подделки сертификата. Она является результатом криптографической хеш-функции от данных сертификата, зашифрованным закрытым ключом центра сертификации. Открытый ключ центра сертификации является общеизвестным, поэтому любой может расшифровать им цифровую подпись сертификата, затем вычислить хеш самостоятельно и сравнить, совпадают ли хеши. Если хеши совпадают — значит сертификат действительный и можно не сомневаться, что открытый ключ принадлежит именно тому с кем мы собираемся устанавливать соединение.

Если Алиса сформирует сертификат со своим публичным ключом, и этот сертификат будет подписан третьей стороной (например, Трентом), любой, доверяющий Тренту, сможет удостовериться в подлинности открытого ключа Алисы. В централизованной инфраструктуре в роли Трента выступает удостоверяющий центр. В сетях доверия Трент может быть любым пользователем, и следует ли доверять этому пользователю, удостоверившему ключ Алисы, решает сам отправитель сообщения.

В SSL используется целая цепочка доверия: сертификат подписывается открытым ключом владельца сертификата, находящегося выше в цепи.[1]
103 Serginio1
 
29.03.16
12:08
А в подписи может быть алгоитм хэширования и сам хэш
104 Garykom
 
гуру
29.03.16
12:17
(102) (103) а еще можно взять сертификат и таким образом его засунуть в "подписанный файл" (ТС утверждает что внутри подписанных файлов офиса лежит сертификат)

что потом хрен что кроме той же версии офиса и софта по засовыванию/высовыванию прочитать смогет
105 Garykom
 
гуру
29.03.16
12:24
(104)+ и самое интересное что если "подписанный файл офиса" открывается любым офисом и зная что хеш при расчете не включает в себя сам хеш добавленный к файлу (иначе рекурсия)

то нужно знать алгоритм расчета хеша, что нужно откинуть из файла чтобы получился после шифрования открытым ключом из сертификата (его тоже наверно надо вытаскивать перед подсчетом хеша) правильный зашифрованный хеш
106 Garykom
 
гуру
29.03.16
12:25
(105)+ Перефразируя: без реверс-инжиниринга у ТС нифуя не выйдет...
107 Serginio1
 
29.03.16
12:33
(104) Да смотри 63. Есть специвльная область
https://www.cryptopro.ru/products/office/signature
108 Serginio1
 
29.03.16
12:52
109 Serginio1
 
29.03.16
13:18
110 Help1с
 
29.03.16
14:04
(99)
1. пока рассматриваем что средствами офиса.
2. нет, почитаю.
3. мы не можем на это повлиять. не вдаваясь в детали - по закону контрагент может сдавать документы подписанные ЭЦП, не важно как он их подписал, мы обязаны их принять.
111 Help1с
 
29.03.16
14:09
я еще вот что узнал - если файл екселя сохранить без расширения, то в тотал коммандере он отображается как папка. там есть _xmlsignatures. в этой папке есть файлики, похоже это и есть ЭЦП, но прочитать их не получается, файл в формате ХМЛ.
112 Garykom
 
гуру
29.03.16
14:09
(110) Понятие "Контрагент" подразумевает по дефолту наличие "Договора" с ним.
В него просто приложением стандартным и внутри ссылку на приложение.
А в приложении уже стандарт ЭП/ЭЦП прописано все.

И если умные менагеры/юристы и прочие считают что это не нужно то могу только посочувствовать. Пусть сидят и сами ручками подписи проверяют.
113 Garykom
 
гуру
29.03.16
14:10
(111) docx|xlsx = zip архив с xml
114 Help1с
 
29.03.16
14:11
(112) так и будут проверять ручками исключительные ситуации. от этого скорее всего не уйти. пока мы (разработчики) не учтем все варианты.
115 Garykom
 
гуру
29.03.16
14:14
116 Help1с
 
29.03.16
14:31
(93) подскажи пожалуйста куда копапть? создал я КомОбъект (89), как методы использовать? или это еще не конечный комОбъект и мне нужно еще что-то создать?
117 Help1с
 
29.03.16
14:33
интересно почему через капиком не получилось. может у меня криптопро как-то криво установился.
118 Serginio1
 
29.03.16
15:26
(116) Смотри примеры КриптоПро.Net
https://msdn.microsoft.com/ru-ru/library/office/ee526351.aspx
119 Serginio1
 
29.03.16
15:51
120 Help1с
 
30.03.16
08:07
(118) вот как я пытаюсь сделать:

    Врап = Новый COMОбъект("NetObjectToIDispatch45");
    PackageDigitalSignatureManager = Врап.ПолучитьТипИзСборки("System.IO.Packaging.PackageDigitalSignatureManager","WindowsBase.dll");
    ФайлВрап = Врап.ОбернутьЛюбойОбъект(ДДФайл);
    Врап.ВыполнитьМетод("PackageDigitalSignatureManager.IsSigned()",ФайлВрап);
    //НН = PackageDigitalSignatureManager.IsSigned(ДДФайл);
121 Serginio1
 
30.03.16
09:06
(120) Смотрим документациб
https://msdn.microsoft.com/ru-ru/library/system.io.packaging.packagedigitalsignaturemanager.issigned(v=vs.110).aspx

dsm =
        Врап.СоздатьОбъект(PackageDigitalSignatureManager,package);

    // Check to see if the package contains any signatures.
    Если не dsm.IsSigned Тогда
        return false;   // The package is not signed.
КонецЕсли;
    // Verify that all signatures are valid.
    VerifyResult result = dsm.VerifySignatures(false);
   Если не(result.Equals(Врап.ПолучитьТип(System.IO.Packaging.VerifyResult).Success) Тогда
        return false;   // One or more digital signatures
are invalid.
КонецЕсли;
    // else if (result == VerifyResult.Success)
    return true;        // All signatures are valid.
122 Serginio1
 
30.03.16
09:15
Теперь смотрим как создается package

https://msdn.microsoft.com/ru-ru/library/system.io.packaging.package(v=vs.110).aspx
У меня сейчас нет ни студии ни 1С.

Строку нужно оборачивать только тогда когда нужно вызваит метод String.

ВыполнитьМетод тоже когда метд не выполнянтся при этом его сигнатура такая на предыдущнм примере

Врап.ВыполнитьМетод(dsm,"VerifySignatures",ложь);

IsSigned это свойство
123 Help1с
 
30.03.16
09:25
(121) я вот какой пример смотрю из документации:

// Пример проверки подписи документа Office.

using System;
using System.Security.Cryptography.X509Certificates;
using System.IO.Packaging;

namespace Simple35.Office
{
    public class Verify
    {
        [STAThread]
        public static int Main(string[] args)
        {
            // Разбираем аргументы
            if (args.Length < 1)
            {
                Console.WriteLine("Office.Verify <document>");
                return 1;
            }
            string document = args[0];

            // Открываем документ
            using (Package package = Package.Open(document))
            {
                PackageDigitalSignatureManager dsm = new PackageDigitalSignatureManager(package);
                if (!dsm.IsSigned)
                {
                    Console.WriteLine("Документ не подписан.");
                    return 1;
                }
                int count = 1;
                foreach (PackageDigitalSignature pds in dsm.Signatures)
                {
                    Console.WriteLine("Подпись {0} на сертификате {1}.", count++, pds.Signer);
                    VerifyResult result = pds.Verify();
                    if (result == VerifyResult.Success)
                        Console.WriteLine("  подпись верна.");
                    else
                        Console.WriteLine("  подпись не верна:{0}", result);
                    X509Chain chain = new X509Chain();
                    if (chain.Build(new X509Certificate2(pds.Signer)))
                        Console.WriteLine("  сертификат действителен");
                    else
                        Console.WriteLine("  сертификат недействителен");
                }
                VerifyResult res = dsm.VerifySignatures(false);
                if (res != VerifyResult.Success)
                {
                    Console.WriteLine("Одна или несколько подписей неверны");
                }
            }
            return 0;
        }
    }
}
124 Serginio1
 
30.03.16
09:34
Значит ты уже получаешь файл

Тогда
package = Врап.ПолучитьТип("System.IO.Packaging").Open(document)

Ну и дальше тебе работать с сертификатами
https://msdn.microsoft.com/ru-ru/library/system.security.cryptography.x509certificates.x509chain(v=vs.110).aspx

Все по аналогии
125 Serginio1
 
30.03.16
09:36
То есть
foreach (PackageDigitalSignature pds in dsm.Signatures)

По русски

Для каждого  pds in dsm.Signatures Цикл
126 Serginio1
 
30.03.16
09:39
Кстати создав

Сертификат=Врап.СоздатьОбъект("System.Security.Cryptography.X509Certificates.X509Certificate2",pds.Signer)

Ты получаешь достуа к свойствам
https://msdn.microsoft.com/ru-ru/library/system.security.cryptography.x509certificates.x509certificate2_properties(v=vs.110).aspx
127 Help1с
 
30.03.16
09:40
(124) какой должен быть формат у переменной document? ДвоичныеДанные, Файл, Полный путь не проходят, выходит сообщение неверный тип System.IO.Packaging.
или он именно на "System.IO.Packaging" ругается?
128 Help1с
 
30.03.16
09:50
первая строка отрабатывается, вторая - нет. если первую закомментировать - то выполняется, но с ошибкой (127)

    PackageDigitalSignatureManager = Врап.ПолучитьТипИзСборки("System.IO.Packaging.PackageDigitalSignatureManager","WindowsBase.dll");
    package = Врап.ПолучитьТип("System.IO.Packaging").Open(Файл);
129 Help1с
 
30.03.16
09:53
(128) + вот так отрабатывается :)
Врап.ПолучитьТип("System.IO.Packaging.Package")
130 Help1с
 
30.03.16
09:59
файл с подписью завис открытым после выполнения Врап.ПолучитьТип("System.IO.Packaging.Package").Open(Файл);
как его закрыть?
131 Serginio1
 
30.03.16
10:00
(127) Строка. Смотри документацию
https://msdn.microsoft.com/ru-ru/library/ms568185(v=vs.110).aspx
132 Help1с
 
30.03.16
10:02
(129) + ничего не менял, но снова перестала работать данная строка кода Врап.ПолучитьТип("System.IO.Packaging.Package")
133 Serginio1
 
30.03.16
10:02
package.Close()
Иди
Врап.ЗакрытьРесурс(package)
134 Serginio1
 
30.03.16
10:04
(132) И какую ошибку выдает
135 zak555
 
30.03.16
10:05
чем вариант (19) не подходит ?
136 Help1с
 
30.03.16
10:06
(134) неверный тип System.IO.Packaging.Package
137 Serginio1
 
30.03.16
10:07
package = Врап.ПолучитьТип("System.IO.Packaging.ZipPackage").Open(Файл);
138 Help1с
 
30.03.16
10:07
(135) у меня нет подписи. она содержится в документе Excel, если бы вытащить эту подпись из файла, то возможно подошло бы.
139 zak555
 
30.03.16
10:08
(138) я ж вчера писал, как это сделать
140 zak555
 
30.03.16
10:09
141 Serginio1
 
30.03.16
10:09
Врап.ПолучитьТипИзСборки("SSystem.IO.Packaging.Package","WindowsBase.dll");
142 Help1с
 
30.03.16
10:09
(139) упс. не видел. посмотрю обязательно. пока меня заинтересовала работа с .НЕТ.  :)
143 Help1с
 
30.03.16
10:11
(141) вот что выполняю:
        Врап = Новый COMОбъект("NetObjectToIDispatch45");
        package = Врап.ПолучитьТип("System.IO.Packaging.ZipPackage").Open(Файл);

при первом проходе отладчика пишет что метод ПолучитьТип не найден. при втором проходе отладчика ошибка (136)
144 zak555
 
30.03.16
10:11
(142) зачем тебе этот дот ?

перейдёшь на линь -- что будешь делать ?
145 Serginio1
 
30.03.16
10:12
(143) Потому, что у тебя WindowsBase.dll не подгружена
Врап.ПолучитьТипИзСборки("SSystem.IO.Packaging.ZipPackage","WindowsBase.dll");
146 Help1с
 
30.03.16
10:13
(140) там требуется наличие Файла Подписи, а его нет. Пробовал передать файл экселя - не работает.
147 Serginio1
 
30.03.16
10:14
(144) ССЗБ?
148 zak555
 
30.03.16
10:15
(146) получаешь сертификат с помощью ПолучитьСертификатыИзПодписи
149 Serginio1
 
30.03.16
10:16
(143) Почитай статьи
http://catalog.mista.ru/public/448668/
http://catalog.mista.ru/public/238584/

Мне надо бежать
150 Help1с
 
30.03.16
10:19
(149) большое спасибо. статьи читал. ты мне очень помогаешь, возвращайся :)
151 Help1с
 
30.03.16
10:20
(148) Сртификат я может и смогу получить. а вот саму Подпись из файла екселя никак. (
152 zak555
 
30.03.16
10:24
(151) ещё раз цитата СП


ПолучитьСертификатыИзПодписи(<ИсходныеДанные>)
Параметры:

<ИсходныеДанные> (обязательный)

Тип: Строка: ДвоичныеДанные.
Исходные данные, из которых будет извлечен сертификат.
Данные могут размещаться в файле (в этом случае указывается имя файла) или представлены как ДвоичныеДанные.
Возвращаемое значение:

Тип: Массив.
Содержит объекты СертификатКриптографии.
Описание:

Извлекает массив сертификатов из данных подписи.
153 Help1с
 
30.03.16
10:27
(152) в последней строке указано что из данных подписи. у меня нет этих данных, они в файде экселя. не может этот метод прочитать эксель.
154 zak555
 
30.03.16
10:28
(153) код какой использовал ?
155 Help1с
 
30.03.16
10:33
(154) в качестве параметра Файл передавал различные варианты, и ДвоичныеДанные и Файл, и Путь.
    //МенеджерКриптографии = Новый МенеджерКриптографии("Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider","",75);
    //СертификатИзПодписи = МенеджерКриптографии.ПолучитьСертификатыИзПодписи(Файл);
156 zak555
 
30.03.16
10:35
(155) какой результат ?
157 zak555
 
30.03.16
10:43
// Подпись не была прочитана при записи объекта.
            ДвоичныеДанныеФайлаЭП = ПолучитьИзВременногоХранилища(Подпись.АдресЭП);
            Попытка
                Сертификаты = МенеджерКриптографии.ПолучитьСертификатыИзПодписи(ДвоичныеДанныеФайлаЭП);
            Исключение
                ШаблонСообщения = НСтр("ru = 'Получение сертификатов из подписи: %1'");
                ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения,
                    ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
                Прервать;
            КонецПопытки;
158 Help1с
 
30.03.16
10:50
(156) Ошибка при вызове метода контекста (ПолучитьСертификатыИзПодписи)
    СертификатИзПодписи = МенеджерКриптографии.ПолучитьСертификатыИзПодписи(Файл);
по причине:
Ошибка при чтении криптографических данных (2).
159 Garykom
 
гуру
30.03.16
10:50
(144) под линь многие .net проги нативно идут без перекомпиляции, прикинь да?

достаточно сделать apt-get install mono-devel mono-complete

а затем в консоли >mono Hello.exe
160 Help1с
 
30.03.16
10:52
как в 1с вот эту операцию перевести?
PackageDigitalSignatureManager dsm = new PackageDigitalSignatureManager(package);
161 Help1с
 
30.03.16
10:52
не могу присвоить значение dsm
162 zak555
 
30.03.16
10:55
(158) БП есть ?

код оттуда


там принцип какой ...

к тебе приходит XML пакет, подписанный КЭП
этот пакет пишут в справочник, потом пихает в двоичные данные, получают КЭП и этот серт пишут в справочник
163 Help1с
 
30.03.16
12:16
(162) БП нет, попробую посмотреть если этот вариант не получится. мне кажется там есть некий формат ХМЛ, возможно не получится из файла экселя
164 zak555
 
30.03.16
12:21
(163) в бп можно обмениваться произвольным документом, причём подписав его как с одной стороны, так и с другой
165 Help1с
 
30.03.16
12:30
(164) т.е. подписывается не сам файл, а некий пакет? при этом в базе есть сертификат отправителя. вроде так в ЭДО сделано. у нас же нет сертификата контрагента, мы его первый раз получаем.
166 tank_25
 
30.03.16
12:40
Я извиняюсь, но чтоб не создаю новую тему спрошу.
Можно ли средствами встроенного языка снять подпись с подписанного файла?
167 zak555
 
30.03.16
12:56
(165) именно сам файл
в терминах 1с -- это пакетЭДО
168 Garykom
 
гуру
30.03.16
13:02
(166) Да, можно
169 Help1с
 
30.03.16
13:06
(167) ок. посмотрю.
(166) МенеджерКриптографии не умеет это делать.
170 Garykom
 
гуру
30.03.16
13:07
(169) А про менеджер никто и ни спрашивал, а средствами языка можно
171 Help1с
 
30.03.16
13:12
(170) ну так-то я тоже средствами языка пытаюсь сделать, но используя внешние компоненты :)
172 Help1с
 
30.03.16
13:21
Выполняю:
        Врап = Новый COMОбъект("NetObjectToIDispatch45");
        PackageZIP = Врап.ПолучитьТипИзСборки("System.IO.Packaging.ZipPackage","WindowsBase.dll");
        package = Врап.ПолучитьТип("System.IO.Packaging.Package").Open(Файл);
        PackageDigitalSignatureManager = Врап.ПолучитьТипИзСборки("System.IO.Packaging.PackageDigitalSignatureManager","WindowsBase.dll");
        dsm = Врап.ВыполнитьМетод("PackageDigitalSignatureManager.Signatures(package)", package);

Выдает ошибку:
Ошибка в методе [DISPID=0] Не найден метод "System.IO.Packaging.ZipPackage.ToString". mscorlib
173 Garykom
 
гуру
30.03.16
13:25
(171) А вам пора профессию поменять...
174 Serginio1
 
30.03.16
13:38
(172) Смотри 121
175 Serginio1
 
30.03.16
13:49
Должен работать такой код
PackageDigitalSignatureManager = Врап.ПолучитьТипИзСборки("System.IO.Packaging.PackageDigitalSignatureManager","WindowsBase.dll");
    package = Врап.ПолучитьТип("System.IO.Packaging.Package").Open(Файл);
dsm = Врап.СоздатьОбъект(PackageDigitalSignatureManager,package);

Ну и дальше.

https://msdn.microsoft.com/ru-ru/library/ms568185(v=vs.110).aspx

ZipPackage представляет собой тип пакета, используемый по умолчанию методом Open.
176 Help1с
 
30.03.16
15:12
(174) огромное спасибо. сейчас вот этот код работает, пока не знаю правильно или нет, но работает :)
Сейчас проверю с просроченными сертификатами.

    ДДФайл = Новый ДвоичныеДанные(Файл);
    ФФайл = Новый Файл(Файл);
    Попытка
        Врап = Новый COMОбъект("NetObjectToIDispatch45");
        PackageZIP = Врап.ПолучитьТипИзСборки("System.IO.Packaging.Package","WindowsBase.dll");
        package = Врап.ПолучитьТип("System.IO.Packaging.Package").Open(Файл);
        PackageDigitalSignatureManager = Врап.ПолучитьТипИзСборки("System.IO.Packaging.PackageDigitalSignatureManager","WindowsBase.dll");
        dsm = Врап.СоздатьОбъект(PackageDigitalSignatureManager, package);
        Если НЕ dsm.IsSigned Тогда
            Сообщить("Файл " + Файл + " не содержит подписи");
        КонецЕсли;
        Для каждого pds Из dsm.Signatures Цикл
            //Сертификат = Врап.СоздатьОбъект("System.Security.Cryptography.X509Certificates.X509Certificate2",pds.Signer);
            Результат = dsm.VerifySignatures(false);
            Если не Результат.Equals(Врап.ПолучитьТип("System.IO.Packaging.VerifyResult").Success) Тогда
                Сообщить("Подпись не верна");  // One or more digital signatures
            Иначе
                Сообщить("Подпись верна");  
            КонецЕсли;
        КонецЦикла;
    Исключение
    КонецПопытки;    
    Попытка
        Врап.ЗакрытьРесурс(package);
    Исключение
        Сообщить("Закрыть не удалось");
    КонецПопытки;
177 Serginio1
 
30.03.16
15:17
Если ты уже загрузил сборку
PackageZIP = Врап.ПолучитьТипИзСборки("System.IO.Packaging.Package","WindowsBase.dll");

То для получения типа из этой сборки можно импользовать просто

PackageDigitalSignatureManager = Врап.ПолучитьТип("System.IO.Packaging.PackageDigitalSignatureManager");
178 tank_25
 
30.03.16
15:19
(168) Каким способом? Если не трудно, то хотя бы намек в сторону решения. Желательно под линукс.
179 Help1с
 
30.03.16
15:21
(177) ок. спасибо. :)
180 Help1с
 
30.03.16
15:22
просроченный сертификат прошел проверку. буду дальше смотреть что не так.
            Если не Результат.Equals(Врап.ПолучитьТип("System.IO.Packaging.VerifyResult").Success) Тогда
                Сообщить("Подпись не верна");  // One or more digital signatures

            Иначе
                Сообщить("Подпись верна");  
            КонецЕсли;
181 Serginio1
 
30.03.16
15:25
(180) Проверь сертификат

chain = Врап.СоздатьОбъект("System.Security.Cryptography.X509Certificates.X509Chain";

Ну и дальше
                    if (chain.Build(new X509Certificate2(pds.Signer)))
                        Console.WriteLine("  сертификат действителен");
                    else
                        Console.WriteLine("  сертификат недействителен");
182 zak555
 
30.03.16
15:32
(169) > МенеджерКриптографии не умеет это делать

как это ?
183 Serginio1
 
30.03.16
15:39
181 Проверь свойство NotAfter    
Получает дату в формате местного времени, после которой сертификат недействителен.
https://msdn.microsoft.com/ru-ru/library/system.security.cryptography.x509certificates.x509certificate2_properties(v=vs.110).aspx
184 Help1с
 
30.03.16
15:44
(183) вот этот код работает, подписал файл старым сертификатом и новым. выдал два сообщения действителен и не действителен.

    ДДФайл = Новый ДвоичныеДанные(Файл);
    ФФайл = Новый Файл(Файл);
    Попытка
        Врап = Новый COMОбъект("NetObjectToIDispatch45");
        PackageZIP = Врап.ПолучитьТипИзСборки("System.IO.Packaging.Package","WindowsBase.dll");
        package = Врап.ПолучитьТип("System.IO.Packaging.Package").Open(Файл);
        PackageDigitalSignatureManager = Врап.ПолучитьТипИзСборки("System.IO.Packaging.PackageDigitalSignatureManager","WindowsBase.dll");
        dsm = Врап.СоздатьОбъект(PackageDigitalSignatureManager, package);
        Если НЕ dsm.IsSigned Тогда
            Сообщить("Файл " + Файл + " не содержит подписи");
        КонецЕсли;
        Для каждого pds Из dsm.Signatures Цикл
            //Сертификат = Врап.СоздатьОбъект("System.Security.Cryptography.X509Certificates.X509Certificate2",pds.Signer);
            Результат = dsm.VerifySignatures(false);
            Если не Результат.Equals(Врап.ПолучитьТип("System.IO.Packaging.VerifyResult").Success) Тогда
                Сообщить("Подписи нет");  
            Иначе
                Сообщить("Подпись есть");  
            КонецЕсли;
            chain = Врап.СоздатьОбъект("System.Security.Cryptography.X509Certificates.X509Chain");
            Если chain.Build(pds.Signer) Тогда
                Сообщить("  сертификат действителен");
            Иначе
                Сообщить("  сертификат недействителен");
            КонецЕсли;
        КонецЦикла;
    Исключение
    КонецПопытки;    
    Попытка
        Врап.ЗакрытьРесурс(package);
    Исключение
        Сообщить("Закрыть не удалось");
    КонецПопытки;
185 Help1с
 
30.03.16
15:49
(184) + позже попробую разобрать состав сертификата, чтобы прочитать владельца сертификата. пора уходить.
Serginio1 еще раз - огромное спасибо!!! :)
186 Garykom
 
гуру
30.03.16
15:57
(184) (185) Вот интересно каким образом умение создавать свои подписи (неким методом) и проверять их.
Может помочь проверить чужую подпись созданную совсем другими методами?
187 Serginio1
 
30.03.16
17:38
(186) Это как раз проверка чужой подписи Word или Excel

http://stackoverflow.com/questions/17791504/how-to-sign-on-office-documents-with-sha256-384-512-using-packagedigitalsignatur
188 Serginio1
 
30.03.16
17:43
С крипто про идут примеры
http://cpdn.cryptopro.ru/default.asp?url=content/cpnet/html/d5da1068-67b6-4247-bb41-4d1bd1e99974.htm

http://cpdn.cryptopro.ru/default.asp?url=content/cpnet/html/d5da1068-67b6-4247-bb41-4d1bd1e99974.htm

Данный пример демонстрирует использование метода VerifySignatures класса PackageDigitalSignatureManager для проверки подписи документа MS Office.
189 Garykom
 
гуру
30.03.16
17:43
(187) Каким образом узнали что это именно та подпись? Где у ТС сказано каким образом подписываются документы, какой вообще версии офиса и т.д. Какой алгоритм хеша который подписан.
190 Serginio1
 
30.03.16
17:46
(189) В подписи и сертификате все есть
191 Garykom
 
гуру
30.03.16
17:47
(188) ТСу пришлют файл подписанный в "Офис 2020"... что будет дальше?

Не кажется что намного проще позвонить/написать отправителям их тех спецам и все выяснить?
192 Serginio1
 
30.03.16
17:48
А там и ерсия особо то и нужна. документа MS Office это есть Zip файл. И там лежит подписью
(191) Если проверку не пройдет тогда и позвонят
193 Help1с
 
30.03.16
18:42
(186) мы не создаем подписи. контрагенты нам присылают подписанные документы. чтобы не проверять вручную подпись делаю обработку. проверять будем чужие подписи. как я понял для этого метода не важно что за подпись, он любую может прочитать, как в самом офисе.
сейчас проверил подпись, которую я сам создал, результат - сертификат действителен. наверно потому что я добавлял сертификат в доверенные. надо на чистом компе будет проверить, т.к. по идее такой сертификат мы не должны признавать.
194 Help1с
 
30.03.16
18:43
(188) да. я этот пример и рассматривал. выкладывал код выше :)
195 zak555
 
30.03.16
18:44
Help1с пришли мне свой файл подписанный, я его 1с-кой попробую распаковать
196 Garykom
 
гуру
30.03.16
18:49
(193) контактов контрагентов нет?
Не логичнее было бы сначала с ними попытаться проблему решить а не на форумах без предоставления полной инфы?
197 Help1с
 
30.03.16
18:51
(191) (196) долго объяснять. если коротко - массово так не получится. и зачем, если есть возможность написать код для чтения любых подписей.
198 Help1с
 
30.03.16
18:51
(195) отправил
199 Garykom
 
гуру
30.03.16
18:56
(197) заодно напишите код для распознания и сверки любых графических (обычных ручных в виде картинки) подписей...

а еще сразу для загрузки данных из любых форматов... и проигрывания любых аудио/видео файлов... даже тех которые еще только в будущем изобретут

а что удобно же, изобрели новый формат а у вас уже есть код для проигрывания
200 Московский
 
30.03.16
19:02
200!
201 Help1с
 
30.03.16
19:04
(199) мне не понятно - что тебя не устраивает? )
202 Garykom
 
гуру
30.03.16
19:06
(201) Меня идиотизм длительно не лечащийся удивляет
203 Garykom
 
гуру
30.03.16
19:08
Если знать как именно подписывает (каким софтом и как) контрагент доки то можно (при наличии инструментов или хотя бы мануала) сделать проверку подписи (если все есть в т.ч. сертификаты с алгоритмами)

Но сделать это "для любых подписей" равнозначно (199)
204 Help1с
 
30.03.16
19:11
(202) тут можно долго дискутировать, но вряд ли мы поймем друг друга.
то что делаю я - решает вопрос проверки подписи(я надеюсь).
то что предлагаешь ты - решает один возможный сценарий.
205 Garykom
 
гуру
30.03.16
19:12
(204) Сорри забыл в личку заглянуть... 86 же
206 Help1с
 
30.03.16
19:16
(205) и вот на этом я предлагаю завершить спор что так делать не нужно было.  :)
207 Serginio1
 
30.03.16
21:19
(206) Предлагаю, тебе и zak555 написать статьи про иапользование ЭЦП
208 zak555
 
30.03.16
21:23
(198) получил
209 zak555
 
30.03.16
21:23
(207) денег дадут ? )
210 Serginio1
 
30.03.16
21:26
На ифостарте целых 10 старт мани. Если получишь 50 звездочек еще 30. Можешь выложить файлы и за каждую скачку 0.8 с каждой скачки. Заживешь ....
Главное другим поможешь
211 Garykom
 
гуру
30.03.16
21:32
Лучше не просто статью а готовые обработки со всем необходимым (а уж если на vipnet бесплатных) для простой реализации ЭЦП в 1С
212 Help1с
 
31.03.16
06:14
(207) есть такая мысль. потому что много интернета перекапал, но не нашел готового решения. (210) цель - помочь таким же как я, чтоб не приходилось изобретать велосипед. :)
213 Help1с
 
31.03.16
10:52
не работает метод VerifyCertificate(X509Certificate).
https://msdn.microsoft.com/ru-ru/library/system.io.packaging.packagedigitalsignaturemanager_methods(v=vs.110).aspx здесь указано некий System_Caps_Static, что это?

        dsm = Врап.СоздатьОбъект(PackageDigitalSignatureManager, package);
        Если НЕ dsm.IsSigned Тогда
            Сообщить("Файл " + Файл + " не содержит подписи");
        КонецЕсли;
        Для каждого pds Из dsm.Signatures Цикл
            Результат2= dsm.VerifyCertificate(); //не работает
            Результат = dsm.VerifySignatures(false); //работает
214 oleg_km
 
31.03.16
11:03
(213)

dsm.VerifyCertificate() - статический метод, а ты вызываешь его из экземпляра объекта. Его нужно вызывать из типа, или как там сейчас у Сергея реализовано.
215 Serginio1
 
31.03.16
11:03
Так ты должен иметь или подучить сертификат
foreach (PackageDigitalSignature pds in dsm.Signatures)
                {
                    Console.WriteLine("Подпись {0} на сертификате {1}.", count++, pds.Signer);
                    VerifyResult result = pds.Verify();
                    if (result == VerifyResult.Success)
                        Console.WriteLine("  подпись верна.");
                    else
                        Console.WriteLine("  подпись не верна:{0}", result);
                    X509Chain chain = new X509Chain();
                    if (chain.Build(new X509Certificate2(pds.Signer)))
                        Console.WriteLine("  сертификат действителен");
                    else
                        Console.WriteLine("  сертификат недействителен");
                }
216 Serginio1
 
31.03.16
11:04
217 Help1с
 
31.03.16
12:22
(215) сертификат я получил
            chain = Врап.СоздатьОбъект("System.Security.Cryptography.X509Certificates.X509Chain", pds.Signature);
218 Help1с
 
31.03.16
12:26
(214) кажется понял о чем речь. сейчас проверю.
219 Serginio1
 
31.03.16
12:37
(217)Да там статический метод

Сертификат= Врап.СоздатьОбъект("System.Security.Cryptography.X509Certificates.X509Chain", pds.Signature);

X509ChainStatusFlags =PackageDigitalSignatureManager.VerifySignatures(Сертификат);
220 Serginio1
 
31.03.16
12:41
Проверяй на NoError
https://msdn.microsoft.com/ru-ru/library/system.security.cryptography.x509certificates.x509chainstatusflags(v=vs.110).aspx

X509ChainStatusFlags.Equals(Врап.ПолучитьТип("System.Security.Cryptography.X509Certificates.X509ChainStatusFlags").NoError)
221 Serginio1
 
31.03.16
12:49
Но вообще то у сертификата есть метод
public bool Verify()

https://msdn.microsoft.com/ru-ru/library/system.security.cryptography.x509certificates.x509certificate2.verify(v=vs.110).aspx

Если не Сертификат.Verify() Тогда
222 Serginio1
 
31.03.16
12:57
223 Serginio1
 
01.04.16
11:47
Кстати https://blogs.msdn.microsoft.com/dotnet/2016/03/30/announcing-the-net-framework-4-6-2-preview/

Cryptography
X509 Certificates Now Support FIPS 186-3 DSA
The .NET Framework 4.6.2 adds support for DSA (Digital Signature Algorithm) X509 certificates whose keys exceed the FIPS 186-2 limit of 1024-bit.

In addition to supporting the larger key sizes of FIPS 186-3, the .NET Framework 4.6.2 allows computing signatures with the SHA-2 family of hash algorithms (SHA256, SHA384, and SHA512). The FIPS 186-3 support is provided by the new DSACng class.

Keeping in line with recent changes to RSA (.NET Framework 4.6) and ECDsa (.NET Framework 4.6.1), the DSA abstract base class has additional methods to allow callers to make use of this functionality without casting.

public static byte[] SignDataDsaSha384(byte[] data, X509Certificate2 cert)
{
    using (DSA dsa = cert.GetDSAPrivateKey())
    {
        return dsa.SignData(data, HashAlgorithmName.SHA384);
    }
}

public static void VerifyDataDsaSha384(byte[] data, byte[] signature, X509Certificate2 cert)
{
    using (DSA dsa = cert.GetDSAPublicKey())
    {
        return dsa.VerifyData(data, signature, HashAlgorithmName.SHA384);
    }
}
224 Help1с
 
04.04.16
09:24
Как сделать так, чтобы ChainPolicy проверял сертификат? как передать ему? по всякому уже испробовал.

            X509RevocationMode = Врап.СоздатьОбъект("System.Security.Cryptography.X509Certificates.X509RevocationMode");
            X509RevocationMode.Equals(Врап.ПолучитьТип("System.Security.Cryptography.X509Certificates.X509ChainStatusFlags").NoError);
            ChainPolicy = chain.ChainPolicy;
            //ChainPolicy = chain.ChainPolicy.RevocationMode.Equals(Врап.ПолучитьТип("System.Security.Cryptography.X509Certificates.X509RevocationMode").Online);
            //ChainPolicy = chain.ChainPolicy.RevocationMode(pds.Signer);
            Сообщить("Chain revocation flag: {0}" + ChainPolicy.RevocationFlag);  // X509RevocationMode.RevocationFlag
            Сообщить("Chain revocation mode: {0}" + ChainPolicy.RevocationMode);
            Сообщить("Chain verification flag: {0}" + ChainPolicy.VerificationFlags);
            Сообщить("Chain verification time: {0}" + ChainPolicy.VerificationTime);
            //Сообщить("Chain status length: {0}" + ChainStatus.Length);
            Сообщить("Chain application policy count: {0}" + ChainPolicy.ApplicationPolicy.Count);
            Сообщить("Chain certificate policy count: {0} {1}" + ChainPolicy.CertificatePolicy.Count); // + " " + Environment.NewLine);
225 Help1с
 
04.04.16
10:15
(223) интересно. сначала реализую как сейчас делаю, потом можно будет и так попробовать. )
226 Serginio1
 
04.04.16
11:19
(224) Смотрим https://msdn.microsoft.com/ru-ru/library/system.security.cryptography.x509certificates.x509chain.chainpolicy(v=vs.110).aspx

selected certificate.
X509Chain ch = new X509Chain();
ch.Build (certificate);
Console.WriteLine ("Chain Information");
ch.ChainPolicy.RevocationMode = X509RevocationMode.Online;
Console.WriteLine ("Chain revocation flag: {0}", ch.ChainPolicy.RevocationFlag);
Console.WriteLine ("Chain revocation mode: {0}", ch.ChainPolicy.RevocationMode);
Console.WriteLine ("Chain verification flag: {0}", ch.ChainPolicy.VerificationFlags);
Console.WriteLine ("Chain verification time: {0}", ch.ChainPolicy.VerificationTime);
Console.WriteLine ("Chain status length: {0}", ch.ChainStatus.Length);
Console.WriteLine ("Chain application policy count: {0}", ch.ChainPolicy.ApplicationPolicy.Count);
Console.WriteLine ("Chain certificate policy count: {0} {1}", ch.ChainPolicy.CertificatePolicy.Count, Environment.NewLine);
227 Serginio1
 
04.04.16
11:21
Для вывода используй либо Format либо Врап.Встроку
228 Serginio1
 
04.04.16
11:23
X509RevocationMode это перечисление. К нему нельзя применить СоздатьОбъект. Только получить тип.
https://msdn.microsoft.com/ru-ru/library/system.security.cryptography.x509certificates.x509revocationmode(v=vs.110).aspx
229 degot
 
04.04.16
12:50
закладка
230 Help1с
 
04.04.16
13:48
(226) в принципе получилось, результат только не тот. даже не знаю зачем мне это )

    chain = Врап.СоздатьОбъект("System.Security.Cryptography.X509Certificates.X509Chain");
    Если chain.Build(pds.Signer) Тогда
        Сообщить("сертификат загружен");
    Иначе
        Сообщить("сертификат не загружен");
    КонецЕсли;
    
    //////////////// читаем данные сертификата
    X509RevocationMode = Врап.СоздатьОбъект("System.Security.Cryptography.X509Certificates.X509RevocationMode");
    chain.ChainPolicy.RevocationMode = Врап.ПолучитьТип("System.Security.Cryptography.X509Certificates.X509RevocationMode").Online;
    Сообщить("Chain revocation flag: {0}" +     Врап.Встроку(chain.ChainPolicy.RevocationFlag));  // X509RevocationMode.RevocationFlag
    Сообщить("Chain revocation mode: {0}" +     Врап.Встроку(chain.ChainPolicy.RevocationMode));
    Сообщить("Chain verification flag: {0}" +     Врап.Встроку(chain.ChainPolicy.VerificationFlags));
    Сообщить("Chain verification time: {0}" +     Врап.Встроку(chain.ChainPolicy.VerificationTime));
    Сообщить("Chain application policy count: {0}" + Врап.Встроку(chain.ChainPolicy.ApplicationPolicy.Count));
    Сообщить("Chain certificate policy count: {0} {1}" + Врап.Встроку(chain.ChainPolicy.CertificatePolicy.Count)); // + " " + Environment.NewLine);


Результат:
сертификат загружен
Chain revocation flag: {0}ExcludeRoot
Chain revocation mode: {0}Online
Chain verification flag: {0}NoFlag
Chain verification time: {0}04.04.2016 15:46:31
Chain application policy count: {0}0
Chain certificate policy count: {0} {1}0
231 Serginio1
 
04.04.16
14:01
Проще использовать String.Format
http://catalog.mista.ru/public/448668/
String=Врап.ПолучитьТип("System.String");

Сообщить(String.Format("Chain application policy count: {0}" ,chain.ChainPolicy.ApplicationPolicy.Count),0);
232 Help1с
 
04.04.16
15:17
(231) исправил
233 Help1с
 
05.04.16
14:15
две проверки, первую проверку сертификат не проходит, вторую проходит. возможно первую проверку не проходит из-за отсутствия доверия к корневому сертификату.
может кто-нибудь знает что проверяют данные проверки? проверка на то что сертификат отозван осуществляется?
234 Help1с
 
05.04.16
14:15
(233) + вот код:

            Результат = dsm.VerifySignatures(false);
            Если не Результат.Equals(Врап.ПолучитьТип("System.IO.Packaging.VerifyResult").Success) Тогда
                Сообщить("Проверка сертификата и цепочки прошла успешно");  
            Иначе
                Сообщить("Сертификат не прошел проверку");  
            КонецЕсли;
              
            Если pds.Signer.Verify() Тогда
                Сообщить("Сертификат действителен");
            Иначе
                Сообщить("Сертификат недействителен.");
            КонецЕсли;
235 Serginio1
 
05.04.16
14:54
Посмотри чему равен результат

врап.Встроку(Результат)

Смотри варианты
https://msdn.microsoft.com/ru-ru/library/system.io.packaging.verifyresult(v=vs.110).aspx
236 Help1с
 
05.04.16
15:04
(235) равно "Success".
похоже неправильно условие поставил. :)
данные провекри проверяют сертификат в режиме он-лайн? если сертификат отозван - выйдет ошибка? не нашел я описание как выполняется проверка.
237 Help1с
 
05.04.16
15:30
создал сертификат, он у меня проходит все три проверки. получается что сертификат он-лайн никак не проверяется?
вот проверки которые я выполняю:

    //1. Проверяем подпись
    Результат = dsm.VerifySignatures(false);
    Если Результат.Equals(Врап.ПолучитьТип("System.IO.Packaging.VerifyResult").Success) Тогда
        Сообщить("Проверка подписи прошла успешно");  
    КонецЕсли;
      
    //2. Проверяем сертификат подписи
    Если pds.Signer.Verify() Тогда
        Сообщить("Сертификат действителен");
    КонецЕсли;
    
    //3. еще раз проверяем сертификат
    Результат2= PackageDigitalSignatureManager.VerifyCertificate(pds.Signer);
    Сообщить("Ошибки: " + Врап.Встроку(Результат2));
238 Serginio1
 
05.04.16
15:38
Ты его в документ засунул? Проверь на другой машине, и открой и посмотри как офис проверяет
239 Serginio1
 
05.04.16
15:40
https://msdn.microsoft.com/ru-ru/library/system.io.packaging.packagedigitalsignaturemanager.verifysignatures(v=vs.110).aspx

Этот метод проверяет только цифровые подписи, но не связанные с ними сертификаты X.509. Для проверки сертификатов X.509 можно использовать метод VerifyCertificate.
240 Help1с
 
05.04.16
15:57
(239) это проверка №3. тоже успешно проходит. сертификат в документе офиса.

сейчас смотрю как 1с МенеджерКриптографии сертификаты проверяет:
1. самодельный сертификат забраковал.
2. реальный действующий сертификат тоже забраковал, пишет: "Сертификат не предназначен для указанного использования"
241 Help1с
 
05.04.16
16:02
(240) + вот так проверка проходит без ошибки:
    МенеджерКриптографии.ПроверитьСертификат(Сертификат,РежимПроверкиСертификатаКриптографии.РазрешитьТестовыеСертификаты);
242 Serginio1
 
05.04.16
17:20
Вообще то ты должен получить сертификат

Сертификат= Врап.СоздатьОбъект("System.Security.Cryptography.X509Certificates.X509Chain", pds.Signature);

X509ChainStatusFlags =PackageDigitalSignatureManager.VerifySignatures(Сертификат);


Хотя https://msdn.microsoft.com/ru-ru/library/system.io.packaging.packagedigitalsignature.signer(v=vs.110).aspx
Свойство PackageDigitalSignature.Signer
Возвращает сертификат X.509 подписавшего.
243 Serginio1
 
05.04.16
17:30
Для проверки сертификата используй X509Certificate2
https://msdn.microsoft.com/ru-ru/library/system.security.cryptography.x509certificates.x509certificate2(v=vs.110).aspx

https://msdn.microsoft.com/ru-ru/library/system.security.cryptography.x509certificates.x509certificate2.verify(v=vs.110).aspx


Сертификат= Врап.СоздатьОбъект("System.Security.Cryptography.X509Certificates.X509Certificate2", pds.Signature);
244 Serginio1
 
05.04.16
17:47
chain = new X509Chain();
    chain.ChainPolicy.ExtraStore.Add(GetYourRootCert()); // GetYourRootCert() - Ваш корневой X509Certificate2  
    //chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; //убираем комментарий вначале если не нужна проверка на отозванность
    chain.Build(certificate);

А вот для политики проверки используй
https://msdn.microsoft.com/ru-ru/library/system.security.cryptography.x509certificates.x509chain.chainpolicy(v=vs.110).aspx

ChainPolicy

https://msdn.microsoft.com/ru-ru/library/system.security.cryptography.x509certificates.x509chainpolicy(v=vs.110).aspx

И устанавливай нужные значения VerificationFlags например NoFlag

https://msdn.microsoft.com/ru-ru/library/system.security.cryptography.x509certificates.x509verificationflags(v=vs.110).aspx
245 Serginio1
 
05.04.16
17:52
К тестовым сертификатам я так понимаю применяется флаг
AllowUnknownCertificateAuthority

Не учитывать, что цепочку нельзя проверить из-за неизвестного центра сертификации (ЦС).
246 Serginio1
 
05.04.16
18:05
243
Сертификат= Врап.СоздатьОбъект("System.Security.Cryptography.X509Certificates.X509Certificate2",pds.Signer);
247 Help1с
 
06.04.16
08:54
(243) я так пробовал, не работает, не может сертификат загрузить.
вот так выполняется код, но сертификат не загружается в объект:
Сертификат2 = Врап.СоздатьОбъект("System.Security.Cryptography.X509Certificates.X509Certificate2");
248 Help1с
 
06.04.16
09:04
(246) да, именно такой код пробовал, не создается объект
249 Help1с
 
06.04.16
09:06
(247) (248) мистика. заработал такой код:
Сертификат2 = Врап.СоздатьОбъект("System.Security.Cryptography.X509Certificates.X509Certificate2", pds.Signer)
250 Serginio1
 
06.04.16
09:36
(247) Ты просто создаешь пустой объект.
Либо делай как в 246 или используй Import
https://msdn.microsoft.com/ru-ru/library/ms148437(v=vs.110).aspx