Просьба помочь!!!
Требуется подписать ЭЦП небольшой soap. Формирую строку, на ее основе формирую XML документ, нахожу сертификат (пароль для сертификата запрашивается при вызове формы и опознается корректно), передаю документ и сертификат в SignedXml. Выисляю подпись, сразу же ее проверяю и получаю false. Где копать? По формированию подписи руководствовался:
http://msdn.microsoft.co...edxml%28v=vs.100%29.aspx String id = "315";
String soapS = "";
soapS += "<soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:ds='http://www.w3.org/2000/09/xmldsig#' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/' xmlns:nsi='http://nsi.asur.mos.ru/' xmlns:wsse='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' xmlns:wsu='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd'>";
soapS += "<soap:Body wsu:Id='body'>";
soapS += "<nsi:receive_changeResponse>";
soapS += "<nsi:receive_changeResult>OK:" + id + "</nsi:receive_changeResult>";
soapS += "</nsi:receive_changeResponse>";
soapS += "</soap:Body>";
soapS += "</soap:Envelope>";
// Создаем файл для подписывания, точнее подписывания его части
XmlDocument document = new XmlDocument();
//Пишем в файл созданную строку(xml)
document.LoadXml(soapS);
document.PreserveWhitespace = false;
// Создаем ссылку с указанием ноды для шифрования (не подписываем, так как подписываем запрос целиком)
Reference reference = new Reference();
reference.Uri = "#body";
reference.Uri = document.GetElementsByTagName("soap:Body").Item(0).BaseURI;
XmlDsigExcC14NTransform c14 = new XmlDsigExcC14NTransform();
reference.AddTransform(c14);
// Создаем экземляр подписываемого файла
SignedXml signedXml = new SignedXml(document);
//Добавляем ссылку на шифруемую часть
signedXml.AddReference(reference);
//Создаем экземпляр хранилища сертификатов и заполняем его из реестра LocalMachine
X509Store certStore = new X509Store(StoreLocation.LocalMachine);
certStore.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
Ручной выбор сертификата, для отладки
X509Certificate2Collection certs = X509Certificate2UI.SelectFromCollection(
certStore.Certificates,
"Выберите сертификат",
"Пожалуйста, выберите сертификат электронной подписи",
X509SelectionFlag.SingleSelection);
//Сертификат доступен - проверено
if (certs.Count == 0)
{
Console.WriteLine("Сертификат не выбран.");
return;
}
//Формируем информацию ключа
KeyInfo keyInfo = new KeyInfo();
keyInfo.AddClause(new KeyInfoX509Data(certs[0]));
signedXml.KeyInfo = keyInfo;
signedXml.SignedInfo.CanonicalizationMethod = c14.Algorithm;
// Явно проставляем алгоритм хеширования,
// по умолчанию SHA1
signedXml.SignedInfo.SignatureMethod = CryptoPro.Sharpei.Xml.CPSignedXml.XmlDsigGost3410Url;
//Передаем закрытый ключ в объект подписи
signedXml.SigningKey = certs[0].PrivateKey;
//Вычисляем подпись
signedXml.ComputeSignature();
//Вытаскиваем представление полученной подписи
XmlElement xmlDigitalSignature = signedXml.GetXml();
SignedXml signedXml_second = new SignedXml(xmlDigitalSignature);
////При проверке оба раза получаем false
bool flag = signedXml_second.CheckSignature();
flag = signedXml_second.CheckSignature(certs[0], true)