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

Уведомление

Icon
Error

3 Страницы123>
Опции
К последнему сообщению К первому непрочитанному
Offline GostyCtypto  
#1 Оставлено : 3 апреля 2013 г. 14:09:50(UTC)
GostyCtypto

Статус: Участник

Группы: Участники
Зарегистрирован: 01.04.2013(UTC)
Сообщений: 17
Мужчина
Российская Федерация
Откуда: ООО "ЦентрПрограммСистем"

Сказал «Спасибо»: 8 раз
Здравствуйте!
Не могу понять как сделать подписывание XML на JavaScript средствами "КриптоПро ЭЦП Browser plug-in"...
На c# было проще, введу наличия класса signedXml который и канонизировал XML и подписывал его.
А тут, в КриптоПро ЭЦП Browser plug-in, как я понял, такой возможности нет, ну или пока нет.

Согласно "Методические рекомендации по разработке электронных сервисов и применению ЭЦП при МЭВ" XML должна иметь примерно такую форму
Код:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 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" xmlns:ws="http://ws.unisoft/" xmlns:rev="http://smev.gosuslugi.ru/rev120315" xmlns:rq1="http://ws.unisoft/CPSSubsidPercent/Rq1" xmlns:inc="http://www.w3.org/2004/08/xop/include">
  <soapenv:Header>
    <wsse:Security soapenv:actor="http://smev.gosuslugi.ru/actors/smev">
      <wsse:BinarySecurityToken EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" wsu:Id="SenderCertificate"> ..... </wsse:BinarySecurityToken>
      <ds:Signature>
        <SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
          <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
          <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411" />
          <Reference URI="#body">
            <Transforms>
              <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
              <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
            </Transforms>
            <DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411" />
            <DigestValue> ..... </DigestValue>
          </Reference>
        </SignedInfo>
        <ds:SignatureValue> ..... </ds:SignatureValue>
        <ds:KeyInfo>
          <wsse:SecurityTokenReference>
            <wsse:Reference URI="#SenderCertificate" />
          </wsse:SecurityTokenReference>
        </ds:KeyInfo>
      </ds:Signature>
    </wsse:Security>
  </soapenv:Header>
  <soapenv:Body wsu:Id="body">
    <ws:async_getId_SendRequest_Tyrim_Pyrim>
      <rev:Message>
        <rev:Sender>
          <rev:Code> .... </rev:Code>
          <rev:Name> .... </rev:Name>
        </rev:Sender>
        <rev:Recipient>
          <rev:Code> .... </rev:Code>
          <rev:Name> .... </rev:Name>
        </rev:Recipient>
        <rev:Originator>
          <rev:Code> .... </rev:Code>
          <rev:Name> .... </rev:Name>
        </rev:Originator>
        <rev:ServiceName> .... </rev:ServiceName>
        <rev:TypeCode> .... </rev:TypeCode>
        <rev:Status> .... </rev:Status>
        <rev:Date> 2012-03-12T12:12:12Z </rev:Date>
        <rev:ExchangeType> .... </rev:ExchangeType>
        <rev:RequestIdRef />
        <rev:OriginRequestIdRef />
        <rev:ServiceCode />
        <rev:CaseNumber />
        <rev:TestMsg />
      </rev:Message>
      <rev:MessageData>
        <rev:AppData>
          <rq1:Документ ВерсияФормата="1.0" UIDЗапроса="00000000-0000-4000-y000-000000000000">
            ...
          </rq1:Документ>
        </rev:AppData>
        <rev:AppDocument>
          <rev:RequestCode>req_00000000-0000-4000-y000-000000000000</rev:RequestCode>
          <rev:BinaryData> ... </rev:BinaryData>
        </rev:AppDocument>
      </rev:MessageData>
    </ws:async_getId_SendRequest_Tyrim_Pyrim>
  </soapenv:Body>
</soapenv:Envelope>

По крайней мере в таком виде XML (подписанная C#, в результате чего она записывается в одну строку) проверка на ГосУслугах, что собственно и нужно...

Так вот, мне теперь нужно сформировать XML проходящею валидацию на ГосУслугах средствами JavaScript.
Делаю на основе soapclient.js.



Непонятно несколько моментов... В начале я их опишу парой слов, а потом скажу как я пытался разрешить эти моменты, к сожалению не особо успешно...
  1. Достаточно ли записать эту XML в строку (убрав пробелы между тегами и крайние пробелы в значения тегов) что бы она приобрела канонический вид (xml-exc-c14n) ?

  2. В методических рекомендациях о BinarySecurityToken сказано "Формат сертификата должен соответствовать спецификации X.509 и быть представленным в формате Base64"

  3. В методических рекомендациях сказано "К элементу <soapenv:Body> и его потомкам, включая атрибуты, применяется каноникализация http://www.w3.org/2001/10/xml-exc-c14n#, на основе результата рассчитывается хеш по алгоритму ГОСТ Р 34.11-94 и заносится в <ds:DigestValue> в формате Base64"

  4. В методических рекомендациях сказано "К элементу <ds:SignedInfo> и его потомкам, включая атрибуты, применяется каноникализация http://www.w3.org/2001/10/xml-exc-c14n#, на основе результата рассчитывается электронная подпись по алгоритму ГОСТ Р 34.11-2001 и заносится в <ds:SignatureValue> в формате Base64"



Я понял это так:
  1. Рассчитываю на основе примера "Создание и проверка подписи":
    Цитата:
    // certSubjectName - хеш ключа
    // dataToSign - записанный в строку тэг soapenv:Body вместо со всем содержимым
    //
    function SignCreate(certSubjectName, dataToSign, TSPaddr) {
    try {
    var oStore = ObjCreator("CAPICOM.store");
    oStore.Open();
    } catch (err) {
    alert('Не удалось создать CAPICOM.store: ' + GetErrorMessage(err));
    return;
    };
    var CAPICOM_CERTIFICATE_FIND_SHA1_HASH = 0;
    var oCerts = oStore.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SHA1_HASH, certSubjectName);
    if (oCerts.Count == 0) {
    alert("Сертификат не найден");
    return;
    };
    var oCert = oCerts.Item(1);
    try {
    var oSigner = ObjCreator("CAdESCOM.CPSigner");
    } catch (err) {
    alert('Не удалось создать CAdESCOM.CPSigner: ' + GetErrorMessage(err));
    return;
    };
    if (oSigner) {
    oSigner.Certificate = oCert;
    } else {
    alert("Не удалось создать CPSigner!");
    return;
    };
    var oSignedData = ObjCreator("CAdESCOM.CadesSignedData");
    try {
    if (dataToSign) {
    // Данные на подпись ввели
    oSignedData.Content = dataToSign;
    // Выбираем тип подписи
    if (TSPaddr === undefined) {
    oSigner.Options = CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN;
    try {
    var sSignedData = oSignedData.SignCades(oSigner, CADES_BES);
    } catch (e) {
    alert("Не удалось создать подпись из-за ошибки: " + GetErrorMessage(e));
    return;
    };
    } else {
    oSigner.TSAAddress = TSPaddr;
    try {
    var sSignedData = oSignedData.SignCades(oSigner, CADESCOM_CADES_DEFAULT);
    } catch (e) {
    alert("Не удалось создать подпись из-за ошибки: " + GetErrorMessage(e));
    return;
    };
    };
    };
    } catch (err) {
    alert("Не удалось создать подпись: " + GetErrorMessage(err));
    return;
    };
    oStore.Close();

    return sSignedData;
    }
    Полученный результат записываю сразу в BinarySecurityToken, так как он больше похож по виду на то что получается после подписывания в C#, хотя и все равно другой...

  2. DigestValue рассчитываю:
    Цитата:
    var HashedData = ObjCreator("CAdESCOM.HashedData");
    HashedData.Hash(<хеш ключа>, <записанный в строку тэг soapenv:Body вместо со всем содержимым, такая же как и для расчета BinarySecurityToken>);
    // Преобразую полученный кеш (HashedData.Value) как посоветовал Slavik17 в посте #327 (темы КриптоПро ЭЦП Browser plug-in)
    // Результат преобразования записываю в DigestValue


  3. Затем рассчитываю SignatureValue:
    Цитата:
    // Функции передаю хеш ключа, тот же что и SignCreate (из примера)
    // и записанный в строку тег SignedInfo со всем содержимым
    function GetSignatureValue(certSubjectName, dataToSign) {
    try {
    var oHashedData = ObjCreator("CAdESCOM.HashedData");
    oHashedData.Hash(dataToSign);
    } catch (err) {
    alert('Не удалось создать CAPICOM.HashedData: ' + GetErrorMessage(err));
    return;
    }
    try {
    var oStore = ObjCreator("CAPICOM.store");
    oStore.Open();
    } catch (err) {
    alert('Не удалось создать CAPICOM.store: ' + GetErrorMessage(err));
    return;
    };
    var CAPICOM_CERTIFICATE_FIND_SHA1_HASH = 0;
    var oCerts = oStore.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SHA1_HASH, certSubjectName);
    if (oCerts.Count == 0) {
    alert("Сертификат не найден");
    return;
    };
    var oCert = oCerts.Item(1);
    try {
    var oRawSignature = ObjCreator("CAdESCOM.RawSignature");
    } catch (err) {
    alert('Не удалось создать CAdESCOM.RawSignature: ' + GetErrorMessage(err));
    return;
    };
    if (oRawSignature) {
    return oRawSignature.SignHash(oHashedData, oCert);
    } else {
    alert("Не удалось создать RawSignature!");
    return;
    }
    }




На сновании того что у меня ни BinarySecurityToken, ни SignatureValue, ни даже DigestValue не совдают с теми что получились при подписывании через C#...
Так как в C# подписывание XML по сути скрыто в объекте SignedXml у меня возникли подозрения, что я все три эти значения, необходимые для подписи я получаю если и абсолютно не верно, то по крайней мере не совсем правильно...

В связи с этим прошу помощи у тех кто с этим разобрался, хотя бы частично...



PS Если данная информация уже где-то есть, то я её не нашел.
Особенно принимая во внимание что не все разделы справки открываются (некоторые страницы у меня открываются пустыми).
Да и примеров в справке уж очень мало.

Отредактировано пользователем 3 апреля 2013 г. 14:55:01(UTC)  | Причина: Завершение вопроса, после случайного сохранения не полностью набранного вопроса

Offline Новожилова Елена  
#2 Оставлено : 3 апреля 2013 г. 15:28:00(UTC)
Новожилова Елена

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

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
1.

Цитата:
DigestValue рассчитываю:
Цитата:
var HashedData = ObjCreator("CAdESCOM.HashedData");
HashedData.Hash(<хеш ключа>, <записанный в строку тэг soapenv:Body вместо со всем содержимым, такая же как и для расчета BinarySecurityToken>);
// Преобразую полученный кеш (HashedData.Value) как посоветовал Slavik17 в посте #327 (темы КриптоПро ЭЦП Browser plug-in)
// Результат преобразования записываю в DigestValue


Если свойство DataEncoding объекта HashedData не задано, то исходные данные перекодируются в USC2LE.

Попробуйте перекодировать
Цитата:
<записанный в строку тэг soapenv:Body вместо со всем содержимым, такая же как и для расчета BinarySecurityToken>

в BASE64, указать кодировку CADESCOM_BASE64_TO_BINARY и после этого передавать данные для хэширования.

Отредактировано пользователем 4 апреля 2013 г. 12:30:18(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил Новожилова Елена за этот пост.
GostyCtypto оставлено 04.04.2013(UTC)
Offline GostyCtypto  
#3 Оставлено : 3 апреля 2013 г. 16:47:30(UTC)
GostyCtypto

Статус: Участник

Группы: Участники
Зарегистрирован: 01.04.2013(UTC)
Сообщений: 17
Мужчина
Российская Федерация
Откуда: ООО &quot;ЦентрПрограммСистем&quot;

Сказал «Спасибо»: 8 раз
Беру следующий XML, считая что он имеет канонический вид (http://www.w3.org/2001/10/xml-exc-c14n#):
Код:
<soapenv:Body wsu:Id="body"><ws:async_getId_SendRequest_Tyrim_Pyrim><rev:Message><rev:Sender><rev:Code>CODE63544</rev:Code><rev:Name>ТутИмя</rev:Name></rev:Sender><rev:Recipient><rev:Code>CODE2</rev:Code><rev:Name>Тест</rev:Name></rev:Recipient><rev:Originator><rev:Code>CODE3</rev:Code><rev:Name>Тест</rev:Name></rev:Originator><rev:ServiceName>ТестВебСервис</rev:ServiceName><rev:TypeCode>GSRV</rev:TypeCode><rev:Status>REQUEST</rev:Status><rev:Date>2012-03-13T12:12:12Z</rev:Date><rev:ExchangeType>1</rev:ExchangeType><rev:RequestIdRef /><rev:OriginRequestIdRef /><rev:ServiceCode /><rev:CaseNumber /><rev:TestMsg /></rev:Message><rev:MessageData><rev:AppData><rq1:Документ ВерсияФормата="1.0" UIDЗапроса="4832bdef-bef7-459a-8397-dc28793f59d4"><РегНомер>1</РегНомер></rq1:Документ></rev:AppData><rev:AppDocument /></rev:MessageData></ws:async_getId_SendRequest_Tyrim_Pyrim></soapenv:Body></soapenv:Envelope>

Получаю:
Цитата:
HashedData.DataEncoding = CADESCOM_BASE64_TO_BINARY; // var CADESCOM_BASE64_TO_BINARY = 0x01;
HashedData.Hash( JSZipBase64.encode( <xml приведенная выше> ) );
HashedData.Value = "D84DAEE813FEEBFFA732A2DC4E02B3D5205A531E65DEDC4BD5FFFB77BDD4A670"

JSZipBase64.encode(HashedData.Value) = "RDg0REFFRTgxM0ZFRUJGRkE3MzJBMkRDNEUwMkIzRDUyMDVBNTMxRTY1REVEQzRCRDVGRkZCNzdCREQ0QTY3MA=="
Используя совет Slavik17 для HashedData.Value получаю: "w5hNwq7DqBPDvsOrw7/CpzLCosOcTgLCs8OVIFpTHmXDnsOcS8OVw7/Du3fCvcOUwqZw"

Без использования CADESCOM_BASE64_TO_BINARY (и кодирования входной XML в base64) получаю (в том же порядке):

"11980BB91BB1AE31C163FAD1BA76EF978BB3AF9322FB8C9AC0DCD629C7290432"
"MTE5ODBCQjkxQkIxQUUzMUMxNjNGQUQxQkE3NkVGOTc4QkIzQUY5MzIyRkI4QzlBQzBEQ0Q2MjlDNzI5MDQzMg=="
"EcKYC8K5G8Kxwq4xw4Fjw7rDkcK6dsOvwpfCi8Kzwq/CkyLDu8KMwprDgMOcw5Ypw4cpBDI="

В то время как после подписи через C# получается:
Цитата:
<DigestValue>gadSOZDxScn+4UO9VrgJ7hFP1LW1D1HzNVSMjX2hhe0=</DigestValue>


Если привожу XML к виду:
Цитата:
<soapenv:Body wsu:Id="body"><ws:async_getId_SendRequest_Tyrim_Pyrim><rev:Message><rev:Sender><rev:Code>CODE63544</rev:Code><rev:Name>ТутИмя</rev:Name></rev:Sender><rev:Recipient><rev:Code>CODE2</rev:Code><rev:Name>Тест</rev:Name></rev:Recipient><rev:Originator><rev:Code>CODE3</rev:Code><rev:Name>Тест</rev:Name></rev:Originator><rev:ServiceName>ТестВебСервис</rev:ServiceName><rev:TypeCode>GSRV</rev:TypeCode><rev:Status>REQUEST</rev:Status><rev:Date>2012-03-13T12:12:12Z</rev:Date><rev:ExchangeType>1</rev:ExchangeType><rev:RequestIdRef></rev:RequestIdRef><rev:OriginRequestIdRef></rev:OriginRequestIdRef><rev:ServiceCode></rev:ServiceCode><rev:CaseNumber></rev:CaseNumber><rev:TestMsg></rev:TestMsg></rev:Message><rev:MessageData><rev:AppData><rq1:Документ ВерсияФормата="1.0" UIDЗапроса="4832bdef-bef7-459a-8397-dc28793f59d4"><РегНомер>1</РегНомер></rq1:Документ></rev:AppData><rev:AppDocument></rev:AppDocument></rev:MessageData></ws:async_getId_SendRequest_Tyrim_Pyrim></soapenv:Body>
То получаю (два варианта в том же порядке):
Цитата:
"00702475DC0F493A61B40F1A1CF94EB065CC99FED36B8EF76A9AC720D0941F5B"
"MDA3MDI0NzVEQzBGNDkzQTYxQjQwRjFBMUNGOTRFQjA2NUNDOTlGRUQzNkI4RUY3NkE5QUM3MjBEMDk0MUY1Qg=="
"AHAkdcOcD0k6YcK0Dxocw7lOwrBlw4zCmcO+w5Nrwo7Dt2rCmsOHIMOQwpQfWw=="

"B447CE846F2499D9A2B5C4BE76624B841E9B2C31622EBE6EAFDB25EEB2625461"
"QjQ0N0NFODQ2RjI0OTlEOUEyQjVDNEJFNzY2MjRCODQxRTlCMkMzMTYyMkVCRTZFQUZEQjI1RUVCMjYyNTQ2MQ=="
"wrRHw47ChG8kwpnDmcKiwrXDhMK+dmJLwoQewpssMWIuwr5uwq/DmyXDrsKyYlRh"



То есть что-то получается, но не совсем то, как мне кажется...

Либо я что-то делаю не так при получении хеша,
либо XML не в каноническом виде... Но если это так, то я просто не знаю какой вид она должна иметь...

Может кто-нибудь подбросить пример подписывания XML для СМЕВ с использованием КриптоПро ЭЦП Browser plug-in?

Отредактировано пользователем 4 апреля 2013 г. 11:12:03(UTC)  | Причина: уточнение результата и действий

Offline GostyCtypto  
#4 Оставлено : 4 апреля 2013 г. 11:08:08(UTC)
GostyCtypto

Статус: Участник

Группы: Участники
Зарегистрирован: 01.04.2013(UTC)
Сообщений: 17
Мужчина
Российская Федерация
Откуда: ООО &quot;ЦентрПрограммСистем&quot;

Сказал «Спасибо»: 8 раз
Скажите, пожалуйста, верно ли я следую приведенным рекомендациям ("Методические рекомендации по разработке электронных сервисов и применению ЭЦП при МЭВ"):
  1. Формат сертификата должен соответствовать спецификации X.509 и быть представленным в формате Base64 (речь идет о теге <wsse:BinarySecurityToken>)

  2. К элементу <soapenv:Body> и его потомкам, включая атрибуты, применяется каноникализация http://www.w3.org/2001/10/xml-exc-c14n#, на основе результата рассчитывается хеш по алгоритму ГОСТ Р 34.11-94 и заносится в <ds:DigestValue> в формате Base64[/i]

  3. К элементу <ds:SignedInfo> и его потомкам, включая атрибуты, применяется каноникализация http://www.w3.org/2001/10/xml-exc-c14n#, на основе результата рассчитывается электронная подпись по алгоритму ГОСТ Р 34.11-2001 и заносится в <ds:SignatureValue> в формате Base64[/i]



Если описанные действия я выполняю правильно, то встает вопрос всего-лишь правильной канонизации (каноникализация) XML (вернее её фрагментов), а это уже, скорее всего, не к вам и буду искать в другом месте...
Надеюсь кто-нибудь мне подскажет, правильно ли я понял что нужно сделать в кажном из пунктов (см пост #1 и #3)

Отредактировано пользователем 4 апреля 2013 г. 13:15:46(UTC)  | Причина: уточнение

Offline Новожилова Елена  
#5 Оставлено : 4 апреля 2013 г. 13:35:57(UTC)
Новожилова Елена

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

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
1. Да, BinarySecurityToken должен содержать сертификат, закодированный в BASE64. В вашем первом сообщении вы пытаетесь вместо сертификата записать значение CMS-сообщения. Так делать не нужно. Используйте Certificate.Export(CAPICOM_ENCODE_BASE64).

2. Да, но приведение в канонический вид по http://www.w3.org/2001/10/xml-exc-c14n# это не "убрать пробелы между тегами и крайние пробелы в значения тегов"

3. Да, но нужно помнить, что значение цифровой подписи по ГОСТ Р 34.10 - случайно. Не следует здесь ждать совпадения значения подписи с полученным на C#. Даже на C# оно каждый раз будет разным.

По поводу вычисления хэш-значения и подписи:
Цитата:
JSZipBase64.encode(HashedData.Value) = "RDg0REFFRTgxM0ZFRUJGRkE3MzJBMkRDNEUwMkIzRDUyMDVBNTMxRTY1REVEQzRCRDVGRkZCNzdCREQ0QTY3MA=="
Используя совет Slavik17 для HashedData.Value получаю: "w5hNwq7DqBPDvsOrw7/CpzLCosOcTgLCs8OVIFpTHmXDnsOcS8OVw7/Du3fCvcOUwqZw"


HashedData.Value возвращает значение в виде шестнадцатеричной строки.

Закодированное в BASE64 хэш-значение "D84DAEE813FEEBFFA732A2DC4E02B3D5205A531E65DEDC4BD5FFFB77BDD4A670"
будет выглядеть так:

Цитата:
2E2u6BP+6/+nMqLcTgKz1SBaUx5l3txL1f/7d73UpnA=
thanks 1 пользователь поблагодарил Новожилова Елена за этот пост.
GostyCtypto оставлено 04.04.2013(UTC)
Offline GostyCtypto  
#6 Оставлено : 4 апреля 2013 г. 14:00:17(UTC)
GostyCtypto

Статус: Участник

Группы: Участники
Зарегистрирован: 01.04.2013(UTC)
Сообщений: 17
Мужчина
Российская Федерация
Откуда: ООО &quot;ЦентрПрограммСистем&quot;

Сказал «Спасибо»: 8 раз
Эм... простите, но каким образом из
Цитата:
D84DAEE813FEEBFFA732A2DC4E02B3D5205A531E65DEDC4BD5FFFB77BDD4A670
получается
Цитата:
2E2u6BP+6/+nMqLcTgKz1SBaUx5l3txL1f/7d73UpnA=

Base64 encode, что на C#, что из приведенной мной библиотеки (JSZip) и base64.ru (как и www.base64encode.org) выдают
Цитата:
RDg0REFFRTgxM0ZFRUJGRkE3MzJBMkRDNEUwMkIzRDUyMDVBNTMxRTY1REVEQzRCRDVGRkZCNzdCREQ0QTY3MA==

Каким преобразованием получается приведенная Вами форма ?
Offline Новожилова Елена  
#7 Оставлено : 4 апреля 2013 г. 14:50:16(UTC)
Новожилова Елена

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

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
Переводите шестнадцатеричную строку в бинарный вид и кодируете в BASE64.

По сути хэш-значение это последовательность байт. Эту последовательность байт вам нужно закодировать в BASE64.

HashedData.Value возвращает эту последовательность байт в виде шестнадцатеричной строки (по аналогии с CAPICOM).
Вы пытаетесь закодировать в BASE64 шестнадцатеричную строку.

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

thanks 1 пользователь поблагодарил Новожилова Елена за этот пост.
GostyCtypto оставлено 08.04.2013(UTC)
Offline otxx  
#8 Оставлено : 4 апреля 2013 г. 14:52:11(UTC)
otxx

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

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

Сказал(а) «Спасибо»: 1 раз
Здравствуйте! Ответьте, пожалуйста, на мои вопросы. Для начала расскажу что я делаю:

С помощью КриптоПро ЭЦП Browser plug-in подписываю файл, хранящийся на диске у пользователя.(к примеру, C:\users\...\file.doc)
Делаю это следующим образом:
Содержимое файла передаю в плагин в формате BASE64.
Предварительно указав ContentEncoding = CADESCOM_BASE64_TO_BINARY;
Отделенную подпись сохраняю в файл (к примеру, C:\users\...\file.doc.p7s), в двоичном виде(раскодировав BASE64)

полученная подпись
file.doc.p7s
вместе с подписываемым файлом
file.doc

УСПЕШНО проверяются программами:

КриптоАРМ Старт 4 номер сборки 4.6.1.1
БЛОКХОСТ ЭЦП (Version 1.3.29.0)

И при онлайн проверке по адресу:
http://dss.cryptopro.ru/notary/ - тоже проверка проходит УСПЕШНО


Всё вроде ОК, но это так ТОЛЬКО ЕСЛИ ТИП ПОДПИСИ = CADESCOM_CADES_BES.

Если же тип подписи = CADESCOM_CADES_X_LONG_TYPE_1, то

КриптоАРМ - выдаёт "Неизвестный алгоритм"
Блокхост ЭЦП - выдаёт "Не удалось найти сертификат открытого ключа"

но вот при онлайн проверке:
http://dss.cryptopro.ru/notary/ - проверка снова проходит УСПЕШНО


вопросы:
1) Почему тип подписи CADESCOM_CADES_X_LONG_TYPE_1 не проходит проверку в программах КриптоАРМ и Блокхост ЭЦП?
2) CADESCOM_CADES_X_LONG_TYPE_1 - это тот усовершенствованный вариант подписи, про который написано на странице http://www.cryptopro.ru/products/cades ?
3) Только тип CADESCOM_CADES_X_LONG_TYPE_1 подписи будет юридически значимым ?
Offline Новожилова Елена  
#9 Оставлено : 4 апреля 2013 г. 15:02:53(UTC)
Новожилова Елена

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

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
1. Наверное стоит спросить об этом производителей указанных программ.
2. Да.
3. Нет.
Offline GostyCtypto  
#10 Оставлено : 8 апреля 2013 г. 10:10:07(UTC)
GostyCtypto

Статус: Участник

Группы: Участники
Зарегистрирован: 01.04.2013(UTC)
Сообщений: 17
Мужчина
Российская Федерация
Откуда: ООО &quot;ЦентрПрограммСистем&quot;

Сказал «Спасибо»: 8 раз
Что-то все равно не получается ни как... привести XML к каноническому виду...
Не могу найти примеры, а в документации ничего не понятно что нужно делать...

Может кто здесь поможет?

Хотя бы помогите привести к каноническому виду XML:
Код:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 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" xmlns:ws="http://ws.unisoft/" xmlns:rev="http://smev.gosuslugi.ru/rev120315" xmlns:rq1="http://ws.unisoft/CPSSubsidPercent/Rq1" xmlns:inc="http://www.w3.org/2004/08/xop/include">
  <soapenv:Header>
    <wsse:Security soapenv:actor="http://smev.gosuslugi.ru/actors/smev">
      <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <ds:KeyInfo>
          <wsse:SecurityTokenReference>
            <wsse:Reference URI="#SenderCertificate" />
          </wsse:SecurityTokenReference>
        </ds:KeyInfo>
      </ds:Signature>
      <wsse:BinarySecurityToken EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" wsu:Id="SenderCertificate" />
    </wsse:Security>
  </soapenv:Header>
  <soapenv:Body wsu:Id="body">
    <ws:async_getId_SendRequest_Tyrim_Pyrim>
      <rev:Message>
        <rev:Sender>
          <rev:Code>CODE63544</rev:Code>
          <rev:Name>ТутИмя</rev:Name>
        </rev:Sender>
        <rev:Recipient>
          <rev:Code>CODE2</rev:Code>
          <rev:Name>Тест</rev:Name>
        </rev:Recipient>
        <rev:Originator>
          <rev:Code>CODE3</rev:Code>
          <rev:Name>Тест</rev:Name>
        </rev:Originator>
        <rev:ServiceName>ТестВебСервис</rev:ServiceName>
        <rev:TypeCode>GSRV</rev:TypeCode>
        <rev:Status>REQUEST</rev:Status>
        <rev:Date>2012-03-13T12:12:12Z</rev:Date>
        <rev:ExchangeType>1</rev:ExchangeType>
        <rev:RequestIdRef />
        <rev:OriginRequestIdRef />
        <rev:ServiceCode />
        <rev:CaseNumber />
        <rev:TestMsg />
      </rev:Message>
      <rev:MessageData>
        <rev:AppData>
          <rq1:Документ ВерсияФормата="1.0" UIDЗапроса="4832bdef-bef7-459a-8397-dc28793f59d4">
            <РегНомер>1</РегНомер>
          </rq1:Документ>
        </rev:AppData>
        <rev:AppDocument>
          <rev:RequestCode>req_4832bdef-bef7-459a-8397-dc28793f59d4</rev:RequestCode>
          <rev:BinaryData>UEsDBBQAAAAIABm=</rev:BinaryData>
        </rev:AppDocument>
      </rev:MessageData>
    </ws:async_getId_SendRequest_Tyrim_Pyrim>
  </soapenv:Body>
</soapenv:Envelope>

После её подписывания в C# получается
Цитата:
<DigestValue>M64fZJNYE9Cb4kLc16P40/r+416DTzbJjcibm0voZOo=</DigestValue>

К какому виду нужно привести XML (канонизированному) что бы получилось такое же значение DigestValue?

Отредактировано пользователем 8 апреля 2013 г. 11:20:49(UTC)  | Причина: добавлен xml

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