Статус: Активный участник
Группы: Участники
Зарегистрирован: 17.09.2010(UTC) Сообщений: 73  Откуда: АО ИНФИНИТУМ, Москва Сказал «Спасибо»: 3 раз
|
Доброго времени суток.
Необходимо подписать файл несколькими подписями в формате PKCS#7/CMS и хранить их все в ОДНОМ detached файле .sig. В примере показано как добавить подпись, но при этом подписывается файл .sig. Возможно ли подписать второй подписью сам исходный файл, но сохранить её в существующем файле подписи?
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,398  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 719 раз в 623 постах
|
Может так? Метод класс SignedCms Если подпись уже была, то добавится вторая (cosign). Цитата:public void ComputeSignature(CmsSigner signer, bool silent) { if (signer == null) { throw new ArgumentNullException("signer"); } if (this.ContentInfo.Content.Length == 0) { throw new CryptographicException(SecurityResources.GetResourceString("Cryptography_Cms_Sign_Empty_Content")); } if (SubjectIdentifierType.NoSignature == signer.SignerIdentifierType) { if ((this.m_safeCryptMsgHandle != null) && !this.m_safeCryptMsgHandle.IsInvalid) { throw new CryptographicException(SecurityResources.GetResourceString("Cryptography_Cms_Sign_No_Signature_First_Signer")); } this.Sign(signer, silent); } else { if (signer.Certificate == null) { if (silent) { throw new InvalidOperationException(SecurityResources.GetResourceString("Cryptography_Cms_RecipientCertificateNotFound")); } signer.Certificate = PkcsUtils.SelectSignerCertificate(); } if (!signer.Certificate.HasPrivateKey) { throw new CryptographicException(-2146893811); } CspParameters parameters = new CspParameters(); if (!X509Utils.GetPrivateKeyInfo(X509Utils.GetCertContext(signer.Certificate), ref parameters)) { throw new CryptographicException(Marshal.GetLastWin32Error()); } KeyContainerPermission permission = new KeyContainerPermission(KeyContainerPermissionFlags.NoFlags); KeyContainerPermissionAccessEntry accessEntry = new KeyContainerPermissionAccessEntry(parameters, KeyContainerPermissionFlags.Sign | KeyContainerPermissionFlags.Open); permission.AccessEntries.Add(accessEntry); permission.Demand(); if ((this.m_safeCryptMsgHandle == null) || this.m_safeCryptMsgHandle.IsInvalid) { this.Sign(signer, silent); } else { this.CoSign(signer, silent); } } }
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 17.09.2010(UTC) Сообщений: 73  Откуда: АО ИНФИНИТУМ, Москва Сказал «Спасибо»: 3 раз
|
maxdm, спасибо, что ответили. Я наверное нечетко сформулировал вопрос, извините Мой код, основанный на темплэйтах КриптоПро: Цитата:static void AddSignature(string sigFile, string certThumb) { var signerCert = GetCertificate(certThumb);
// Подписываем файл с предыдущей подписью и ... var encodedSignature = SignCMS(sigFile, signerCert, true); // ... затираем его File.WriteAllBytes(sigFile, encodedSignature); }
// Подписываем сообщение секретным ключем. static byte[] SignCMS(string file2Sig, X509Certificate2 signerCert, bool isMsgSignature) { var msg = File.ReadAllBytes(file2Sig);
var contentInfo = new ContentInfo(msg); var signedCms = new SignedCms(contentInfo, true);
if (isMsgSignature) signedCms.Decode(msg);
var cmsSigner = new CmsSigner(signerCert) { IncludeOption = X509IncludeOption.WholeChain };
signedCms.ComputeSignature(cmsSigner);
return signedCms.Encode(); } Как видно из кода, каждая накладываемая подпись, начиная со второй, накладывается на отдельный файл (detached), содержащий инфо обо всех предыдущих подписях. В этом случае при проверке подписей все, кроме первой, считаются недействительными. Есть подозрения, что это происходит из-за того, что эти подписи наложены не на сам файл-источник, а на отделенный файл .sig. Других примеров добавления detached подписи я не на нашел. Проверяю КриптоАРМом. Вот и возник вопрос, можно ли подписывать каждый раз файл-источник, а инфо о подписи складывать в .sig файл, где уже лежит инфо о предыдущих подписях? Если возможно, то как? Есть догадки, что КриптоАРМ именно так и делает...
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 17.09.2010(UTC) Сообщений: 73  Откуда: АО ИНФИНИТУМ, Москва Сказал «Спасибо»: 3 раз
|
Вопрос можно переформулировать таким образом: Как в .NET добавить вторую подпись так же, как это делает КриптоАРМ (правой клавишей по sig файлу) ?
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,398  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 719 раз в 623 постах
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 17.09.2010(UTC) Сообщений: 73  Откуда: АО ИНФИНИТУМ, Москва Сказал «Спасибо»: 3 раз
|
Спасибо! Таким образом все работает, единственное, что смущает, что этот метод создает подпись ДРУГОЙ стороны. Но если в КриптоАРМ эта функция реализована именно таким образом, значит все должно быть правильно. Еще раз спасибо
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 02.04.2015(UTC) Сообщений: 11  Откуда: Казань
|
Автор: maxdm  на javascript с помощью capicom или cadescom можно реализовать то же самое?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,492   Сказал «Спасибо»: 554 раз Поблагодарили: 2247 раз в 1753 постах
|
Автор: plov  Автор: maxdm  на javascript с помощью capicom или cadescom можно реализовать то же самое? Да. |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 16.06.2017(UTC) Сообщений: 8  Откуда: Мск Сказал(а) «Спасибо»: 3 раз
|
А есть возможность два отдельных sig файла склеить в один sig? Без переподписания и в любом порядке?
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 26.08.2010(UTC) Сообщений: 259 Откуда: Moscow
Сказал(а) «Спасибо»: 4 раз Поблагодарили: 11 раз в 10 постах
|
Автор: kad  А есть возможность два отдельных sig файла склеить в один sig? Без переподписания и в любом порядке? Канешно есть, дарагой. copy a+b >c НО это то же что склеить указы о премии и выговоре. Ежели серьезно, то можно: парсим структуры ASN1 подписей, смотрим на структуру подписи двумя подписантами и склеиваем. Это будет полный бардак и не стоит усилий. Я в свое время разбирался с detached подписями. Attached подписи могут быть от разных провайдеров ГОСТ+RSA, а вот для Detacet пришлось делать кроватки для каждого варианта подписанта Спасибо Елене Новожиловой.
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close