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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline postoronnim74  
#1 Оставлено : 27 апреля 2018 г. 16:36:06(UTC)
postoronnim74

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

Группы готовые для захвата: Участники
Зарегистрирован: 22.11.2017(UTC)
Сообщений: 8

Сказал(а) «Спасибо»: 1 раз
Доброго дня, уважаемые участники форума.
Инструмент разработки - c#. Требуется заменить ключевой контейнер на носителе (смарт-карта), и, соответственно, запросить и установить в новый контейнер сертификат.
При этом выдвигается требование, что запрос на новый сертификат должен быть подписан текущим ключом пользователя.
Выполняется следующая последовательность действий. Создается новый контейнер в реестре с помощью CX509PrivateKey, создается CX509CertificateRequestPkcs10, создается CX509Enrollment и из него получается RawData запроса.
Теперь RawData нужно подписать на текущем ключе пользователя.
Подскажите, а как это сделать?
Я пытался воспользоваться тем, как это сделано в примерах:
Код:

        public static String MakeRawRequest(String request, X509Certificate2 certificate)
        {
            return Convert.ToBase64String(Sign(Sign(Encoding.Unicode.GetBytes(request), certificate), certificate));
        }

        private static byte[] Sign(byte[] content, X509Certificate2 certificate)
        {
            var cms = new SignedCms(new ContentInfo(content));

            var signer = new CmsSigner(certificate)
            {
                Certificate = certificate,
                IncludeOption = X509IncludeOption.WholeChain
            };

            cms.ComputeSignature(signer, false);

            return cms.Encode();
        }

где certificate - это сертификат, считанный с карты:
Код:

                ...
                if (!CryptGetKeyParam(hKey, KP_CERTIFICATE, pbData, ref dwDataLen, 0))
                {
                    throw new Exception("Ошибка чтения сертификата", new Win32Exception(Marshal.GetLastWin32Error()));
                }

                return new X509Certificate2(pbData);

Но вызов
Код:

cms.ComputeSignature(signer, false);

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