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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline zay  
#1 Оставлено : 14 июля 2008 г. 23:57:36(UTC)
zay

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

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

При попытке подписать XML документ выдается Exception:
System.Security.Cryptography.CryptographicException was unhandled
Message="Could not create hash algorithm object."
Source="System.Security"
StackTrace:
at System.Security.Cryptography.Xml.Reference.CalculateHashValue(XmlDocument document, CanonicalXmlNodeList refList)
at System.Security.Cryptography.Xml.SignedXml.BuildDigestedReferences()
at System.Security.Cryptography.Xml.SignedXml.ComputeSignature()
at BlizkoGate.XML.SignXML(XmlDocument dXml) in C:\Work\Blizko\BlizkoGate\BlizkoGate\Program.cs:line 70
at BlizkoGate.Program.Main() in C:\Work\Blizko\BlizkoGate\BlizkoGate\Program.cs:line 157
at System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()

в строке: signedXml.ComputeSignature();

Метод, который подписывает XML:

public XmlDocument SignXML(XmlDocument dXml)
{
//Извлекаем нужный нам сертификат
X509Store storeMy = new X509Store(StoreName.My, StoreLocation.CurrentUser);
storeMy.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
X509CertificateCollection foundCertColl = storeMy.Certificates.Find(X509FindType.FindBySubjectName, "имя сертификата", false);

if (foundCertColl.Count != 0)
{
// Создаем параметры для открытия секретного ключа.
CspParameters cspPar = new CspParameters();
cspPar.KeyContainerName = "имя контейнера";
cspPar.ProviderType = 75;

using (AsymmetricAlgorithm Key = new Gost3410CryptoServiceProvider(cspPar))
{
X509Certificate cert = foundCertColl[0];
SignedXml signedXml = new SignedXml(dXml);

// Добавляем ключ в SignedXml документ.
signedXml.SigningKey = Key;

// Создаем ссылку на node для подписи.
// При подписи всего документа проставляем "".
Reference reference = new Reference();
reference.Uri = "";

// Явно проставляем алгоритм хеширования,
// по умолчанию SHA1.
reference.DigestMethod = "http://www.w3.org/2001/04/xmldsig-more#gostr3411";

// Добавляем transform на подписываемые данные
// для удаления вложенной подписи.
XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();

reference.AddTransform(env);

// Добавляем transform для канонизации.
XmlDsigExcC14NTransform c14 = new XmlDsigExcC14NTransform();
reference.AddTransform(c14);

// Добавляем ссылку на подписываемые данные
signedXml.AddReference(reference);

KeyInfo keyInfo = new KeyInfo();
keyInfo.AddClause(new KeyInfoX509Data(cert));

// Добавляем KeyInfo в SignedXml.
signedXml.KeyInfo = keyInfo;

// Вычисляем подпись.
signedXml.ComputeSignature(); //Здесь возникает exception

// Получаем XML представление подписи и сохраняем его
// в отдельном node.
XmlElement xmlDigitalSignature = signedXml.GetXml();

// Добавляем node подписи в XML документ.
dXml.DocumentElement.AppendChild(dXml.ImportNode(xmlDigitalSignature, true));
}
}
return dXml;
}

CallStack:

> BlizkoGate.exe!BlizkoGate.XML.SignXML(System.Xml.XmlDocument dXml = {Document}) Line 70 C#
BlizkoGate.exe!BlizkoGate.Program.Main() Line 157 + 0x1c bytes C#
[External Code]
Offline Челпанов А.  
#2 Оставлено : 15 июля 2008 г. 16:28:04(UTC)
Челпанов А.

Статус: Активный участник

Группы: Участники
Зарегистрирован: 24.12.2007(UTC)
Сообщений: 390
Мужчина
Откуда: КриптоПро

Поблагодарили: 2 раз в 2 постах
Это ошибка в текущей версии (1.0.3110.0). 16.07.2008 выложим новую версию. Спасибо.
С уважением, Александр.
Offline zay  
#3 Оставлено : 17 июля 2008 г. 16:13:03(UTC)
zay

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

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

Челпанов А. написал:
Это ошибка в текущей версии (1.0.3110.0). 16.07.2008 выложим новую версию. Спасибо.


Установил версию 1.0.3118.0, после этого установил .Net Framework 2.0 SP1
Проблема сохранилась:

System.Security.Cryptography.CryptographicException was unhandled
Message="Could not create hash algorithm object."
Source="System.Security"
StackTrace:
at System.Security.Cryptography.Xml.Reference.CalculateHashValue(XmlDocument document, CanonicalXmlNodeList refList)
at System.Security.Cryptography.Xml.SignedXml.BuildDigestedReferences()
at System.Security.Cryptography.Xml.SignedXml.ComputeSignature()
at BlizkoGate.XML.SignXML(XmlDocument dXml) in C:\Work\Blizko\BlizkoGate\BlizkoGate\Program.cs:line 70
at BlizkoGate.Program.Main() in C:\Work\Blizko\BlizkoGate\BlizkoGate\Program.cs:line 157
at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()

Может проблема в чем-то другом.
Offline zay  
#4 Оставлено : 24 июля 2008 г. 20:17:43(UTC)
zay

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

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

