Статус: Новичок
Группы: Участники
Зарегистрирован: 15.11.2012(UTC) Сообщений: 5
|
Таким образом подписываю документ. Код:const string dsigObjectId = "TS_SO_Zayavka_polzovatelya";
var wtf = new XmlDocument();
wtf.PreserveWhitespace = false;
wtf.LoadXml(
@"<ds:Signature xmlns:ds='http://www.w3.org/2000/09/xmldsig#'>
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm='http://www.w3.org/TR/2001/REC-xml-c14n-20010315'/>
<ds:SignatureMethod Algorithm='http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411'/>
<ds:Reference URI='#" + dsigObjectId + @"' Type='http://www.w3.org/2000/09/xmldsig#;Object'>
<ds:DigestMethod Algorithm='http://www.w3.org/2001/04/xmldsig-more#gostr3411'/>
<ds:DigestValue/>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue/>
<ds:Object Id='" + dsigObjectId + @"' MimeType='text/plain'>" + doc + @"</ds:Object>
<ds:KeyInfo>
<X509Data>
<X509Certificate>" +
Convert.ToBase64String(cert.RawData) +
@"</X509Certificate>
</X509Data>
</ds:KeyInfo>
</ds:Signature>"
);
var signed = new SignedXml(wtf) { SigningKey = cert.PrivateKey };
var referen = new Reference { Uri = "#"+dsigObjectId, DigestMethod = CPSignedXml.XmlDsigGost3411UrlObsolete };
signed.SignedInfo.SignatureMethod = CPSignedXml.XmlDsigGost3410UrlObsolete;
signed.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigC14NTransformUrl;
signed.AddReference(referen);
signed.ComputeSignature();
var sign = signed.GetXml();
((((sign)).OwnerDocument).ChildNodes[0].ChildNodes[1]).InnerText = Convert.ToBase64String(signed.SignatureValue);
((((sign)).OwnerDocument).ChildNodes[0]).ChildNodes[0].ChildNodes[2].ChildNodes[1].InnerText = Convert.ToBase64String((signed.SignedInfo.References[0] as Reference).DigestValue);
Далее, проверяю: Код:var res = VerifyXml(sign.OwnerDocument, cert);
public static Boolean VerifyXml(XmlDocument Doc, X509Certificate2 cert)
{
SignedXml signedXml = new SignedXml(Doc);
XmlNodeList nodeList = Doc.GetElementsByTagName("ds:Signature");
signedXml.LoadXml((XmlElement)nodeList[0]);
return signedXml.CheckSignature(cert.PrivateKey);
}
В результате всегда false. Что я делаю не так? Отредактировано пользователем 3 декабря 2012 г. 12:32:30(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 14.10.2011(UTC) Сообщений: 150  Поблагодарили: 33 раз в 32 постах
|
Здравствуйте! Вот этими строками Вы что пытаетесь сделать? Добавить вычисленное значение подписи в исходный документ? Код:((((sign)).OwnerDocument).ChildNodes[0].ChildNodes[1]).InnerText = Convert.ToBase64String(signed.SignatureValue);
((((sign)).OwnerDocument).ChildNodes[0]).ChildNodes[0].ChildNodes[2].ChildNodes[1].InnerText = Convert.ToBase64String((signed.SignedInfo.References[0] as Reference).DigestValue);
Если Вы хотите сохранить префиксы "ds:" в SignedInfo, то этот вопрос обсуждался, по-моему, здесь: http://www.cryptopro.ru/...posts&t=4420&p=3 |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 15.11.2012(UTC) Сообщений: 5
|
Добрый день. Переделал так как по ссылке. Код:const string dsigObjectId = "TS_SO_Zayavka_polzovatelya";
var signed = new SignedXmlPrefix{ SigningKey = cert.PrivateKey };
var referen = new Reference { Uri = "#TS_SO_Zayavka_polzovatelya", DigestMethod = CPSignedXml.XmlDsigGost3411UrlObsolete };
signed.SignedInfo.SignatureMethod = CPSignedXml.XmlDsigGost3410UrlObsolete;
signed.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigC14NTransformUrl;
signed.AddReference(referen);
signed.KeyInfo.AddClause(new KeyInfoX509Data(cert));
var data = new XmlDocument();
data.LoadXml(doc);
signed.AddObject(new System.Security.Cryptography.Xml.DataObject("TS_SO_Zayavka_polzovatelya", "text/plain", null, data.DocumentElement));
signed.ComputeSignature("ds");
var sign = signed.GetXml("ds");
var res = VerifyXml(sign, cert);
public static Boolean VerifyXml(XmlElement Doc, X509Certificate2 cert)
{
SignedXml signedXml = new SignedXml(Doc);
signedXml.LoadXml(Doc);
return signedXml.CheckSignature(cert.PrivateKey);
}
Всё осталось также. Отредактировано пользователем 3 декабря 2012 г. 14:42:33(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 14.10.2011(UTC) Сообщений: 150  Поблагодарили: 33 раз в 32 постах
|
Попробуйте заново не заполнять SignedXml Код:var signed = new SignedXmlPrefix(wtf) { SigningKey = cert.PrivateKey };
signed.LoadXml( (XmlElement) wtf.GetElementsByTagName("Signature", SignedXml.XmlDsigNamespaceUrl)[0]);
signed.ComputeSignature("ds");
XmlElement xmlDigitalSignature = signed.GetXml("ds");
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close