|
МенеджерКриптографии. Как использовать? | ☑ | ||
---|---|---|---|---|
0
Help1с
21.03.16
✎
09:39
|
Добрый день.
Как я понял нельзя в 1с понять файл содержит подпись или нет. Как проверить файл содержит ЭЦП или нет? Может кто подскажет как должен работать механизм проверки подписанного файла в 1С? |
|||
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 |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |