Имя: Пароль:
1C
1С v8
ЭЦП, Сертификат, Подпись. Продолжение.
0 Help1с
 
02.06.16
13:40
Вернулся к этому вопросу. прошлая ветка - МенеджерКриптографии. Как использовать?
Читаю подписанный файл эксель. Подпись проверяется, только почему-то выдает что моя самодельная подпись действительна. Подозреваю что какой-то флаг нужно установить, но пока не нашел какой именно. Пробовал все флаги отключить, не помогает. Может кто подскажет?
вот код:

    Если ЗначениеЗаполнено(Файл) Тогда
        ДДФайл = Новый ДвоичныеДанные(Файл);
        ФФайл = Новый Файл(Файл);
        Попытка
            Врап = Новый 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 Цикл
                Сертификат2 = Врап.СоздатьОбъект("System.Security.Cryptography.X509Certificates.X509Certificate2", pds.Signer);
                Результат = dsm.VerifySignatures(true);
                Если Результат.Equals(Врап.ПолучитьТип("System.IO.Packaging.VerifyResult").Success) Тогда
                    Сообщить("Проверка подписи прошла успешно");  
                Иначе
                    Сообщить("Подпись не прошла проверку");  
                КонецЕсли;
                
                Если pds.Signer.Verify() Тогда
                    Сообщить("Сертификат действителен");
                Иначе
                    Сообщить("Сертификат недействителен.");
                КонецЕсли;
                
                Результат2= PackageDigitalSignatureManager.VerifyCertificate(Сертификат2);
                Сообщить("Ошибки: " + Врап.Встроку(Результат2));
                
                chain = Врап.СоздатьОбъект("System.Security.Cryptography.X509Certificates.X509Chain");
                chain.ChainPolicy.ExtraStore.Add(Сертификат2);// GetYourRootCert() - Ваш корневой X509Certificate2  
                Если chain.Build(pds.Signer) Тогда
                    Сообщить("сертификат загружен");
                Иначе
                    Сообщить("сертификат не загружен");
                КонецЕсли;
                
                //////////////// читаем данные сертификата
                chain.ChainPolicy.VerificationFlags = Врап.ПолучитьТип("System.Security.Cryptography.X509Certificates.X509VerificationFlags").NoFlag;// AllFlags;
                chain.ChainPolicy.RevocationMode = Врап.ПолучитьТип("System.Security.Cryptography.X509Certificates.X509RevocationMode").Online;
                chain.ChainPolicy.RevocationFlag = Врап.ПолучитьТип("System.Security.Cryptography.X509Certificates.X509RevocationFlag").EntireChain;
                X509ChainStatusFlags = Врап.ПолучитьТип("System.Security.Cryptography.X509Certificates.X509ChainStatusFlags");
                chain.ChainPolicy.VerificationTime = pds.SigningTime;
                //chain.ChainPolicy.X509ChainStatusFlags
                String = Врап.ПолучитьТип("System.String");
                Сообщить(String.Format("Chain revocation flag: {0}" ,             chain.ChainPolicy.RevocationFlag,             0));
                Сообщить(String.Format("Chain revocation mode: {0}",             chain.ChainPolicy.RevocationMode,            0));
                Сообщить(String.Format("Chain verification flag: {0}",             chain.ChainPolicy.VerificationFlags,        0));
                Сообщить(String.Format("Chain verification time: {0}",             chain.ChainPolicy.VerificationTime,            0));
                Сообщить(String.Format("Chain application policy count: {0}",     chain.ChainPolicy.ApplicationPolicy.Count,    0));
                Сообщить(String.Format("Chain certificate policy count: {0}",    chain.ChainPolicy.CertificatePolicy.Count,    0));     
                
                Если chain.Build(Сертификат2) Тогда
                    Сообщить("сертификат загружен");
                Иначе
                    Сообщить("сертификат не загружен");
                КонецЕсли;
                
                Действителен = Сертификат2.Verify();
                Если Действителен Тогда
                    Сообщить("Сертификат действителен");
                Иначе
                    Сообщить("Сертификат недействителен.");
                КонецЕсли;
                
            КонецЦикла;
        Исключение
        КонецПопытки;    
        Попытка
            Врап.ЗакрытьРесурс(package);
        Исключение
            Сообщить("Закрыть не удалось");
        КонецПопытки;    
    КонецЕсли;
1 Help1с
 
