Форум КриптоПро
»
Средства криптографической защиты информации
»
КриптоПро .NET
»
Подпись одного документа несколькими сертификатами с разных компьютеров?
Статус: Активный участник
Группы: Участники
Зарегистрирован: 15.10.2009(UTC) Сообщений: 49 Откуда: CHL
|
Добрый День Пример приведенный в CounterSigned.vb Код: Dim signedCms As SignedCms = New SignedCms(contentInfo)
' Подписываем сообщение в формате CMS/PKCS7
' один раз для каждого сертификата отправителя.
For Each cert As X509Certificate2 In signerCerts
Console.Write("Вычисляем подпись сообщения для субъекта " & _
"{0} ... ", cert.SubjectName.Name)
signedCms.ComputeSignature(New CmsSigner(cert), False)
Console.WriteLine("Успешно.")
Next
' Вычисляем соподписи к первой в сообщении в формате
' CMS/PKCS7 один раз для каждого сертификата дополнительной подписи.
For Each cert As X509Certificate2 In countersignerCerts
Console.Write("Вычисляем соподписи сообщения для субъекта " & _
" {0} ... ", _
cert.SubjectName.Name)
signedCms.SignerInfos(0).ComputeCounterSignature( _
New CmsSigner(cert))
Console.WriteLine("Успешно.")
Next
в примере описывается возможность подписывания документа несколькими сертификатами + соподписи все сертификаты при подписи требуют наличие секретного ключа и пароля к нему. Вопрос собственно в том есть ли возможность подписывать документ с разных компьютеров в разное время. Т.е. ситуация есть документ его подписывает одно лицо (на одном компьютере), далее второе лицо со своим созданным вновь signedCms подписывает еще раз документ (может произойти с другого компьютера), кто то там зашифровывает его (не важно - может третье лицо). При подписи я так понимаю contentInfo преобразуется, и повторное подписывание документа приведет к потере информации о первой подписи ну и вообще к проблемам при signedCms.Decode. Ну и метод выведет только последнюю подпись которой собственно подписался документ. Код: ' Этот метод выводит некотоорые свойства подписанного сообщения
' в формате CMS/PKCS7. Эти свойства включают число основных и
' дополнительных подписей, информацию, является ли сообщение
' отделенным и версию сообщения.
Private Sub DisplaySignedCmsProperties(ByVal info As String, _
ByVal s As SignedCms)
Console.WriteLine()
Me.ListBox1.Items.Add("{0}SignedCms: {1}" & _
Environment.NewLine & " - " & info)
Me.ListBox1.Items.Add(ChrW(9) + "Количество подписавших:" & _
ChrW(9) + ChrW(9) + ChrW(9) + " {0} " & _
s.SignerInfos.Count)
For i As Integer = 0 To s.SignerInfos.Count - 1
Me.ListBox1.Items.Add(ChrW(9) + "Имя субъекта подписавшего #{0}:" & _
ChrW(9) & ChrW(9) & "{1}" & _
i + 1 & " - " & s.SignerInfos(i).Certificate.SubjectName.Name)
Me.ListBox1.Items.Add(ChrW(9) + "Количество соподпией для " & _
"подписавшего #{0}:" & ChrW(9) & "{1}" & _
i + 1 & " - " & s.SignerInfos(i).CounterSignerInfos.Count)
Next
Console.WriteLine()
End Sub
Если возможно разделять сертификаты для подписи документа, как можно это сделать? Спасибо
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 15.10.2009(UTC) Сообщений: 49 Откуда: CHL
|
Или же я где то храню постоянно не тронутый contentInfo для каждого подписывающего сообщение и после signedCms.ComputeSignature добавляю в конечный файл результат signedCms.Encode() А потом все зашифровываю? Тем самым перед шифрованием получаю файл из нескольких кусков signedCms.Encode() для каждого contentInfo- сообщения которое хочет подписать сертификат? Или не в ту сторону мыслю совсем?) Отредактировано пользователем 2 ноября 2009 г. 17:03:47(UTC)
| Причина: Не указана
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 24.12.2007(UTC) Сообщений: 390 Откуда: КриптоПро Поблагодарили: 2 раз в 2 постах
|
1. Никто не подписывает зашифрованный текст. Обычно проставляют подписи, а потом зашифровывают. Зашифрование обычно производят на время пересылки документа. Пример подписи и последующего зашифрования EnvelopedSigned.* . 2. Есть два основных вида подписи. - подпись текста - соподпись (подпись подписи). В обоих случаях подписывать можно многократно. В любом случае подписываемый текст остается неизменным. И при каждой следующей подписи можно проверять предыдущую. Соподпись используется очень редко. 3. Если Вы создадите SignedCms по уже подписанному документу (как Вы делаете при проверке), и добавите еще одного CmsSigner с его подписью, то подпись первого останется правильной. Хранить нужно весь CMS просто в качестве содержимого надо брать именно содержимое, а не весь подписанный CMS.
|
С уважением, Александр. |
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 15.10.2009(UTC) Сообщений: 49 Откуда: CHL
|
Да безусловно сначало подписываю документ потом шифрование (возможно что то не так написал) Получается что когда выполняется команда signedCms.Encode() при подписывании - на самом деле в файл добавляется подпись электронная - само содержимое не меняется?
т.е. я могу подготовить файл таким образом
1. Собрать в файл все подписи для документа 2. Добавить в файл содержимое документа 3. Провести шифрование
на выходе получить зашифрованное сообщение для переписки + подписи людей которые пожелали поучавствовать в электронной подписи для документа?
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 15.10.2009(UTC) Сообщений: 49 Откуда: CHL
|
EnvelopedSigned пример на этапе подписи тоже идет кодирование: Код: ByVal signerCert As X509Certificate2) As Byte()
' Создаем объект ContentInfo по сообщению.
' Это необходимо для создания объекта SignedCms.
Dim ContentInfo As ContentInfo = New ContentInfo(msg)
' Создаем объект SignedCms по только что созданному
' объекту ContentInfo.
' SubjectIdentifierType установлен по умолчанию в
' IssuerAndSerialNumber.
' Свойство Detached установлено по умолчанию в false, таким
' образом сообщение будет включено в SignedCms.
Dim signedCms As SignedCms = New SignedCms(ContentInfo)
' Определяем подписывающего, объектом CmsSigner.
Dim cmsSigner As CmsSigner = New CmsSigner(signerCert)
' Подписываем CMS/PKCS #7 сообение.
Console.Write("Вычисляем подпись сообщения для субъекта " & _
"{0} ... ", signerCert.SubjectName.Name)
signedCms.ComputeSignature(cmsSigner)
Console.WriteLine("Успешно.")
' Кодируем CMS/PKCS #7 сообщение.
Return signedCms.Encode()
опять же для одного сертификата или же это кодирование подписи?
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 24.12.2007(UTC) Сообщений: 390 Откуда: КриптоПро Поблагодарили: 2 раз в 2 постах
|
Цитата:Получается что когда выполняется команда signedCms.Encode() при подписывании - на самом деле в файл добавляется подпись электронная - само содержимое не меняется? В SignedCms содержится подписываемый тест, собственно подписи, подписываемые атрибуты, неподписываемые атрибуты и др. Огрубляя, при вызове функции ComputeSignature подписывается только текст и подписываемые атрибуты, другие подписи не подписываются. Функция encode (decode) - кодирует (декодирует) это все в одну байтовую последовательность (текст, подписи, атирибуты...). При проверке подписи из декодированного сообщения выбирается то что подписывалось - текст и подписываемые атрибуты, другие подписи так же не участвуют в проверке. |
С уважением, Александр. |
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 24.12.2007(UTC) Сообщений: 390 Откуда: КриптоПро Поблагодарили: 2 раз в 2 постах
|
|
С уважением, Александр. |
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 15.10.2009(UTC) Сообщений: 49 Откуда: CHL
|
все равно не понятно Александр - если есть возможность, можно примерчик что бы наглядно для задачи 1. есть файлик (или текст) 2. Файлик или текст подписывается 1м пользователем (после подписывания сохраняется на диск) 3. Уже подписанный файлик подписывается 2м пользователем (после подписывания сохраняется на диск) 4. открываем файлик и видим что у него стоит 2е подписи.
Если такое возможно конечно.
просто затык в том что все примеры показывают конечный результат после подписывания и заканчиваются signedCms.Encode в случае нескольких подписей опять же подразумевается наличие в коллекции всех сертификатов для подписи и он по циклу их прогоняет и подписывает опять же все в рамках одной области signedCms. А как сделать так что бы подписать - сохранить подпись + подписать еще раз - опять сохранить и потом увидеть в сохраненном что файл имеет 2е подписи.
Я может задаю какие то тривиальные вопросы) которые всем уже понятны)). Но хочется разобраться
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 24.12.2007(UTC) Сообщений: 390 Откуда: КриптоПро Поблагодарили: 2 раз в 2 постах
|
AddSign.cs добавление подписи в уже подписанный CMS Verify.cs проверка подписей в CMS (все что найдет) Вложение(я): AddSign.cs (6kb) загружен 85 раз(а). Verify.cs (7kb) загружен 58 раз(а).У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться. |
С уважением, Александр. |
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 15.10.2009(UTC) Сообщений: 49 Откуда: CHL
|
Все как всегда просто) Спасибо большое Александр за примеры, и уделенное время!
|
|
|
|
Форум КриптоПро
»
Средства криптографической защиты информации
»
КриптоПро .NET
»
Подпись одного документа несколькими сертификатами с разных компьютеров?
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close