Форум КриптоПро
»
Средства криптографической защиты информации
»
Встраивание
»
Проверка подписи ЭЦП в файле. Online проверка сертификата используя C# через библиотеку .NET в 1с
Статус: Участник
Группы: Участники
Зарегистрирован: 28.03.2016(UTC) Сообщений: 10  Откуда: Уфа Сказал(а) «Спасибо»: 2 раз
|
Добрый день. Пробую реализовать проверку подписи в 1с используя .NET и c#. Подпись считывается и проверяется, только моя самодельная подпись тоже проходит проверку. Как сделать чтобы проверку проходили только подписи, которые выданы УЦ? Спасибо. Вот то что я насобирал в интернете и вставил в свою проверку: Код:
СертификатПослеПроверки = Неопределено;
Если ЗначениеЗаполнено(Файл) Тогда
ДДФайл = Новый ДвоичныеДанные(Файл);
ФФайл = Новый Файл(Файл);
Попытка
Врап = Новый 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);
Исключение
Сообщить("Закрыть не удалось");
КонецПопытки;
КонецЕсли;
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 28.03.2016(UTC) Сообщений: 10  Откуда: Уфа Сказал(а) «Спасибо»: 2 раз
|
Может есть решение написанное на другом языке? Я бы попробовал адаптировать под 1с.
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 28.03.2016(UTC) Сообщений: 10  Откуда: Уфа Сказал(а) «Спасибо»: 2 раз
|
Вот сертификат, который я сам сгенерировал. Этот сертификат я пробую импортировать через КриптоАРМ, в процессе импорта КриптоАРМ говорит о том, что сертификат действителен. Почему? Сертификат ведь левый, выдан не УЦ.  Sertifikat Al'bert.zip (1kb) загружен 4 раз(а).
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Проверьте наличие этого сертификата в хранилищах "Доверенные корневые ЦС" пользователя и компьютера. Если он там есть, то он будет считаться доверенным издателем, как и УЦ. |
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 28.03.2016(UTC) Сообщений: 10  Откуда: Уфа Сказал(а) «Спасибо»: 2 раз
|
Автор: Kirill Sobolev  Проверьте наличие этого сертификата в хранилищах "Доверенные корневые ЦС" пользователя и компьютера. Если он там есть, то он будет считаться доверенным издателем, как и УЦ. Смотрел через Панель управления - Свойства браузера. Сертификата ни на одной вкладке нет. Там также нет разделение на хранилище пользователь и компьютер.
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
А в стандартном окне просмотра сертификата Windows он отображается как действительный? |
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 28.03.2016(UTC) Сообщений: 10  Откуда: Уфа Сказал(а) «Спасибо»: 2 раз
|
Автор: Kirill Sobolev  А в стандартном окне просмотра сертификата Windows он отображается как действительный? да, действительный.  Skrin Sertifikata Al'bert.jpg (62kb) загружен 5 раз(а).
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Проверяйте хранилища, только не через IE, а через оснастку "Сертификаты". |
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 28.03.2016(UTC) Сообщений: 10  Откуда: Уфа Сказал(а) «Спасибо»: 2 раз
|
Нашел где сидел сертификат, он был в "Доверенные лица". Как только я оттуда удалил, обработка показала что сертификат недействителен. Спасибо.
|
|
|
|
|
|
Форум КриптоПро
»
Средства криптографической защиты информации
»
Встраивание
»
Проверка подписи ЭЦП в файле. Online проверка сертификата используя C# через библиотеку .NET в 1с
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close