02.06.16
13:58
пробовал следующие варианты:
chain.ChainPolicy.VerificationFlags = Врап.ПолучитьТип("System.Security.Cryptography.X509Certificates.X509VerificationFlags").NoFlag;
chain.ChainPolicy.VerificationFlags = Врап.ПолучитьТип("System.Security.Cryptography.X509Certificates.X509VerificationFlags").AllFlags;
chain.ChainPolicy.VerificationFlags = Врап.ПолучитьТип("System.Security.Cryptography.X509Certificates.X509VerificationFlags").AllowUnknownCertificateAuthority;
2 Serginio1
 
02.06.16
16:23
Если тебе нужна комбанация флагов то это делается так.

X509VerificationFlags=Врап.ПолучитьТип("System.Security.Cryptography.X509Certificates.X509VerificationFlags");

chain.ChainPolicy.VerificationFlags =врап.OR(X509VerificationFlags.NoFlag,X509VerificationFlags.AllowUnknownCertificateAuthority, итд);

Можешь садать свой вопрос на
http://ru.stackoverflow.com/

Но только на форуме C# или на форуме CriptoPRO


Сейчас нет времени
3 Help1с
 
03.06.16
08:12
(2) ок. спасибо :)
4 Serginio1
 
03.06.16
13:05
5 Help1с
 
03.06.16
13:07
(4) ок. спасибо. смотрю.
6 Help1с
 
07.06.16
09:30
не могу присвоить значение, вызывается исключение:
chain.ChainPolicy.UrlRetrievalTimeout.Seconds =30;
7 Serginio1
 
07.06.16
09:49
На C# это выглядит так

chain.ChainPolicy.UrlRetrievalTimeout = new TimeSpan(0, 0, 30);

На 1С это выглядит так

chain.ChainPolicy.UrlRetrievalTimeout = Врап.СоздатьОбъкт("System.TimeSpan",0, 0, 30);
8 Help1с
 
07.06.16
10:03
(7) да, получилось. спасибо.
только никакие 30 секунд не ждет. сразу выдает истину. мне кажется что даже не пытается выполнить проверку он-лайн
9 Serginio1
 
07.06.16
10:07
Поставь
ServicePointManager.CheckCertificateRevocationList = true;
10 Serginio1
 
07.06.16
10:08
11 Help1с
 
07.06.16
10:24
(9) как использовать этот класс?
Врап.ПолучитьТип("System.ServicePointManager.CheckCertificateRevocationList")
12 Serginio1
 
07.06.16
10:38
ServicePointManager=Врап.ПолучитьТип("System.Net.ServicePointManager");

Или

ServicePointManager=Врап.ПолучитьТипИзСборки("System.Net.ServicePointManager","System.dll");
13 Serginio1
 
07.06.16
10:49
14 Help1с
 
07.06.16
12:09
(13) спасибо. получилось. копаю дальше :)
15 Help1с
 
