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

Уведомление

Icon
Error

3 Страницы123>
Опции
К последнему сообщению К первому непрочитанному
Offline Elijah  
#1 Оставлено : 19 октября 2012 г. 3:02:11(UTC)
Elijah

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

Группы: Участники
Зарегистрирован: 11.09.2011(UTC)
Сообщений: 37

Доброе время суток. Есть скрипт, который подписывает XML-ку средствами CAPICOM в браузере IE (подписывает, используя CryptoPro, закрытым ключом из контейнера). Задача воспроизвести этот код на С#. Код благодаря интеграции COM в C# почти копируется (минимум изменений), но вот подписанные XML-ки отличаются. XML, подписанная JS имеет 2 сертификата (подписавшего и, как я понял, ответсвенного лица, выдавшего ключ), а подписанный C# имеет только один сертификат (подписавшего). Подскажите куда копать.
Offline Андрей Писарев  
#2 Оставлено : 19 октября 2012 г. 3:31:00(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,752
Мужчина
Российская Федерация

Сказал «Спасибо»: 577 раз
Поблагодарили: 2307 раз в 1807 постах
Elijah написал:
Доброе время суток. Есть скрипт, который подписывает XML-ку средствами CAPICOM в браузере IE (подписывает, используя CryptoPro, закрытым ключом из контейнера). Задача воспроизвести этот код на С#. Код благодаря интеграции COM в C# почти копируется (минимум изменений), но вот подписанные XML-ки отличаются. XML, подписанная JS имеет 2 сертификата (подписавшего и, как я понял, ответсвенного лица, выдавшего ключ), а подписанный C# имеет только один сертификат (подписавшего). Подскажите куда копать.


Копать в сторону указания правильного флага - включить всю цепочку сертификации, а не только сертификат автора.
В таких случаях обычно прикладывают участок инициализации объектов, атрибутов и создание подписи, но я просить не буду.
Остается только гадать, что было указано в C#


Цитата:

подписанные XML-ки отличаются. XML, подписанная JS имеет 2 сертификата (подписавшего и, как я понял, ответсвенного лица, выдавшего ключ), а подписанный C# имеет только один сертификат (подписавшего).

msdn написал:

http://msdn.microsoft.co...p/aa387751(v=vs.85).aspx
The default value is CAPICOM_CERTIFICATE_INCLUDE_CHAIN_EXCEPT_ROOT


Use CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN Anxious

CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN = 1





http://cpdn.cryptopro.ru...example_CapicomSign.html
Хотя в примерах КриптоПРО (точнее в SDK MS Capicom)
Dim IncludeOption : IncludeOption = CAPICOM_CERTIFICATE_INCLUDE_CHAIN_EXCEPT_ROOT - не включать корневой...


Отредактировано пользователем 19 октября 2012 г. 4:07:21(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Elijah  
#3 Оставлено : 19 октября 2012 г. 13:32:12(UTC)
Elijah

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

Группы: Участники
Зарегистрирован: 11.09.2011(UTC)
Сообщений: 37

Андрей * написал:
Elijah написал:
Доброе время суток. Есть скрипт, который подписывает XML-ку средствами CAPICOM в браузере IE (подписывает, используя CryptoPro, закрытым ключом из контейнера). Задача воспроизвести этот код на С#. Код благодаря интеграции COM в C# почти копируется (минимум изменений), но вот подписанные XML-ки отличаются. XML, подписанная JS имеет 2 сертификата (подписавшего и, как я понял, ответсвенного лица, выдавшего ключ), а подписанный C# имеет только один сертификат (подписавшего). Подскажите куда копать.


Копать в сторону указания правильного флага - включить всю цепочку сертификации, а не только сертификат автора.
В таких случаях обычно прикладывают участок инициализации объектов, атрибутов и создание подписи, но я просить не буду.
Остается только гадать, что было указано в C#


Цитата:

подписанные XML-ки отличаются. XML, подписанная JS имеет 2 сертификата (подписавшего и, как я понял, ответсвенного лица, выдавшего ключ), а подписанный C# имеет только один сертификат (подписавшего).

msdn написал:

http://msdn.microsoft.co...p/aa387751(v=vs.85).aspx
The default value is CAPICOM_CERTIFICATE_INCLUDE_CHAIN_EXCEPT_ROOT


Use CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN Anxious

CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN = 1





http://cpdn.cryptopro.ru...example_CapicomSign.html
Хотя в примерах КриптоПРО (точнее в SDK MS Capicom)
Dim IncludeOption : IncludeOption = CAPICOM_CERTIFICATE_INCLUDE_CHAIN_EXCEPT_ROOT - не включать корневой...




Андрей, спасибо большое. Вопрос был больше общий, потому что я еще не глубоко в теме.


Дело в том, что явно этот параметр нигде не инициализируется. Привожу частично код JS:


Код:


  xmldoc = new ActiveXObject("MSXML2.DOMDocument.5.0");
  xmldoce = new ActiveXObject("MSXML2.DOMDocument.5.0");
  xmldsig = new ActiveXObject("Msxml2.MXDigitalSignature.5.0");

  oStore = new ActiveXObject("CAPICOM.Store.2");
  oCerts = new ActiveXObject("CAPICOM.Certificates");
  oSigner = new ActiveXObject("CAPICOM.Signer");


  xmldoc.loadXML(document.getElementById('AAAD').value);
  xmldoce.async = false;
  xmldoce.validateOnParse = false;
  xmldoce.preserveWhiteSpace = false;
  xmldoce.resolveExternals = false;
  xmldoce.loadXML("..."); //тут у нас XML-ка

  elmToWrap = xmldoc.documentElement.cloneNode(true);
  elmWhereTo = xmldoce.selectSingleNode("//*[@Id='" + dsigObjectId +"']");
  elmWhereTo.appendChild(elmToWrap);
  xmldoc = xmldoce;
  xmldoce = null;


   oStore.Open(STORE_LOCATION, STORE_NAME, 128);
    oCerts = oStore.Certificates;
    if (oCerts.Count == 0)
    {
      alert("нет сертификатов");
      return null;
    }
    oSelectedCerts = oCerts.Select();
    oSignerCert = oSelectedCerts(1);

  xmldsig.signature = xmldoc.selectSingleNode("//*[count(ancestor::*)=0]");

  pKey = xmldsig.createKeyFromCSP(oSignerCert.PrivateKey.ProviderType, oSignerCert.PrivateKey.ProviderName, oSignerCert.PrivateKey.ContainerName, 0);

  pKeyOut = xmldsig.sign(pKey, 2);





На C# это выглядит почти так же. Но, видимо, где-то есть неявное различие.

Код:


static CAPICOM.Certificate getCert() 
        {
            CAPICOM.Store oStore = new CAPICOM.StoreClass();
	        CAPICOM.Signer oSigner = new CAPICOM.SignerClass();

            oStore.Open(CAPICOM.CAPICOM_STORE_LOCATION.CAPICOM_CURRENT_USER_STORE, "My", CAPICOM.CAPICOM_STORE_OPEN_MODE.CAPICOM_STORE_OPEN_EXISTING_ONLY);
            foreach(CAPICOM.Certificate c in oStore.Certificates) {
                return c;
            }
            return null;
        }




                            MSXML2.DOMDocument50 xmldoc = new MSXML2.DOMDocument50Class();
                            MSXML2.DOMDocument50 xmldoce = new MSXML2.DOMDocument50Class();
                            MSXML2.MXDigitalSignature50 xmldsig = new MSXML2.MXDigitalSignature50Class();

                            xmldoc.loadXML(xml);

                            demand = xml;

                            //xmldsig = new ActiveXObject("Msxml2.MXDigitalSignature.5.0");

                            string dsigObjectId = "AAAAA";

                            //Конверт
                            xmldoce.async = false;
                            xmldoce.validateOnParse = false;
                            xmldoce.preserveWhiteSpace = false;
                            xmldoce.resolveExternals = false;
                            xmldoce.loadXML("...'"); //так же XML-ка, что и в JS 1 к 1

                            //Размещение текста в конверт
                            MSXML2.IXMLDOMNode elmToWrap = xmldoc.documentElement.cloneNode(true);
                            MSXML2.IXMLDOMNode elmWhereTo = xmldoce.selectSingleNode("//*[@Id='" + dsigObjectId + "']");
                            elmWhereTo.appendChild(elmToWrap);
                            xmldoc = xmldoce;
                            xmldoce = null;

                            CAPICOM.Certificate cert = getCert(); // в-ция выше

                            xmldsig.signature = xmldoc.selectSingleNode("//*[count(ancestor::*)=0]");

                            MSXML2.IXMLDSigKey key = xmldsig.createKeyFromCSP((int)cert.PrivateKey.ProviderType, cert.PrivateKey.ProviderName, cert.PrivateKey.ContainerName, 0);
                            MSXML2.IXMLDSigKey keyOut =  xmldsig.sign(key, MSXML2.XMLDSIG_WRITEKEYINFO.CERTIFICATES);




В данном случае подписывает MXDigitalSignature50. Как ему сообщить этот параметр?
Offline Андрей Писарев  
#4 Оставлено : 19 октября 2012 г. 13:36:59(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,752
Мужчина
Российская Федерация

Сказал «Спасибо»: 577 раз
Поблагодарили: 2307 раз в 1807 постах
Elijah,
Вы тему как назвали? Причем здесь Capicom? Только для выбора сертификата и инициализации MXDigitalSignature

Цитата:
В данном случае подписывает MXDigitalSignature50. Как ему сообщить этот параметр?

С этого нужно было начинать...

Отредактировано пользователем 19 октября 2012 г. 13:41:29(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Elijah  
#5 Оставлено : 19 октября 2012 г. 13:43:30(UTC)
Elijah

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

Группы: Участники
Зарегистрирован: 11.09.2011(UTC)
Сообщений: 37

Андрей * написал:
Elijah,
Вы тему как назвали? Причем здесь Capicom?


Потому что в оригинале (JS-скрипт) используется CAPICOM для подписывания документа. Воспроизводить этот алгоритм я так же стал средствами CAPICOM ActiveX. В чем я не прав? Не понимаю? А вопрос в том, что одинаковый почти алгоритм в разных средствах дает разный результат.
Offline Андрей Писарев  
#6 Оставлено : 19 октября 2012 г. 13:47:52(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,752
Мужчина
Российская Федерация

Сказал «Спасибо»: 577 раз
Поблагодарили: 2307 раз в 1807 постах
Elijah написал:
Андрей * написал:
Elijah,
Вы тему как назвали? Причем здесь Capicom?


Потому что в оригинале (JS-скрипт) используется CAPICOM для подписывания документа. Воспроизводить этот алгоритм я так же стал средствами CAPICOM ActiveX. В чем я не прав? Не понимаю? А вопрос в том, что одинаковый почти алгоритм в разных средствах дает разный результат.



Покажите, где используется метод Capicom для создания подписи в коде JS...
Я вижу только использование для создания ЭЦП - MXDigitalSignature50

Отредактировано пользователем 19 октября 2012 г. 13:49:16(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Elijah  
#7 Оставлено : 19 октября 2012 г. 13:49:16(UTC)
Elijah

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

Группы: Участники
Зарегистрирован: 11.09.2011(UTC)
Сообщений: 37

Андрей * написал:
Elijah написал:
Андрей * написал:
Elijah,
Вы тему как назвали? Причем здесь Capicom?


Потому что в оригинале (JS-скрипт) используется CAPICOM для подписывания документа. Воспроизводить этот алгоритм я так же стал средствами CAPICOM ActiveX. В чем я не прав? Не понимаю? А вопрос в том, что одинаковый почти алгоритм в разных средствах дает разный результат.



Покажите, где используется метод Capicom для создания подписи в выше приведенном коде...
Я вижу только использование для создания ЭЦП - MXDigitalSignature50


Значит я заблуждаюсь. Спасибо за разъяснения. А по вопросу передачи параметра MXDigitalSignature50?
Offline Андрей Писарев  
#8 Оставлено : 19 октября 2012 г. 13:52:10(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,752
Мужчина
Российская Федерация

Сказал «Спасибо»: 577 раз
Поблагодарили: 2307 раз в 1807 постах
Внимательно в коде:
на JS
Цитата:

oStore.Open(STORE_LOCATION, STORE_NAME, 128);
oCerts = oStore.Certificates;
if (oCerts.Count == 0)
{
alert("нет сертификатов");
return null;
}
oSelectedCerts = oCerts.Select();
oSignerCert = oSelectedCerts(1);




на C#
Цитата:

static CAPICOM.Certificate getCert()
{
CAPICOM.Store oStore = new CAPICOM.StoreClass();
CAPICOM.Signer oSigner = new CAPICOM.SignerClass();

oStore.Open(CAPICOM.CAPICOM_STORE_LOCATION.CAPICOM_CURRENT_USER_STORE, "My", CAPICOM.CAPICOM_STORE_OPEN_MODE.CAPICOM_STORE_OPEN_EXISTING_ONLY);
foreach(CAPICOM.Certificate c in oStore.Certificates) {
return c;

}
return null;
}



Этот "код" подразумевает, что в личном хранилище: 1 сертификат?

А если переписать в C#- выбор сертификата?

Отредактировано пользователем 19 октября 2012 г. 13:54:14(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Elijah  
#9 Оставлено : 19 октября 2012 г. 14:00:34(UTC)
Elijah

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

Группы: Участники
Зарегистрирован: 11.09.2011(UTC)
Сообщений: 37

Андрей * написал:
Внимательно в коде:
на JS
Цитата:

oStore.Open(STORE_LOCATION, STORE_NAME, 128);
oCerts = oStore.Certificates;
if (oCerts.Count == 0)
{
alert("нет сертификатов");
return null;
}
oSelectedCerts = oCerts.Select();
oSignerCert = oSelectedCerts(1);




на C#
Цитата:

static CAPICOM.Certificate getCert()
{
CAPICOM.Store oStore = new CAPICOM.StoreClass();
CAPICOM.Signer oSigner = new CAPICOM.SignerClass();

oStore.Open(CAPICOM.CAPICOM_STORE_LOCATION.CAPICOM_CURRENT_USER_STORE, "My", CAPICOM.CAPICOM_STORE_OPEN_MODE.CAPICOM_STORE_OPEN_EXISTING_ONLY);
foreach(CAPICOM.Certificate c in oStore.Certificates) {
return c;

}
return null;
}



Этот "код" подразумевает, что в личном хранилище: 1 сертификат?

А если переписать в C#- выбор сертификата?


В дебагере видно, что он там всего 1 (VS). В браузере (в диалоге) так же один выбирается. Выбор переписать нельзя, т.к. сертифика должен выбираться автоматически. Я вверху указал, что слабо разбираюсь в вопросе, поэтому и прошу помощи специалистов.
Offline Elijah  
#10 Оставлено : 19 октября 2012 г. 14:20:31(UTC)
Elijah

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

Группы: Участники
Зарегистрирован: 11.09.2011(UTC)
Сообщений: 37

Подписывание в браузере и воспроизведенной программой на C#делает на одном и том же компьютере. Но вот JS каким-то чудным (для меня) образом подхватывает рут сертификат, а C#-код - нет.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
3 Страницы123>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.