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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Randoom  
#1 Оставлено : 18 июня 2009 г. 19:35:23(UTC)
Randoom

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

Группы: Участники
Зарегистрирован: 15.06.2009(UTC)
Сообщений: 89
Откуда: Уфа, РРЦ "АйТи"

При подписывании XML документа в первый подход все хорошо,
но если подписывать более одного документа за раз - ошибка на строке

// Вычисляем подпись.
signedXml.ComputeSignature();

"Safe handle has been closed"
" at CryptoPro.Sharpei.UnsafeNativeMethods.CryptCreateHash(SafeProvHandleCP hProv, UInt32 Algid, SafeKeyHandleCP hKey, UInt32 dwFlags, SafeHashHandleCP& phHash)\r\n at CryptoPro.Sharpei.COMCryptography.CreateHash(SafeProvHandleCP hProv, Int32 algid, SafeHashHandleCP& hHash)\r\n at CryptoPro.Sharpei.COMCryptography.SetupHashAlgorithm(SafeProvHandleCP prov, Byte[] rgbHash)\r\n at CryptoPro.Sharpei.COMCryptography.SignValue(SafeProvHandleCP hProv, Int32 keyNumber, Byte[] rgbHash, Int32 dwFlags)\r\n at CryptoPro.Sharpei.Gost3410CryptoServiceProvider.SignHash(Byte[] hash)\r\n at CryptoPro.Sharpei.Gost3410CryptoServiceProvider.CreateSignature(Byte[] hash)\r\n at CryptoPro.Sharpei.GostSignatureFormatter.CreateSignature(Byte[] rgbHash)\r\n at System.Security.Cryptography.AsymmetricSignatureFormatter.CreateSignature(HashAlgorithm hash)\r\n at System.Security.Cryptography.Xml.SignedXml.ComputeSignature()\r\n at CryptoPro.Sharpei.Xml.CPSignedXml.ComputeSignature()\r\n at IT.Fsfr.Libraries.Crypt.Signer.SignXmlDocument(XmlDocument Document, AsymmetricAlgorithm Key, X509Certificate MSCert) in C:\\FSFR\\Main\\Source\\Libraries\\Crypt\\Signer.cs:line 196\r\n at IT.Fsfr.Basic.ObjectComponents.Objects.Library.WorkspaceController.onSelectionDialog_CertSelected(X509Certificate2 cert) in C:\\FSFR\\Main\\Source\\Basic\\Source\\Modules\\ObjectComponents\\Objects\\Objects.Library\\WorkspaceController.cs:line 280\r\n at Crypt.Library.UI.CertSelectionDialog.certList_DoubleClick(Object sender, EventArgs e) in C:\\FSFR\\Main\\Source\\Basic\\Source\\Modules\\Common\\Crypt\\Crypt.Library\\UI\\CertSelectionDialog.cs:line 61\r\n at System.Windows.Forms.Control.OnDoubleClick(EventArgs e)\r\n at DevExpress.XtraTreeList.TreeList.OnDoubleClick(EventArgs e)\r\n at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)\r\n at System.Windows.Forms.Control.WndProc(Message& m)\r\n at DevExpress.XtraEditors.Container.EditorContainer.WndProc(Message& m)\r\n at DevExpress.XtraTreeList.TreeList.WndProc(Message& m)\r\n at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)\r\n at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)\r\n at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)\r\n at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)\r\n at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)\r\n at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)\r\n at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)\r\n at System.Windows.Forms.Application.RunDialog(Form form)\r\n at System.Windows.Forms.Form.ShowDialog(IWin32Window owner)\r\n at CABDevExpress.Workspaces.XtraWindowWorkspace.ShowForm(Form form, XtraWindowSmartPartInfo smartPartInfo) in c:\\FSFR\\Main\\Source\\SCSF\\CAB\\CABDevExpress.ExtensionKit\\Workspaces\\XtraWindowWorkspace.cs:line 159\r\n at CABDevExpress.Workspaces.XtraWindowWorkspace.OnShow(Control smartPart, XtraWindowSmartPartInfo smartPartInfo) in c:\\FSFR\\Main\\Source\\SCSF\\CAB\\CABDevExpress.ExtensionKit\\Workspaces\\XtraWindowWorkspace.cs:line 310\r\n at Microsoft.Practices.CompositeUI.SmartParts.Workspace`2.Show(Object smartPart, ISmartPartInfo smartPartInfo) in C:\\FSFR\\Main\\Source\\SCSF\\CAB\\CompositeUI\\SmartParts\\Workspace.cs:line 188\r\n at IT.Fsfr.Basic.ObjectComponents.Objects.Library.WorkspaceController.OnObjectEditorView_DocumentExtracted(List`1 incomingDocuments) in C:\\FSFR\\Main\\Source\\Basic\\Source\\Modules\\ObjectComponents\\Objects\\Objects.Library\\WorkspaceController.cs:line 266\r\n at IT.Fsfr.Basic.ObjectComponents.Objects.Library.UI.ObjectEditorView.OnDocumentExtracted(List`1 incomingDocuments) in C:\\FSFR\\Main\\Source\\Basic\\Source\\Modules\\ObjectComponents\\Objects\\Objects.Library\\UI\\ObjectEditorView.cs:line 80\r\n at IT.Fsfr.Basic.ObjectComponents.Objects.Library.UI.ContentView.OnSignButton_Click(Object sender, EventArgs e) in C:\\FSFR\\Main\\Source\\Basic\\Source\\Modules\\ObjectComponents\\Objects\\Objects.Library\\UI\\ContentView.cs:line 87\r\n at System.Windows.Forms.Control.OnClick(EventArgs e)\r\n at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)\r\n at System.Windows.Forms.Control.WndProc(Message& m)\r\n at System.Windows.Forms.Label.WndProc(Message& m)\r\n at System.Windows.Forms.LinkLabel.WndProc(Message& msg)\r\n at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)\r\n at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)\r\n at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)\r\n at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)\r\n at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)\r\n at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)\r\n at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)\r\n at System.Windows.Forms.Application.Run(Form mainForm)\r\n at CABDevExpress.XtraFormApplication`2.Start() in c:\\FSFR\\Main\\Source\\SCSF\\CAB\\CABDevExpress.ExtensionKit\\XtraFormApplication.cs:line 20\r\n at Microsoft.Practices.CompositeUI.CabApplication`1.Run() in C:\\FSFR\\Main\\Source\\SCSF\\CAB\\CompositeUI\\CabApplication.cs:line 81\r\n at IT.Fsfr.Libraries.Widgets.CustomControls.ProcessSplashFormApplication`2.SplashRun(Image splashImage, String splashText) in C:\\FSFR\\Main\\Source\\Libraries\\Widgets\\CustomControls\\ProcessSplashFormApplication.cs:line 33\r\n at IT.Fsfr.Basic.Infrastructure.Shell.ShellApplication.RunInDebugMode(String title) in C:\\FSFR\\Main\\Source\\Basic\\Source\\Infrastructure\\Shell\\ShellApplication.cs:line 155\r\n at IT.Fsfr.Basic.Infrastructure.Shell.ShellApplication.Main(String[] arguments) in C:\\FSFR\\Main\\Source\\Basic\\Source\\Infrastructure\\Shell\\ShellApplication.cs:line 71\r\n at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)\r\n at System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)\r\n at System.Runtime.Hosting.ManifestRunner.Run(Boolean checkAptModel)\r\n at System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly()\r\n at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String[] activationCustomData)\r\n at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext)\r\n at System.Activator.CreateInstance(ActivationContext activationContext)\r\n at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone()\r\n at System.Threading.ThreadHelper.ThreadStart_Context(Object state)\r\n at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)\r\n at System.Threading.ThreadHelper.ThreadStart()"