14.06.16
10:28
так и не хочет выполнять проверку он-лайн:

    СертификатПослеПроверки = Неопределено;
    Если ЗначениеЗаполнено(Файл) Тогда
        ДДФайл = Новый ДвоичныеДанные(Файл);
        ФФайл = Новый Файл(Файл);
        Попытка
            Врап = Новый COMОбъект("NetObjectToIDispatch45");
            PackageZIP = Врап.ПолучитьТипИзСборки("System.IO.Packaging.Package","WindowsBase.dll");
            ServicePointManager=Врап.ПолучитьТипИзСборки("System.Net.ServicePointManager","System.dll");
            package = Врап.ПолучитьТип("System.IO.Packaging.Package").Open(Файл);
            PackageDigitalSignatureManager = Врап.ПолучитьТипИзСборки("System.IO.Packaging.PackageDigitalSignatureManager","WindowsBase.dll");
            dsm = Врап.СоздатьОбъект(PackageDigitalSignatureManager, package);
            Если НЕ dsm.IsSigned Тогда
                Сообщить("Файл " + Файл + " не содержит подписи");
            КонецЕсли;
            Для каждого pds Из dsm.Signatures Цикл
                Сертификат2 = Врап.СоздатьОбъект("System.Security.Cryptography.X509Certificates.X509Certificate2", pds.Signer);
                Результат = dsm.VerifySignatures(true);
                Если Результат.Equals(Врап.ПолучитьТип("System.IO.Packaging.VerifyResult").Success) Тогда
                    Сообщить("Проверка подписи прошла успешно");  
                Иначе
                    Сообщить("Подпись не прошла проверку");  
                КонецЕсли;
                
                Если pds.Signer.Verify() Тогда
                    Сообщить("Сертификат действителен");
                Иначе
                    Сообщить("Сертификат недействителен.");
                КонецЕсли;
                
                Результат2= PackageDigitalSignatureManager.VerifyCertificate(Сертификат2);
                Сообщить("Ошибки: " + Врап.Встроку(Результат2));
                
                chain = Врап.СоздатьОбъект("System.Security.Cryptography.X509Certificates.X509Chain");
                chain.ChainPolicy.ExtraStore.Add(Сертификат2);// GetYourRootCert() - Ваш корневой X509Certificate2  
                Если chain.Build(pds.Signer) Тогда
                    Сообщить("сертификат загружен");
                Иначе
                    Сообщить("сертификат не загружен");
                КонецЕсли;
                
                //////////////// читаем данные сертификата                     
                
                //ServicePointManager.UseNagleAlgorithm = True;
                //ServicePointManager.Expect100Continue = True;
                ServicePointManager.CheckCertificateRevocationList = True;
                //ServicePointManager.DefaultConnectionLimit = ServicePointManager.DefaultPersistentConnectionLimit;
                
                chain.ChainPolicy.VerificationFlags = Врап.ПолучитьТип("System.Security.Cryptography.X509Certificates.X509VerificationFlags").AllowUnknownCertificateAuthority;// AllFlags;
                
                X509VerificationFlags=Врап.ПолучитьТип("System.Security.Cryptography.X509Certificates.X509VerificationFlags");                
                chain.ChainPolicy.VerificationFlags =врап.OR(X509VerificationFlags.NoFlag);
                
                chain.ChainPolicy.RevocationMode = Врап.ПолучитьТип("System.Security.Cryptography.X509Certificates.X509RevocationMode").Online;
                chain.ChainPolicy.RevocationFlag = Врап.ПолучитьТип("System.Security.Cryptography.X509Certificates.X509RevocationFlag").EntireChain;
                X509ChainStatusFlags = Врап.ПолучитьТип("System.Security.Cryptography.X509Certificates.X509ChainStatusFlags");
                chain.ChainPolicy.VerificationTime = pds.SigningTime;
//                TimeSpan = Врап.ПолучитьТип("System.TimeSpan", 30);
                chain.ChainPolicy.UrlRetrievalTimeout = Врап.СоздатьОбъект("System.TimeSpan",0, 0, 30);                
                //chain.ChainPolicy.X509ChainStatusFlags
                String = Врап.ПолучитьТип("System.String");
                
                //Врап.ПолучитьТип("System.Security.ServicePoint").true;
                Сообщить(String.Format("Chain revocation flag: {0}" ,             chain.ChainPolicy.RevocationFlag,             0));
                Сообщить(String.Format("Chain revocation mode: {0}",             chain.ChainPolicy.RevocationMode,            0));
                Сообщить(String.Format("Chain verification flag: {0}",             chain.ChainPolicy.VerificationFlags,        0));
                Сообщить(String.Format("Chain verification time: {0}",             chain.ChainPolicy.VerificationTime,            0));
                Сообщить(String.Format("Chain application policy count: {0}",     chain.ChainPolicy.ApplicationPolicy.Count,    0));
                Сообщить(String.Format("Chain certificate policy count: {0}",    chain.ChainPolicy.CertificatePolicy.Count,    0));     
                                
                Если chain.Build(Сертификат2) Тогда
                    Сообщить("сертификат загружен");
                Иначе
                    Сообщить("сертификат не загружен");
                КонецЕсли;
                
                
                Действителен = Сертификат2.Verify();
                Если Действителен Тогда
                    Сообщить("Сертификат действителен");
                Иначе
                    Сообщить("Сертификат недействителен.");
                КонецЕсли;
            КонецЦикла;
        Исключение
        КонецПопытки;    
        Попытка
            Врап.ЗакрытьРесурс(package);
        Исключение
            Сообщить("Закрыть не удалось");
        КонецПопытки;    
    КонецЕсли;
16 Serginio1
 
14.06.16
12:14
Так ты проверяешь не был ли серитификат отозван.
Посмотри https://msdn.microsoft.com/ru-ru/library/system.security.cryptography.x509certificates.x509chainpolicy(v=vs.110).aspx
17 Help1с
 
