logo
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline KVI  
#1 Оставлено : 20 июля 2011 г. 17:52:46(UTC)
KVI

Статус: Активный участник

Группы: Участники
Зарегистрирован: 17.09.2010(UTC)
Сообщений: 73
Мужчина
Откуда: ООО ДКТ, Москва

Сказал «Спасибо»: 3 раз
Доброго времени суток.

Необходимо подписать файл несколькими подписями в формате PKCS#7/CMS и хранить их все в ОДНОМ detached файле .sig.
В примере показано как добавить подпись, но при этом подписывается файл .sig.
Возможно ли подписать второй подписью сам исходный файл, но сохранить её в существующем файле подписи?
Offline Максим Коллегин  
#2 Оставлено : 20 июля 2011 г. 23:15:15(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 5,249
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 11 раз
Поблагодарили: 475 раз в 434 постах
Может так? Метод класс 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);
}
}
}



Знания в базе знаний, поддержка в техподдержке
Offline KVI  
#3 Оставлено : 21 июля 2011 г. 11:39:45(UTC)
KVI

Статус: Активный участник

Группы: Участники
Зарегистрирован: 17.09.2010(UTC)
Сообщений: 73
Мужчина
Откуда: ООО ДКТ, Москва

Сказал «Спасибо»: 3 раз
maxdm, спасибо, что ответили.
Я наверное нечетко сформулировал вопрос, извините Anxious
Мой код, основанный на темплэйтах КриптоПро:
Цитата:
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 файл, где уже лежит инфо о предыдущих подписях?
Если возможно, то как? Есть догадки, что КриптоАРМ именно так и делает...
Offline KVI  
#4 Оставлено : 21 июля 2011 г. 12:23:06(UTC)
KVI

Статус: Активный участник

Группы: Участники
Зарегистрирован: 17.09.2010(UTC)
Сообщений: 73
Мужчина
Откуда: ООО ДКТ, Москва

Сказал «Спасибо»: 3 раз
Вопрос можно переформулировать таким образом:
Как в .NET добавить вторую подпись так же, как это делает КриптоАРМ (правой клавишей по sig файлу) ?
Offline Максим Коллегин  
#5 Оставлено : 21 июля 2011 г. 12:38:20(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 5,249
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 11 раз
Поблагодарили: 475 раз в 434 постах
Знания в базе знаний, поддержка в техподдержке
Offline KVI  
#6 Оставлено : 21 июля 2011 г. 12:44:10(UTC)
KVI

Статус: Активный участник

Группы: Участники
Зарегистрирован: 17.09.2010(UTC)
Сообщений: 73
Мужчина
Откуда: ООО ДКТ, Москва

Сказал «Спасибо»: 3 раз

Спасибо!
Таким образом все работает, единственное, что смущает, что этот метод создает подпись ДРУГОЙ стороны.
Но если в КриптоАРМ эта функция реализована именно таким образом, значит все должно быть правильно.
Еще раз спасибо
Offline plov  
#7 Оставлено : 19 апреля 2015 г. 12:37:12(UTC)
plov

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

Группы: Участники
Зарегистрирован: 02.04.2015(UTC)
Сообщений: 11
Российская Федерация
Откуда: Казань



на javascript с помощью capicom или cadescom можно реализовать то же самое?
Offline Андрей Писарев  
#8 Оставлено : 19 апреля 2015 г. 14:07:42(UTC)
Андрей Писарев

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

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

Сказал «Спасибо»: 264 раз
Поблагодарили: 1024 раз в 825 постах
Автор: plov Перейти к цитате


на javascript с помощью capicom или cadescom можно реализовать то же самое?


Да.
Offline kad  
#9 Оставлено : 26 января 2018 г. 14:35:33(UTC)
kad

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

Группы: Участники
Зарегистрирован: 16.06.2017(UTC)
Сообщений: 6
Австралия
Откуда: Мск

А есть возможность два отдельных sig файла склеить в один sig? Без переподписания и в любом порядке?
Offline Boris@Serezhkin.com  
#10 Оставлено : 29 января 2018 г. 21:38:08(UTC)
Boris@Serezhkin.com

Статус: Активный участник

Группы: Участники
Зарегистрирован: 26.08.2010(UTC)
Сообщений: 259
Откуда: Moscow

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 10 раз в 9 постах
Автор: kad Перейти к цитате
А есть возможность два отдельных sig файла склеить в один sig? Без переподписания и в любом порядке?
Канешно есть, дарагой.Dancing
copy a+b >c
НО это то же что склеить указы о премии и выговоре.
Ежели серьезно, то можно: парсим структуры ASN1 подписей, смотрим на структуру подписи двумя подписантами
и склеиваем.
Это будет полный бардак и не стоит усилий.
Я в свое время разбирался с detached подписями.
Attached подписи могут быть от разных провайдеров ГОСТ+RSA,
а вот для Detacet пришлось делать кроватки для каждого варианта подписанта
Спасибо Елене Новожиловой.


Offline Boris@Serezhkin.com  
#11 Оставлено : 14 февраля 2018 г. 21:33:05(UTC)
Boris@Serezhkin.com

Статус: Активный участник

Группы: Участники
Зарегистрирован: 26.08.2010(UTC)
Сообщений: 259
Откуда: Moscow

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 10 раз в 9 постах
Старый вопрос, Я разбирался, и спасибо ЕЛЕНЕ НОВОЖИЛОВОЙ
Для отделенной подписи надо заранее подготовить
шаблон, прописать там алгоритмы и прочая.
Для присоединенной этого не надо, улыбки микрософта....
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.