смутно предполагаю что это происходит по причине некеширования пароля.
Вопрос - почему не появляется окошко с запросом пароля если нет кеширования ??

WinXP , net 3.5 , КриптоПро 3.6 KC2 с биологическим ДСЧ
Offline Челпанов А.  
#2 Оставлено : 18 июня 2009 г. 20:21:14(UTC)
Челпанов А.

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

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

Поблагодарили: 2 раз в 2 постах
По стеку, очень похоже, что Вы закрыли провайдер, на котором происходит хеширование документа, с кешированием пароля скорее всего не связано.
Попробовал поставить в пример SignDocument повторный вызов SignXmlFile - ошибок нет.
Посмотрите как используется signedXml.SigningKey, может using не так стоит? Или просто явно закрываете?
Версия Sharpei последняя?
Если есть возможность получить ошибку на примере SignDocument пришлите код пожалуйста.

P.S. Окошко запроса пароля не появляется, если контейнер уже открыт и в нем уже есть пароль.
С уважением, Александр.
Offline Randoom  
#3 Оставлено : 18 июня 2009 г. 20:29:51(UTC)
Randoom

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

Группы: Участники
Зарегистрирован: 15.06.2009(UTC)
Сообщений: 89
Откуда: Уфа, РРЦ "АйТи"

