Имя: Пароль:
1C
 
МенеджерКриптографии. Как использовать?
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