Статус: Новичок
Группы: Участники
Зарегистрирован: 30.08.2013(UTC) Сообщений: 8
|
Сделал процедуру подписи на С# (.Net 4.5) Код:public void Sign(byte[] source, out byte[] dest, X509Certificate2 certificate, string comment = "")
{
CmsSigner cmsSigner = new CmsSigner(certificate);
cmsSigner.DigestAlgorithm = new Oid("1.2.643.2.2.9");
/*
cmsSigner.SignedAttributes.Add(new Pkcs9SigningTime());
if (comment != "")
cmsSigner.SignedAttributes.Add(new Pkcs9Comment(comment));
*/
SignedCms signedCms = new SignedCms(new ContentInfo(source));
signedCms.ComputeSignature(cmsSigner, false);
dest = signedCms.Encode();
}
если вызвать эту процедуру дважды и передовать в качестве параметра один и тот же сертфиикат, то на втором вызове падает ошибка Параметр задан неверно. (HResult -2147024809) в System.Security.Cryptography.Pkcs.SignedCms.Sign(CmsSigner signer, Boolean silent) в System.Security.Cryptography.Pkcs.SignedCms.ComputeSignature(CmsSigner signer, Boolean silent) т.е. не получается подписать дважды одним и тем же сертификатом (объектом) Код:CryptoManager manager = new CryptoManager();
X509Store store = new X509Store("MY", StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadWrite | OpenFlags.OpenExistingOnly);
X509Certificate2Collection collection = store.Certificates;
X509Certificate2Collection findCollection = collection.Find(X509FindType.FindBySerialNumber, "....", false);
byte[] dest3;
manager.Sign(File.ReadAllBytes("..."), out dest3, findCollection[0], "Тест");
manager.Sign(File.ReadAllBytes("..."), out dest3, findCollection[0], "Тест");
Отредактировано пользователем 28 августа 2016 г. 15:31:18(UTC)
| Причина: Не указана
|
|
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,457  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 39 раз Поблагодарили: 750 раз в 645 постах
|
Да, это известная ошибка в Microsoft .NET. Необходимо переоткрывать хранилище или подписывать иным способом. Возможно получится запретить кэширование криптопровайдера в контексте сертификата, если не указывать флаг CERT_SET_KEY_PROV_HANDLE_PROP_ID при создании ссылки на ключ. Отредактировано пользователем 28 августа 2016 г. 23:44:53(UTC)
| Причина: Не указана |
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 30.08.2013(UTC) Сообщений: 8
|
Спасибо. Как раз хотелось бы подписывать пачку документов и при этом один раз вводить пароль к закрытому ключу. Поэтому переоткрывать хранилище не вариант. В .Net 4.6 не поправили они? Там вроде классы стали IDisposable, может и это поправили. У меня остается вариант работать напрямую с криптоАПИ, правильно?
|
|
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,457  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 39 раз Поблагодарили: 750 раз в 645 постах
|
Значит не поправили. Если нужно подписывать без переоткрытия контейнера, то исользуйте CryptoApi. Исправить код MS будет довольно сложно, но и не очень хочется этого делать - не все ведь используют КриптоПро .NET. Освобождается без проверки флага bRelease из CryptAcquireCertitificatePrivateKey Код:CMSG_SIGNER_ENCODE_INFO:Dispose()
{
if (this.hCryptProv != IntPtr.Zero)
{
CryptReleaseContext(this.hCryptProv, 0);
}
}
Отредактировано пользователем 29 августа 2016 г. 8:30:10(UTC)
| Причина: Не указана |
|
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close