Ключевое слово в защите информации
ключевое слово
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход. Новые регистрации запрещены.

Уведомление

Icon
Error

3 Страницы<123
Опции
К последнему сообщению К первому непрочитанному
Offline Андрей Писарев  
#21 Оставлено : 10 марта 2015 г. 13:00:06(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 14,163
Мужчина
Российская Федерация

Сказал «Спасибо»: 618 раз
Поблагодарили: 2391 раз в 1880 постах
Автор: timur.lt Перейти к цитате
Андрей, на вашем сайте нашел глюки использования CAPICOM


При использовании CAPICOM, в своё время, лично никогда не наблюдал глюков.
Да, уточню - CAPICOM можно использовать не только в браузере...
Многое зависит от софта, который подает данные на подпись.
Техническую поддержку оказываем тут
Наша база знаний
Offline timur.lt  
#22 Оставлено : 10 марта 2015 г. 13:20:43(UTC)
timur.lt

Статус: Участник

Группы: Участники
Зарегистрирован: 26.02.2015(UTC)
Сообщений: 21

Поблагодарили: 1 раз в 1 постах
Андрей, ок.
Я думал, работайте в криптопро.
Offline timur.lt  
#23 Оставлено : 10 марта 2015 г. 17:10:30(UTC)
timur.lt

Статус: Участник

Группы: Участники
Зарегистрирован: 26.02.2015(UTC)
Сообщений: 21

Поблагодарили: 1 раз в 1 постах
С CAPICOM не смог добиться а через CAdESCOM получилось,
спасибо

string str = System.IO.File.ReadAllText("c:\\1.xml", Encoding.Default);

CAPICOM.Store store = new CAPICOM.Store();
store.Open(CAPICOM.CAPICOM_STORE_LOCATION.CAPICOM_CURRENT_USER_STORE, "My");

CAPICOM.Certificate cer = store.Certificates[2];
store.Close();

CAdESCOM.CPSigner signer = new CAdESCOM.CPSigner();
CAdESCOM.CadesSignedData sd = new CAdESCOM.CadesSignedData();

signer.Certificate = cer;
sd.ContentEncoding = CAdESCOM.CADESCOM_CONTENT_ENCODING_TYPE.CADESCOM_BASE64_TO_BINARY;

byte[] bytes = Encoding.Default.GetBytes( str );
string sc2 = Convert.ToBase64String(bytes);

sd.Content = sc2;

signer.Options = CAPICOM.CAPICOM_CERTIFICATE_INCLUDE_OPTION.CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN; // Обязательный параметр для gosuslug
string s = sd.SignCades(signer, CAdESCOM.CADESCOM_CADES_TYPE.CADESCOM_CADES_BES, true, CAdESCOM.CAPICOM_ENCODING_TYPE.CAPICOM_ENCODE_BASE64);
System.IO.File.WriteAllText("c:\\1xml.bin", s);
thanks 1 пользователь поблагодарил timur.lt за этот пост.
superspy2008 оставлено 02.12.2016(UTC)
Offline superspy2008  
#24 Оставлено : 2 декабря 2016 г. 23:13:25(UTC)
superspy2008

Статус: Новичок

Группы: Участники
Зарегистрирован: 02.12.2016(UTC)
Сообщений: 3
Российская Федерация
Откуда: Воронеж

Сказал(а) «Спасибо»: 2 раз
Слава тебе! Решаю сейчас такую же задачу - надо подписывать поток ЭСФ и отправлять через Exite. Два дня мучался, переписав JS скрипт, работающий с Capicom, на .NET. То, что сделал через Capicom, файл с подписью генерировало, но провайдер отвечал, что "Подпись неверна или сертификат недействителен", хотя указанный тут инструмент проверки с госуслуг на каждый такой файл уверенно отвечал, что все отлично, выдавал список сертификатов из цепочки, но все равно дело не шло. Пока не увидел твой код - у меня были проблемы с кодировкой, которые я благодаря твоей работе решил, но Capicom со своей задачей так и не справился, поэтому переписал под Cadescom, как это сделано в твоем коде. Сейчас получил результат "Документооборот завершен", то есть, все работает абсолютно правильно. Уверен, что людей, которые испытывают трудности с решением этой задачи, масса, поэтому привожу свой код VB.NET.
P.S> Если вы скопировали код, сделали ссылку на библиотеки, но получаете исключение типа "Класс не зарегистрирован" - не спешите стучать в бубен, для начала удостоверьтесь, что ваш код компилируется в х86. Под х64 сделать вызовы к 32-разрядному COM интерфейсу библиотеки Capicom вы не сможете.

Private Sub btnSearch_Click(sender As Object, e As EventArgs) Handles btnSearch.Click
''''Dim store As New CAdESCOM.CPStore
''''For i = 0 To 4
''''''''Try
''''''''''''store.Open(i)
''''''''''''For Each cert As CAdESCOM.CPCertificate In store.Certificates
''''''''''''''''Dim li = lvCerts.Items.Add(i)
''''''''''''''''li.SubItems.Add(cert.SerialNumber)
''''''''''''''''li.SubItems.Add(cert.SubjectName)
''''''''''''''''li.SubItems.Add(cert.ValidToDate)
''''''''''''Next
''''''''''''store.Close()
''''''''Catch ex As Exception
''''''''End Try
''''Next
End Sub

Private Sub lvCerts_SelectedIndexChanged(sender As Object, e As EventArgs) Handles lvCerts.SelectedIndexChanged
''''If lvCerts.SelectedItems.Count = 0 Then Exit Sub
''''txtStore.Text = lvCerts.SelectedItems(0).SubItems(0).Text
''''txtCert.Text = lvCerts.SelectedItems(0).SubItems(1).Text
End Sub

Private Sub btnOpenFile_Click(sender As Object, e As EventArgs) Handles btnOpenFile.Click
''''If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.Cancel Then Exit Sub
''''txtFile.Text = OpenFileDialog1.FileName
End Sub

Public Function FindCertificate(StoreNumber As Integer, Serial As String) As CAdESCOM.CPCertificate
''''Dim Store As New CAdESCOM.CPStore
''''Store.Open(StoreNumber)
''''For Each c In Store.Certificates
''''''''If c.SerialNumber = Serial Then
''''''''''''FindCertificate = c
''''''''''''Store.Close()
''''''''''''Exit Function
''''''''End If
''''Next
''''Store.Close()
''''Return Nothing
End Function

Public Function Sign(Cert As CAdESCOM.CPCertificate, InputFile As IO.FileInfo, OutputPath As String) As Boolean
''''Try
''''''''Dim Signer As New CAdESCOM.CPSigner
''''''''Signer.Certificate = Cert
''''''''Signer.Options = CAPICOM_CERTIFICATE_INCLUDE_OPTION.CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY 'Включать только сертификат субъекта
''''''''Dim Signed As New CAdESCOM.CadesSignedData
''''''''Signed.ContentEncoding = CADESCOM_CONTENT_ENCODING_TYPE.CADESCOM_BASE64_TO_BINARY
''''''''Dim FileContent = IO.File.ReadAllText(InputFile.FullName, Encoding.Default)
''''''''Signed.Content = Convert.ToBase64String(Encoding.Default.GetBytes(FileContent))
''''''''Dim SignedContent = Signed.SignCades(Signer, CADESCOM_CADES_TYPE.CADESCOM_CADES_BES, True, CAdESCOM.CAPICOM_ENCODING_TYPE.CAPICOM_ENCODE_BASE64)
''''''''IO.File.WriteAllText(OutputPath, SignedContent)
''''''''Sign = True
''''Catch ex As Exception
''''''''Sign = False
''''End Try
End Function

Private Sub btnSign_Click(sender As Object, e As EventArgs) Handles btnSign.Click
''''Dim cert = FindCertificate(txtStore.Text, txtCert.Text)
''''If cert Is Nothing Then
''''''''MsgBox("Сертификат не найден")
''''Else
''''''''Dim file = New IO.FileInfo(txtFile.Text)
''''''''If file.Exists Then
''''''''''''Dim BinPath = file.DirectoryName & file.Name.Substring(0, file.Name.LastIndexOf(".")) & ".bin"
''''''''''''If My.Computer.FileSystem.FileExists(BinPath) Then My.Computer.FileSystem.DeleteFile(BinPath)
''''''''''''MsgBox("Результат: " & Sign(cert, file, BinPath))
''''''''Else
''''''''''''MsgBox("Файл для подписи не обнаружен", MsgBoxStyle.Critical)
''''''''End If
''''End If
End Sub

Отредактировано пользователем 2 декабря 2016 г. 23:37:53(UTC)  | Причина: Не указана

Offline Андрей Писарев  
#25 Оставлено : 3 декабря 2016 г. 7:14:59(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 14,163
Мужчина
Российская Федерация

Сказал «Спасибо»: 618 раз
Поблагодарили: 2391 раз в 1880 постах
Автор: superspy2008 Перейти к цитате
Уверен, что людей, которые испытывают трудности с решением этой задачи, масса, поэтому привожу свой код VB.NET.


Здравствуйте.

Достаточно посмотреть примеры на MSDN или в SDK к КриптоПРО.Net и не использовать зависимость от CAPICOM.
Техническую поддержку оказываем тут
Наша база знаний
Offline superspy2008  
#26 Оставлено : 3 декабря 2016 г. 11:53:12(UTC)
superspy2008

Статус: Новичок

Группы: Участники
Зарегистрирован: 02.12.2016(UTC)
Сообщений: 3
Российская Федерация
Откуда: Воронеж

Сказал(а) «Спасибо»: 2 раз
Автор: Андрей * Перейти к цитате
Достаточно посмотреть примеры на MSDN или в SDK к КриптоПРО.Net

Не достаточно.
SDK платная - в нашем случае для того, чтобы распространить решение в двух десятках торговых представительств, нужно приобрести столько же лицензий на серверное использование библиотек, что делает стоимость внедрения неприемлемой.
Собственные классы .NET реализуют настолько широкий функционал, что изучить тему в сжатые сроки невозможно. Лично я после трех часов чтения просто закрыл вкладки MSDN и вернулся к теме Capicom из-за того, что все необходимые настройки я не смог подобрать для подписывания по ГОСТу, а вариантов подписи нашел так много, что не смог однозначно определить, что мне в действительности надо.
Думаю, люди, специализирующиеся в вопросах криптографии, смогут обойтись и без MSDN или SDK от Крипто Про - мое сообщение было адресовано тем, кто ищет наиболее легкое решение, не углубляясь в суть применяемых методов.

Отредактировано пользователем 3 декабря 2016 г. 11:54:10(UTC)  | Причина: Не указана

Offline Андрей Писарев  
#27 Оставлено : 3 декабря 2016 г. 17:53:21(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 14,163
Мужчина
Российская Федерация

Сказал «Спасибо»: 618 раз
Поблагодарили: 2391 раз в 1880 постах
Автор: superspy2008 Перейти к цитате
Автор: Андрей * Перейти к цитате
Достаточно посмотреть примеры на MSDN или в SDK к КриптоПРО.Net

Не достаточно.
SDK платная - в нашем случае для того, чтобы распространить решение в двух десятках торговых представительств, нужно приобрести столько же лицензий на серверное использование библиотек, что делает стоимость внедрения неприемлемой.
Собственные классы .NET реализуют настолько широкий функционал, что изучить тему в сжатые сроки невозможно. Лично я после трех часов чтения просто закрыл вкладки MSDN и вернулся к теме Capicom из-за того, что все необходимые настройки я не смог подобрать для подписывания по ГОСТу, а вариантов подписи нашел так много, что не смог однозначно определить, что мне в действительности надо.
Думаю, люди, специализирующиеся в вопросах криптографии, смогут обойтись и без MSDN или SDK от Крипто Про - мое сообщение было адресовано тем, кто ищет наиболее легкое решение, не углубляясь в суть применяемых методов.


Вы что-то путаете.
Все бесплатно и реализуется десятком других строк.
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#28 Оставлено : 3 декабря 2016 г. 17:57:24(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 14,163
Мужчина
Российская Федерация

Сказал «Спасибо»: 618 раз
Поблагодарили: 2391 раз в 1880 постах
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
superspy2008 оставлено 04.12.2016(UTC)
Offline superspy2008  
#29 Оставлено : 4 декабря 2016 г. 21:34:24(UTC)
superspy2008

Статус: Новичок

Группы: Участники
Зарегистрирован: 02.12.2016(UTC)
Сообщений: 3
Российская Федерация
Откуда: Воронеж

Сказал(а) «Спасибо»: 2 раз
Огромная благодарность! Я переписал код под .NET классы, процедура подписывания получилась такой:

Dim FileContent = IO.File.ReadAllBytes(InputFile.FullName)
Dim Content As New Pkcs.ContentInfo(FileContent)
Dim Signed As New Pkcs.SignedCms(Content, True)
Dim Signer As New Pkcs.CmsSigner(Cert)
Signed.ComputeSignature(Signer)
IO.File.WriteAllBytes(OutputPath, Signed.Encode)

Выполнил нагрузочный тест - подписал 1000 документов общим объемом 23.5 МБ.
Прошлый код, использующий Cadescom, выполнил подписывание этого объема за 43 секунды;
Новый код в компиляции х64, исполняемый в основном потоке формы, выполнил подписывание за 37 секунд (+14%);
Новый код, исполняемый асинхронно с вызовами на UI, выполнил подписывание за 33 секунды (+23%);
Новый код, исполняемый в отдельном потоке без отвлечения на пользовательский интерфейс, выполнил подписывание за абсолютно такое же время 33,171 секунды.
В-общем, действительно имеет смысл отказываться от использования COM интерфейсов. Во-первых, появляется возможность компилировать в х64, что уже дает большое преимущество. Во-вторых, появляется возможность полностью отказаться от манипуляций с кодировками. В-третьих, естественно, упрощается процесс развертывания решения, которому не нужны никакие дополнительные связи.
Спасибо!
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
3 Страницы<123
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.