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