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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Shrike  
#1 Оставлено : 14 февраля 2012 г. 22:58:27(UTC)
Shrike

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

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

В .NET программе требуется открыть запароленный контейнер для того, чтобы выполнить подписание нескольких файлов одним ключом без повторного запроса пароля. Как это сделать с помощью Sharpei у вас написано (http://www.cryptopro.ru/forum2/Default.aspx?g=posts&t=2930). Мне надо без Sharpei. Если этого нельзя на чистом .net, то пойдет и c/c++ (вызову через p/invoke).

Исходные данные - сертификат.

Пробовал так (вариант 3в из f.a.q.):
Код:

01		public static byte[] SignMsg(Byte[] msg, X509Certificate2 signerCert)
02		{
03			var contentInfo = new ContentInfo(msg);
04			var signedCms = new SignedCms(contentInfo, detached: false);
05			CspKeyContainerInfo info = ((ICspAsymmetricAlgorithm)signerCert.PrivateKey).CspKeyContainerInfo;
06			var pars = new CspParameters(info.ProviderType, info.ProviderName, info.KeyContainerName);
07			var password = "11111";
08			pars.Flags = CspProviderFlags.UseExistingKey;
09			pars.KeyNumber = (int)KeyNumber.Signature;
10			var s = new SecureString();
11			foreach (var c in password)
12				s.AppendChar(c);
13			pars.KeyPassword = s;
14			var signer = new CmsSigner(pars);  // здесь исключение
15			signedCms.ComputeSignature(signer, silent: false);
16			return signedCms.Encode();
17		}


В строке 14 возникает исключение CryptographicException "Key does not exist.".

Обращает на себя внимание то, что (CspKeyContainerInfo info).Protected равно false (в строке 06). Хотя контейнер запаролен.

Если строки 05-14 заменить на (т.е. создание CmsSigner по сертификату):
Код:

			var signer= new CmsSigner(signerCert);
			signedCms.ComputeSignature(signer, silent: false);

то все работает: пароль запрашивается, cms формируется.

Подскажите, пожалуйста, как подписать несколько раз одним ключом по сертификату без Sharpei?
Offline Максим Коллегин  
#2 Оставлено : 15 февраля 2012 г. 0:06:34(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 38 раз
Поблагодарили: 748 раз в 643 постах
Попробуйте сохранить пароль в контексте сертификата.
Знания в базе знаний, поддержка в центре поддержки
Offline Shrike  
#3 Оставлено : 15 февраля 2012 г. 2:58:09(UTC)
Shrike

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

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

maxdm написал:
Попробуйте сохранить пароль в контексте сертификата.

А каким образом это сделать? И что такое "контекст сертификата"? )
Offline Shrike  
#4 Оставлено : 15 февраля 2012 г. 20:57:54(UTC)
Shrike

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

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

maxdm написал:
Попробуйте сохранить пароль в контексте сертификата.

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