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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline stim24  
#1 Оставлено : 30 сентября 2020 г. 10:07:16(UTC)
stim24

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

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

Когда вызываю ComputeSignature

Код:

        static byte[] SignMsg(
            Byte[] msg,
            X509Certificate2 signerCert)
        {
            // Создаем объект ContentInfo по сообщению.
            // Это необходимо для создания объекта SignedCms.
            ContentInfo contentInfo = new ContentInfo(msg);
            // Создаем объект SignedCms по только что созданному
            // объекту ContentInfo.
            // SubjectIdentifierType установлен по умолчанию в 
            // IssuerAndSerialNumber.
            // Свойство Detached устанавливаем явно в true, таким 
            // образом сообщение будет отделено от подписи.
            SignedCms signedCms = new SignedCms(contentInfo, true);

            // Определяем подписывающего, объектом CmsSigner.
            CmsSigner cmsSigner = new CmsSigner(signerCert);
            cmsSigner.IncludeOption = X509IncludeOption.EndCertOnly;
            // Подписываем CMS/PKCS #7 сообение.
            //Console.Write("Вычисляем подпись сообщения для субъекта " +    "{0} ... ", signerCert.SubjectName.Name);
            //CMessage.Info("Вычисляем подпись сообщения для субъекта " + signerCert.SubjectName.Name);
            //CMessage.Info("start signedCms.ComputeSignature(cmsSigner)"+ cmsSigner.Certificate.SubjectName);

            // ТУТ ОШИБКА  - Набор ключей не существует
            signedCms.ComputeSignature(cmsSigner);
            //CMessage.Info("end signedCms.ComputeSignature(cmsSigner)");
            Console.WriteLine("Успешно.");

            // Кодируем CMS/PKCS #7 подпись сообщения.
            return signedCms.Encode();
        }

пишет набор ключей не существует на методе ComputeSignature
Что делать?
Причем на всех ПК работает. А вот на одном не срабатывает. Сертификат переустанавливали.
Offline Андрей *  
#2 Оставлено : 30 сентября 2020 г. 10:14:54(UTC)
Андрей *

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

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

Сказал «Спасибо»: 549 раз
Поблагодарили: 2208 раз в 1723 постах
Здравствуйте.

1. Приложение выполняется под другим пользователем
2. Неправильно установлен сертификат. Панель управления КриптоПРО CSP\Протестировать\По сертификату - есть ошибка?
Техническую поддержку оказываем тут
Наша база знаний
Offline stim24  
#3 Оставлено : 1 октября 2020 г. 5:54:42(UTC)
stim24

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

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

1. не совсем понятно что имеется ввиду под другим пользователем.
2. протестировал - ошибок не обнаружено.
Offline Андрей *  
#4 Оставлено : 1 октября 2020 г. 9:31:28(UTC)
Андрей *

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

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

Сказал «Спасибо»: 549 раз
Поблагодарили: 2208 раз в 1723 постах
Автор: stim24 Перейти к цитате
1. не совсем понятно что имеется ввиду под другим пользователем.
2. протестировал - ошибок не обнаружено.


1. Частая ошибка - тестируют через панель управления под текущим пользователем, а приложение выполняется под другим (служба)
2. Протестировали именно тот сертификат, что передаётся в signerCert? Сверьте отпечатки.
Не показано, как получается signerCert. Импортом сертификата из файла или поиском через хранилище Личное?
Техническую поддержку оказываем тут
Наша база знаний
Offline stim24  
#5 Оставлено : 1 октября 2020 г. 10:07:32(UTC)
stim24

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

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

1. Под одним пользователем.
2.
Получаю его так
Код:
 
string signerName="Имя сертификата";
X509Certificate2 signerCert = GetSignerCert(signerName);

Вот ф-ция
Код:

        static X509Certificate2 GetSignerCert(string signerName)
        {
            // Открываем хранилище My.
            X509Store storeMy = new X509Store(StoreName.My,
                StoreLocation.CurrentUser);
            storeMy.Open(OpenFlags.ReadOnly);

            // Отображаем сертификаты для удобства работы
            // с примером.
            Console.WriteLine("Найдены сертификаты следующих субъектов " +
                "в хранилище {0}:", storeMy.Name);
            foreach (X509Certificate2 cert in storeMy.Certificates)
            {
                Console.WriteLine("\t{0}", cert.SubjectName.Name);
                // Clipboard.SetText(cert.SubjectName.Name);
                int tt = 0;
            }

            // Ищем сертификат для подписи.
            X509Certificate2Collection certColl =
                storeMy.Certificates.Find(X509FindType.FindBySubjectName,
                signerName, false);
            Console.WriteLine(
                "Найдено {0} сертификат(ов) в хранилище {1} для субъекта {2}",
                certColl.Count, storeMy.Name, signerName);

            // Проверяем, что нашли требуемый сертификат
            if (certColl.Count == 0)
            {
                Console.WriteLine(
                    "Сертификат для данного примера не найден " +
                    "в хранилище. Выберите другой сертификат для подписи. ");
                return null;
            }

            storeMy.Close();

            // Если найдено более одного сертификата,
            // возвращаем первый попавщийся.
            return certColl[0];
        }

Как понять проверить "отпечатки"?

Отредактировано пользователем 1 октября 2020 г. 10:08:09(UTC)  | Причина: Не указана

Offline Андрей *  
#6 Оставлено : 1 октября 2020 г. 11:29:50(UTC)
Андрей *

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

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

Сказал «Спасибо»: 549 раз
Поблагодарили: 2208 раз в 1723 постах
Find(X509FindType.FindBySubjectName, signerName



Цитата:
// Проверяем, что нашли требуемый сертификат
if (certColl.Count == 0)



А если будет 2 и более подходящих сертификата и вернётся просроченный\не имеющий ссылку на закрытый ключ?

certColl.Count какое имеет значение, 1?
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#7 Оставлено : 1 октября 2020 г. 11:30:50(UTC)
Андрей *

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

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

Сказал «Спасибо»: 549 раз
Поблагодарили: 2208 раз в 1723 постах
Автор: stim24 Перейти к цитате

Как понять проверить "отпечатки"?


Свойство thumbprint. По нему и искать в хранилище, а не по signerName
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (4)
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.