Челпанов А. написал:
По стеку, очень похоже, что Вы закрыли провайдер, на котором происходит хеширование документа, с кешированием пароля скорее всего не связано.
Попробовал поставить в пример SignDocument повторный вызов SignXmlFile - ошибок нет.
Посмотрите как используется signedXml.SigningKey, может using не так стоит? Или просто явно закрываете?
Версия Sharpei последняя?
Если есть возможность получить ошибку на примере SignDocument пришлите код пожалуйста.

P.S. Окошко запроса пароля не появляется, если контейнер уже открыт и в нем уже есть пароль.


Спасибо за подсказки и уверенность в утверждении (P.s.) значит проблема на моей стороне, буду искать.
Offline Randoom  
#4 Оставлено : 19 июня 2009 г. 13:01:12(UTC)
Randoom

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

Группы: Участники
Зарегистрирован: 15.06.2009(UTC)
Сообщений: 89
Откуда: Уфа, РРЦ "АйТи"

Вообщем не помогла уверенность.
Шарпей последний стоит.

код :

public static XmlDocument SignXmlDocument(XmlDocument Document,
AsymmetricAlgorithm Key,
X509Certificate MSCert)
{
// Создаем новый XML документ.
XmlDocument doc = Document;

// Форматируем документ с игнорированием пробельных символов.
doc.PreserveWhitespace = false;


// Создаем объект SignedXml по XML документу.
SignedXml signedXml = new SignedXml(doc);

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

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

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

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

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

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

// Создаем объект KeyInfo.
KeyInfo keyInfo = new KeyInfo();

// Добавляем сертификат в KeyInfo
keyInfo.AddClause(new KeyInfoX509Data(MSCert));

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

// Вычисляем подпись.
signedXml.ComputeSignature(); ---------------------------- Падает здесь на 2-й проход и далее

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

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

// При наличии стартовой XML декларации ее удаляем
// (во избежание повторного сохранения)
if (doc.FirstChild is XmlDeclaration)
{
doc.RemoveChild(doc.FirstChild);
}

return doc;
}


вызов :

private void onSelectionDialog_CertSelected(X509Certificate2 cert)
{
using (AsymmetricAlgorithm Key =
cert.PrivateKey)
{
foreach (var document in curIncomingDocuments)
{

// Подписываем файл и сохраняем его в другом файле.
XmlDocument doc = new XmlDocument();
doc.LoadXml(document.Document.Root.ToString());
XmlDocument signedDoc = Signer.SignXmlDocument(doc, Key, cert);
}
}
}


"По стеку, очень похоже, что Вы закрыли провайдер" - имеется ввиду инстанция X509Store? Она все еще жива на момент выполнения кода. Равно как и AsymmetricAlgorithm Key...

Некоторые уточнения по ситуации :
Падает не обязательно на второй раз, а после некоторого времени бездействия с момента первого подписания.
Вообщем непонятно пока куда копать

Отредактировано пользователем 19 июня 2009 г. 13:37:03(UTC)  | Причина: Не указана

Offline Челпанов А.  
#5 Оставлено : 19 июня 2009 г. 20:00:15(UTC)
Челпанов А.

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

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

Поблагодарили: 2 раз в 2 постах
Ошибку повторили.
В чем проблема пока не разобрались.
Как временная мера убрать из onSelectionDialog_CertSelected using - не закрывать Key
С уважением, Александр.
Offline Челпанов А.  
#6 Оставлено : 19 июня 2009 г. 20:20:49(UTC)
Челпанов А.

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

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

Поблагодарили: 2 раз в 2 постах
А проблема именно в этом... :)
Вы освобождаете ключ, который открыт по связке от сертификата, и при втором вызове
Цитата:
AsymmetricAlgorithm Key = cert.PrivateKey
возвращает тот же объект, что и при первом, но уже освобожденный.
Так, что предлодженная Выше "временная" мера - постоянное решение.
С уважением, Александр.
Offline Randoom  
#7 Оставлено : 19 июня 2009 г. 20:31:15(UTC)
Randoom

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

Группы: Участники
Зарегистрирован: 15.06.2009(UTC)
Сообщений: 89
Откуда: Уфа, РРЦ "АйТи"

Челпанов А. написал:
А проблема именно в этом... :)
Вы освобождаете ключ, который открыт по связке от сертификата, и при втором вызове
Цитата:
AsymmetricAlgorithm Key = cert.PrivateKey
возвращает тот же объект, что и при первом, но уже освобожденный.
Так, что предлодженная Выше "временная" мера - постоянное решение.