15.06.16
09:17
(16) наверно ты прав, по крайней мере это объясняет почему мой самодельный сертификат проходит проверку. сейчас попробую разобраться. спасибо.
18 Help1с
 
17.06.16
07:51
Если кому-то интересно, то обработка работает правильно, по крайней мере сейчас левый сертификат не проходит проверку. Проблема была в том, что сертификат я установил на свой ПК, а потом не везде удалил, только через оснастку КриптоПро - Сертификаты смог увидеть этот сертификат, он сидел в Доверенные Лица.
19 Help1с
 
17.06.16
07:51
Вот результат обработки:

Проверка подписи прошла успешно
Сертификат недействителен.
Ошибки: UntrustedRoot
сертификат не загружен
сертификат загружен
Chain revocation flag: EntireChain
Chain revocation mode: Online
Chain verification flag: AllFlags
Chain verification time: 28.02.2016 17:08:35
Chain status length: 1
Chain application policy count: 0
Chain certificate policy count: 0
Сертификат недействителен.
20 Help1с
 
17.06.16
07:52
СертификатПослеПроверки = Неопределено;
    Если ЗначениеЗаполнено(Файл) Тогда
        ДДФайл = Новый ДвоичныеДанные(Файл);
        ФФайл = Новый Файл(Файл);
        Попытка
            Врап = Новый COMОбъект("NetObjectToIDispatch45");
            PackageZIP = Врап.ПолучитьТипИзСборки("System.IO.Packaging.Package","WindowsBase.dll");
            ServicePointManager=Врап.ПолучитьТипИзСборки("System.Net.ServicePointManager","System.dll");
            package = Врап.ПолучитьТип("System.IO.Packaging.Package").Open(Файл);
            PackageDigitalSignatureManager = Врап.ПолучитьТипИзСборки("System.IO.Packaging.PackageDigitalSignatureManager","WindowsBase.dll");
            dsm = Врап.СоздатьОбъект(PackageDigitalSignatureManager, package);
            Если НЕ dsm.IsSigned Тогда
                Сообщить("Файл " + Файл + " не содержит подписи");
            КонецЕсли;
            Для каждого pds Из dsm.Signatures Цикл
                Сертификат2 = Врап.СоздатьОбъект("System.Security.Cryptography.X509Certificates.X509Certificate2", pds.Signer);
                Результат = dsm.VerifySignatures(true);
                Если Результат.Equals(Врап.ПолучитьТип("System.IO.Packaging.VerifyResult").Success) Тогда
                    Сообщить("Проверка подписи прошла успешно"); // здесь левый сертификат проверку прошел (подпись верна)
                Иначе
                    Сообщить("Подпись не прошла проверку");  
                КонецЕсли;
                
                Если pds.Signer.Verify() Тогда
                    Сообщить("Сертификат действителен");
                Иначе
                    Сообщить("Сертификат недействителен.");      //  здесь левый сертификат проверку НЕ прошел
                КонецЕсли;
                
                Результат2= PackageDigitalSignatureManager.VerifyCertificate(Сертификат2);
                Сообщить("Ошибки: " + Врап.Встроку(Результат2));
                
                chain = Врап.СоздатьОбъект("System.Security.Cryptography.X509Certificates.X509Chain");
                chain.ChainPolicy.ExtraStore.Add(Сертификат2);  
                Если chain.Build(pds.Signer) Тогда
                    Сообщить("сертификат загружен");
                Иначе
                    Сообщить("сертификат не загружен");    // недействительный сертификат не загружается
                КонецЕсли;
                
                //////////////// читаем данные сертификата                     
                ServicePointManager.CheckCertificateRevocationList = True;
                chain.ChainPolicy.VerificationFlags = Врап.ПолучитьТип("System.Security.Cryptography.X509Certificates.X509VerificationFlags").AllowUnknownCertificateAuthority;// AllFlags;
                X509VerificationFlags=Врап.ПолучитьТип("System.Security.Cryptography.X509Certificates.X509VerificationFlags");                
                chain.ChainPolicy.VerificationFlags =врап.OR(X509VerificationFlags.AllFlags);
                chain.ChainPolicy.RevocationMode = Врап.ПолучитьТип("System.Security.Cryptography.X509Certificates.X509RevocationMode").Online;
                
                //проверка на отзыв сертификата включая головной сертификат
                chain.ChainPolicy.RevocationFlag = Врап.ПолучитьТип("System.Security.Cryptography.X509Certificates.X509RevocationFlag").EntireChain;
                
                //.Флаги статусов. Нужно как-то использовать.
                X509ChainStatusFlags = Врап.ПолучитьТип("System.Security.Cryptography.X509Certificates.X509ChainStatusFlags");
                chain.ChainPolicy.VerificationTime = pds.SigningTime;
                chain.ChainPolicy.UrlRetrievalTimeout = Врап.СоздатьОбъект("System.TimeSpan",0, 0, 30);                
                String = Врап.ПолучитьТип("System.String");
                
                Если chain.Build(Сертификат2) Тогда
                    Сообщить("сертификат загружен");            //здесь левый сертификат загрузился
                Иначе
                    Сообщить("сертификат не загружен");
                КонецЕсли;
                
                Сообщить(String.Format("Chain revocation flag: {0}" ,             chain.ChainPolicy.RevocationFlag,             0));
                Сообщить(String.Format("Chain revocation mode: {0}",             chain.ChainPolicy.RevocationMode,            0));
                Сообщить(String.Format("Chain verification flag: {0}",             chain.ChainPolicy.VerificationFlags,        0));
                Сообщить(String.Format("Chain verification time: {0}",             chain.ChainPolicy.VerificationTime,            0));
                Сообщить(String.Format("Chain status length: {0}",                 chain.ChainStatus.Length,                    0));
                Сообщить(String.Format("Chain application policy count: {0}",     chain.ChainPolicy.ApplicationPolicy.Count,    0));
                Сообщить(String.Format("Chain certificate policy count: {0}",    chain.ChainPolicy.CertificatePolicy.Count,    0));     
                
                Действителен = Сертификат2.Verify();
                Если Действителен Тогда
                    Сообщить("Сертификат действителен");
                Иначе
                    Сообщить("Сертификат недействителен.");         //недействителен
                КонецЕсли;
            КонецЦикла;
        Исключение
        КонецПопытки;    
        Попытка
            Врап.ЗакрытьРесурс(package);
        Исключение
            Сообщить("Закрыть не удалось");
        КонецПопытки;    
    КонецЕсли;
