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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Ild  
#1 Оставлено : 29 ноября 2012 г. 18:27:01(UTC)
Ild

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

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

Offline Георгий Садофьев  
#2 Оставлено : 3 декабря 2012 г. 13:54:23(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
Техническую поддержку оказываем тут
Наша база знаний
Offline Ild  
#3 Оставлено : 3 декабря 2012 г. 14:41:08(UTC)
Ild

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

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

Offline Георгий Садофьев  
#4 Оставлено : 4 декабря 2012 г. 12:28:38(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");
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.