Вообщем не помогла уверенность.
Шарпей последний стоит.
код :
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)
| Причина: Не указана