Когда будет выложена версия, в которую войдет исравление описанной выше ошибки?
Offline Челпанов А.  
#5 Оставлено : 15 сентября 2008 г. 20:38:47(UTC)
Челпанов А.

Статус: Активный участник

Группы: Участники
Зарегистрирован: 24.12.2007(UTC)
Сообщений: 390
Мужчина
Откуда: КриптоПро

Поблагодарили: 2 раз в 2 постах
КриптоПро Sharpei (1.0.3176.0). Выложена.
С уважением, Александр.
Offline Smoker  
#6 Оставлено : 25 сентября 2008 г. 17:17:44(UTC)
Smoker

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

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

У меня та же проблема,
где выложена предварительная версия 1,0,3176,0 ?
заходил на страницу продукты-> КриптоПро Sharpei -> дистрибутив
скачивал как SDK так и RTE - версия сборки : 1,0,0,8 и ошибка остается.
Где взять версию 1,0,3176,0 ?
Offline Smoker  
#7 Оставлено : 25 сентября 2008 г. 17:40:13(UTC)
Smoker

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

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

млин, все верно версия сборки 1,0,0,8
версия файла 1,0,3176,0

Но один фиг,
CryptographicException: Невозможно создать объект хеш-алгоритма.

а вот свойство PrivateKey у объекта типа X509Certificate2
'cert.PrivateKey' threw an exception of type 'System.NotSupportedException' System.Security.Cryptography.AsymmetricAlgorithm {System.NotSupportedException}

не поддерживается ваш алгоритм сисетмой, не знает она про него, может что-то дополнительно настроить нужно
у меня КриптоПро CSP3, Framework 2.0 (SP1), Windows XP
Offline Челпанов А.  
#8 Оставлено : 25 сентября 2008 г. 18:18:18(UTC)
Челпанов А.

Статус: Активный участник

Группы: Участники
Зарегистрирован: 24.12.2007(UTC)
Сообщений: 390
Мужчина
Откуда: КриптоПро

Поблагодарили: 2 раз в 2 постах
Обычно диагностика
> а вот свойство PrivateKey у объекта типа X509Certificate2
> 'cert.PrivateKey' threw an exception of type 'System.NotSupportedException' System.Security.Cryptography.AsymmetricAlgorithm {System.NotSupportedException}
признак того что неправильно установился Шарпей.
Нажмите Start\Run введите cmd.exe и нажмите ok во вновь открывшемся командном окне введите
cd C:\Program Files\Crypto Pro\Sharpei
запустите
alarm info
в папаке C:\Program Files\Crypto Pro\Sharpei появится файла osinfo.txt закройте командное окно, а файл C:\Program Files\Crypto Pro\Sharpei\osinfo.txt (желательно предварительно запакованный) присоедините к письму и отправьте письмо по адресу support@cryptopro.ru.
С уважением, Александр.
Offline Smoker  
#9 Оставлено : 25 сентября 2008 г. 19:01:55(UTC)
Smoker

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

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

отправил
тема письма: к посту от От: 25 сентября 2008 г. 14:18:18
Offline Smoker  
#10 Оставлено : 25 сентября 2008 г. 19:33:08(UTC)
Smoker

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

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

Атас, все заработало.
Советую в инсталляционном пакете сделать предупреждение
"НАСТОЯТЕЛЬНО !!! РЕКОМЕНДУЕТСЯ ПЕРЕЗАГРУЗИТЬ КОМПЬЮТЕР ПОСЛЕ УСТАНОВКИ"

А вообще молодцы, оперативно работаете, так держать!

и еще вопрос: у меня есть объект сертификата, корректно будет сделать так:

X509Certificate2 cert = // получил не важно как
// Добавляем ключ в SignedXml документ.
signedXml.SigningKey = cert.PrivateKey;
...
и т.д.
вроде все отработало, подпись есть
Offline Челпанов А.  
#11 Оставлено : 25 сентября 2008 г. 19:53:21(UTC)
Челпанов А.

Статус: Активный участник

Группы: Участники
Зарегистрирован: 24.12.2007(UTC)
Сообщений: 390
Мужчина
Откуда: КриптоПро

Поблагодарили: 2 раз в 2 постах
Спасибо за совет вставки предупреждения, но пока еще теплится надежда выполнить установку без перезагрузки. Как только она пропадет, вставим стандартное приглашение перезагрузки. )))
Если вы нашли сертификат в store "my" То корректно (со ссылкой на секретный ключ). Например, так
Код:
// Открываем store "My"
X509Store store = new X509Store("My", StoreLocation.CurrentUser);
store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
X509Certificate2 ret = null;
int count = 0;
foreach (X509Certificate2 cer in store.Certificates)
{
    if (cer.Equals(certToFind))
   {
        count++;
        ret = cer;
    }
}

// Проверяем, что нашли ровно один сертификат.
if (count == 0)
{
   Console.WriteLine("Сертификат не найден.");
   return;
}

// Если сертификат найден, то он только один

// Получаем секретный ключ соответствующий данному сертификату.
AsymmetricAlgorithm asym = ret.PrivateKey;
if (asym == null)
{
    Console.WriteLine("Нет секретного ключа соответствующего искомому сертификату.");
    return;
}

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