21 Serginio1
 
17.06.16
10:02
Напиши статью на инфостарте. Многим будет полезно
22 Help1с
 
17.06.16
10:28
(21) обязательно напишу. :)
может поступят предложения как улучшить обработку. :)
23 Serginio1
 
17.06.16
10:50
Ну убрать
ChainPolicy=chain.ChainPolicy;

Сообщить(String.Format("Chain revocation flag: {0}" ,             ChainPolicy.RevocationFlag,             0));
                Сообщить(String.Format("Chain revocation mode: {0}",             ChainPolicy.RevocationMode,            0));
                Сообщить(String.Format("Chain verification flag: {0}",             ChainPolicy.VerificationFlags,        0));
                Сообщить(String.Format("Chain verification time: {0}",             ChainPolicy.VerificationTime,            0));
                Сообщить(String.Format("Chain status length: {0}",                 chain.ChainStatus.Length,                    0));
                Сообщить(String.Format("Chain application policy count: {0}",     ChainPolicy.ApplicationPolicy.Count,    0));
                Сообщить(String.Format("Chain certificate policy count: {0}",    ChainPolicy.CertificatePolicy.Count,    0));    



врап.OR(X509VerificationFlags.NoFlag);
применяется к нескольким элементам.

Для одного нет смысла поэтому проще
ChainPolicy.VerificationFlags =X509VerificationFlags.NoFlag;
24 Help1с
 
17.06.16
11:58
(23) спасибо. внесу изменения.
много чего дублируется, почищу. :)
25 Help1с
 
17.06.16
12:00
вообще мне нужны данные сертификата, чтобы узнать обладает ли подписант правом подписи, к какому контрагенту относится, и т.д.
26 Serginio1
 
17.06.16
17:13
Все что касается сертификата https://msdn.microsoft.com/ru-ru/library/system.security.cryptography.x509certificates.x509certificate2(v=vs.110).aspx

Но нужно смотреть данные которые зашифрованы сертификатом
27 Serginio1
 
17.06.16
17:20
То есть я так понимаю тебе нужно найти область данных т расшифровать открытым ключем. А может данные хранятся в открытыю.
28 Serginio1
 
17.06.16
17:21
рядом с подписью
29 Serginio1
 
17.06.16
17:21
Я тебе давал ссылки.
30 Serginio1
 
17.06.16
17:43