![]() |
|
МенеджерКриптографии. Как использовать? | ☑ | ||
---|---|---|---|---|
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
|
(138) ЭЦП, Сертификат, Подпись. Что есть что? -- последний пост
|
|||
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 |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |