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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline 11ees  
#1 Оставлено : 28 августа 2016 г. 15:30:47(UTC)
11ees

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

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

Offline Максим Коллегин  
#2 Оставлено : 28 августа 2016 г. 23:40:06(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)  | Причина: Не указана

Знания в базе знаний, поддержка в центре поддержки
Offline 11ees  
#3 Оставлено : 29 августа 2016 г. 5:49:56(UTC)
11ees

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

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

Спасибо. Как раз хотелось бы подписывать пачку документов и при этом один раз вводить пароль к закрытому ключу. Поэтому переоткрывать хранилище не вариант. В .Net 4.6 не поправили они? Там вроде классы стали IDisposable, может и это поправили.
У меня остается вариант работать напрямую с криптоАПИ, правильно?
Offline Максим Коллегин  
#4 Оставлено : 29 августа 2016 г. 8:28:34(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 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)  | Причина: Не указана

Знания в базе знаний, поддержка в центре поддержки
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.