К сожалению не совсем понял Вас.
Что подразумевается под освобождением ключа и где это происходит в данном примере?
Offline Челпанов А.  
#8 Оставлено : 19 июня 2009 г. 20:47:01(UTC)
Челпанов А.

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

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

Поблагодарили: 2 раз в 2 постах
Если не углубляться, то using(AsymmetricAlgorithm Key = cert.PrivateKey) {...} освобождает неуправляемые ресурсы сертификата.

Если углубляться в подробности происходящего, то код
Цитата:
private void onSelectionDialog_CertSelected(X509Certificate2 cert)
{
using (AsymmetricAlgorithm Key = cert.PrivateKey) // строка 3
{
....
} // строка 6
означает примерно следующее (что с нашим провайдером, что с Rsa, разницы никакой):
1. (строка 3) При первом вызове достать из сертификата привязку на секретный ключ, получить HANDLE (native) секретного ключа (HCRYPTPROV) создать объект соответствующего провайдера и заполнить в объекте сертификата (X509Certificate2) привязку на секретный ключ. Вернуть в качестве значения cert.PrivateKey объект секретного ключа.
2. (строка 6). Освободить управляемые ресурсы занятые объектом Key. То есть закрыть HANDLE (native) секретного ключа (HCRYPTPROV).
3. (строка 3) При повторном вызове вернуть уже существующий объект секретного ключа (AsymmetricAlgorithm), но уже с освобожденными native ресурсами, то есть с закрытым HCRYPTPROV.
С уважением, Александр.
Offline Randoom  
#9 Оставлено : 19 июня 2009 г. 21:03:23(UTC)
Randoom

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

Группы: Участники
Зарегистрирован: 15.06.2009(UTC)
Сообщений: 89
Откуда: Уфа, РРЦ "АйТи"

Челпанов А. написал:
Если не углубляться, то using(AsymmetricAlgorithm Key = cert.PrivateKey) {...} освобождает неуправляемые ресурсы сертификата.

Если углубляться в подробности происходящего, то код
Цитата:
private void onSelectionDialog_CertSelected(X509Certificate2 cert)
{
using (AsymmetricAlgorithm Key = cert.PrivateKey) // строка 3
{
....
} // строка 6
означает примерно следующее (что с нашим провайдером, что с Rsa, разницы никакой):
1. (строка 3) При первом вызове достать из сертификата привязку на секретный ключ, получить HANDLE (native) секретного ключа (HCRYPTPROV) создать объект соответствующего провайдера и заполнить в объекте сертификата (X509Certificate2) привязку на секретный ключ. Вернуть в качестве значения cert.PrivateKey объект секретного ключа.
2. (строка 6). Освободить управляемые ресурсы занятые объектом Key. То есть закрыть HANDLE (native) секретного ключа (HCRYPTPROV).
3. (строка 3) При повторном вызове вернуть уже существующий объект секретного ключа (AsymmetricAlgorithm), но уже с освобожденными native ресурсами, то есть с закрытым HCRYPTPROV.


Так (, давайте еще раз с начала.
Я так понял что у Вас случилась аналогичная ошибка именно на присланном коде - так ведь? (т.е. ошибка именно в нем, а не в каких то других модулях.. или, скажем множественном его вызове...)
В данном коде using распространяется на все, и foreach бегает внутри него. Т.е. строка 3 отрабатывает только один раз... так ведь?
В чем тогда разница using и использования переменной с ключем на верху? или я что то неправильно понял?
Offline Челпанов А.  
#10 Оставлено : 19 июня 2009 г. 21:22:48(UTC)
Челпанов А.

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

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

Поблагодарили: 2 раз в 2 постах
Нет. Пробовал на другом коде. Возникла точно такая же ошибка, но при втором вызове функции onSelectionDialog_CertSelected, а не на втором документе. При вызове на двух документах при первом проходе, ошибку повторить не удается.
С уважением, Александр.
Offline Randoom  
#11 Оставлено : 20 июня 2009 г. 12:21:53(UTC)
Randoom

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

Группы: Участники
Зарегистрирован: 15.06.2009(UTC)
Сообщений: 89
Откуда: Уфа, РРЦ "АйТи"

Челпанов А. написал:
Нет. Пробовал на другом коде. Возникла точно такая же ошибка, но при втором вызове функции onSelectionDialog_CertSelected, а не на втором документе. При вызове на двух документах при первом проходе, ошибку повторить не удается.

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