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

Уведомление

Icon
Error

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

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

Группы: Участники
Зарегистрирован: 03.07.2014(UTC)
Сообщений: 3
Российская Федерация

Добрый день. Реализуем Web-приложение обмена данными с внешними системами по средствам СМЭВ. Во время работы, пользователь указывает какие данные ему необходимо отправить, на сервере формируется соответствующее сообщение, которое подписывается на стороне клиента по средствам КриптоПро ЭЦП Browser plug-in. Пример кода подписи сообщений взят от сюда: http://cpdn.cryptopro.ru...ples-sign-xml-smev.html.

Используемый код немного отличается:
Код:

<style type="text/css">
    object.hiddenObject {
        visibility: hidden;
        width: 0px;
        height: 0px;
        margin: 0px;
        padding: 0px;
        border-style: none;
        border-width: 0px;
        max-width: 0px;
        max-height: 0px;
    }
</style>

 // ...
 
 <object id="cadesplugin" type="application/x-cades" class="hiddenObject"></object>

@{
    var myBrowserCaps = Request.Browser;
    string sUserAgent = myBrowserCaps.Browser.ToLower();
    bool fIsIE = sUserAgent.IndexOf("ie") >= 0 || // IE <= 10
        sUserAgent.IndexOf("trident") >= 0; // IE 11
    bool fIsIOS = sUserAgent.IndexOf("ipod") >= 0 ||
        sUserAgent.IndexOf("ipad") >= 0 ||
        sUserAgent.IndexOf("iphone") >= 0;
}

@{
    if (fIsIE)
    { 
    <text>
    <object id='certEnrollClassFactory' classid='clsid:884e2049-217d-11da-b2a4-000e7bbb2b09'></object>
    </text>
    } 
}
<script type="text/javascript">
function sendDataToGASU(message) {

        var oCertificate = GetCertificateBySubjectName(certificateName);

        var token = oCertificate.Export(CADESCOM_ENCODE_BASE64);

        var element, xmlDoc;
        // подменяем вставляем security token в присланное сообщение
        xmlDoc = $.parseXML(message.toString());
        element = $(xmlDoc).find("o\\:BinarySecurityToken");
        element.text(token);
        
        var xmlString = undefined;

        if (window.ActiveXObject) {
            xmlString = xmlDoc[0];
        }

        if (xmlString === undefined) {
            var oSerializer = new XMLSerializer();
            xmlString = (new XMLSerializer()).serializeToString(xmlDoc);
        }

        var message = SignCreate(oCertificate, xmlString);

        if (Verify(message)) {
        	alert ("OK");
        }
 	}

var g_cadesPluginObject = document.getElementById("cadesplugin");

     @{
         if (fIsIE)
         {
            <text>
    var g_objCertEnrollClassFactory = document.getElementById("certEnrollClassFactory");
            </text>
         }
    }

    function CreateObject(name) {
        @{
            if (fIsIOS)
            {
                // На iOS для создания объектов используется функция
                // call_ru_cryptopro_npcades_10_native_bridge, определенная в NativeBridge.js
                <text>
        return call_ru_cryptopro_npcades_10_native_bridge("CreateObject", [name]);
                </text>
            }
            else if (!fIsIE)
            {
                // В Firefox, Opera, Chrome, Safari создаются объекты NPAPI
                <text>
        return g_cadesPluginObject.CreateObject(name);
                </text>
            }
            else
            {
                // В Internet Explorer создаются COM-объекты
                // Объекты CertEnroll создаются через CX509EnrollmentWebClassFactory
                // Объекты CAPICOM и CAdESCOM создаются обычным способом
                <text>
        if (name.match(/X509Enrollment/i)) {
            return g_objCertEnrollClassFactory.CreateObject(name);
        }
        return new ActiveXObject(name);
                </text>
            }
        }
    }

    var CAPICOM_CURRENT_USER_STORE = 2;
    var CAPICOM_MY_STORE = "My";
    var CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED = 2;
    var CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME = 1;
    var CADESCOM_XML_SIGNATURE_TYPE_TEMPLATE = 2;
    var CADESCOM_ENCODE_BASE64 = 0;

    function GetErrorMessage(e) {
        var err = e.message;
        if (!err) {
            err = e;
        } else if (e.number) {
            err += " (" + e.number + ")";
        }
        return err;
    }

    function GetCertificateBySubjectName(certSubjectName) {
        var oStore = CreateObject("CAPICOM.Store");

        if (oStore == null) {
            alert("Не удалось запустить Крипто-ПРО ЭЦП Browser plug-in. Убедитесь в том, что данный программный компонент установлен корректно, и перезапустите браузер.");
            return;
        }

        oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE,
            CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);

        var oCertificates = oStore.Certificates.Find(
            CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME, certSubjectName);
        if (oCertificates.Count == 0) {
            alert("Сертификат не найден: " + certSubjectName);
            return;
        }
        var oCertificate = oCertificates.Item(1);

        return oCertificate;
    }

    function SignCreate(oCertificate, dataToSign) {

        // Создаем объект CAdESCOM.CPSigner
        var oSigner = CreateObject("CAdESCOM.CPSigner");
        oSigner.Certificate = oCertificate;

        // Создаем объект CAdESCOM.SignedXML
        var oSignedXML = CreateObject("CAdESCOM.SignedXML");
        oSignedXML.Content = dataToSign;

        // Указываем тип подписи - в данном случае по шаблону
        oSignedXML.SignatureType = CADESCOM_XML_SIGNATURE_TYPE_TEMPLATE;

        var sSignedMessage = "";
        try {
            sSignedMessage = oSignedXML.Sign(oSigner);
        } catch (err) {
            alert("Ошибка! Не удалось создать электронную подпись. " + GetErrorMessage(err));
            return;
        }

        return sSignedMessage;
    }

    function Verify(sSignedMessage) {
        // Создаем объект CAdESCOM.SignedXML
        var oSignedXML = CreateObject("CAdESCOM.SignedXML");

        try {
            oSignedXML.Verify(sSignedMessage);
        } catch (err) {
            alert("Оибка! Не удалось подтвердить подпись: " + GetErrorMessage(err));
            return false;
        }

        return true;
    }
    
 </script>


Все успешно работает FireFox, IE, но не работает в Google Chrome, падая на методе проверки подписи со следующим сообщением: "An error was encountered while processing an XML digital signature. (0x800705BA)".

Ниже приведен пример сообщения, которое подписывается данным плагином:
Код:

<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
  <s:Header>
    <o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" s:actor="http://smev.gosuslugi.ru/actors/smev">
      <o:BinarySecurityToken u:Id="uuid-ee82d445-758b-42cb-996c-666b74b60022-2" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">
      </o:BinarySecurityToken>
      <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
        <SignedInfo>
          <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="#_1">
            <Transforms>
              <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>
        <SignatureValue>
        </SignatureValue>
        <KeyInfo>
          <o:SecurityTokenReference>
            <o:Reference ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" URI="#uuid-ee82d445-758b-42cb-996c-666b74b60022-2" />
          </o:SecurityTokenReference>
        </KeyInfo>
      </Signature>
    </o:Security>
  </s:Header>
  <s:Body u:Id="_1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <GasuMessage xmlns="http://smev.gosuslugi.ru/rev120315">
      <Message>
        <Sender>
          <Code>...</Code>
          <Name>...</Name>
        </Sender>
        <Recipient>
          <Code>...</Code>
          <Name>...</Name>
        </Recipient>
        <Originator>
          <Code>...</Code>
          <Name>...</Name>
        </Originator>
        <ServiceName />
        <TypeCode>GFNC</TypeCode>
        <Status>...</Status>
        <Date>2015-01-27T19:44:09.2814547+04:00</Date>
        <ExchangeType />
        <RequestIdRef>1b60cc26-b451-4153-89a9-e0cfe3f9cab8</RequestIdRef>
        <OriginRequestIdRef>1b60cc26-b451-4153-89a9-e0cfe3f9cab8</OriginRequestIdRef>
        <ServiceCode />
        <CaseNumber />
      </Message>
      <MessageData>
        <AppData>
          <AppMessage>
            <AppHeader>
              <ID>...</ID>
              <DataSourceRef>...</DataSourceRef>
              <HeaderInfo />
            </AppHeader>
            <MessageType>ImportFull</MessageType>
            <Body>
              <DataSet uid="c6eb9473-2d86-44b2-8661-66ffa673c22a" providerRef="..." indicatorRef="..." prepareTime="2015-01-27T19:44:10.0344325+04:00">
                <Series>
                  <SeriesKey>
                    <SeriesKeyItem DimensionRef="...">...</SeriesKeyItem>
                    <SeriesKeyItem DimensionRef="...">...</SeriesKeyItem>
                  </SeriesKey>
                  <Observation>
                    <Time>...</Time>
                    <Attributes>
                      <Value ref="...">
                        <ValueString>...</ValueString>
                      </Value>
                    </Attributes>
                    <ObsValue>
                      <ValueVc>...</ValueVc>
                    </ObsValue>
                  </Observation>
                </Series>
              </DataSet>
              <DataSet uid="3d2a1a9e-51b4-485b-9725-0bf166ea4c41" providerRef="..." indicatorRef="..." prepareTime="2015-01-27T19:44:10.0344325+04:00">
                <Series>
                  <SeriesKey>
                    <SeriesKeyItem DimensionRef="...">...</SeriesKeyItem>
                    <SeriesKeyItem DimensionRef="...">...</SeriesKeyItem>
                  </SeriesKey>
                  <Observation>
                    <Time>...</Time>
                    <Attributes>
                      <Value ref="...">
                        <ValueString>...</ValueString>
                      </Value>
                    </Attributes>
                    <ObsValue>
                      <ValueVc>...</ValueVc>
                    </ObsValue>
                  </Observation>
                </Series>
              </DataSet>
              <DataSet uid="b21fea0e-4822-47f5-ae1a-bb3272180204" providerRef="..." indicatorRef="..." prepareTime="2015-01-27T19:44:10.0344325+04:00">
                <Series>
                  <SeriesKey>
                    <SeriesKeyItem DimensionRef="...">...</SeriesKeyItem>
                    <SeriesKeyItem DimensionRef="...">...</SeriesKeyItem>
                  </SeriesKey>
                  <Observation>
                    <Time>...</Time>
                    <Attributes>
                      <Value ref="...">
                        <ValueString>...</ValueString>
                      </Value>
                    </Attributes>
                    <ObsValue>
                      <ValueVc>...</ValueVc>
                    </ObsValue>
                  </Observation>
                </Series>
              </DataSet>
              <DataSet uid="07d826ad-eb4a-4e4b-bfaa-50b06dbb675a" providerRef="..." indicatorRef="..." prepareTime="2015-01-27T19:44:10.0344325+04:00">
                <Series>
                  <SeriesKey>
                    <SeriesKeyItem DimensionRef="...">...</SeriesKeyItem>
                    <SeriesKeyItem DimensionRef="...">...</SeriesKeyItem>
                  </SeriesKey>
                  <Observation>
                    <Time>...</Time>
                    <Attributes>
                      <Value ref="...">
                        <ValueString>...</ValueString>
                      </Value>
                      <Value ref="...">
                        <ValueString>...</ValueString>
                      </Value>
                    </Attributes>
                    <ObsValue>
                      <ValueVc>...</ValueVc>
                    </ObsValue>
                  </Observation>
                </Series>
              </DataSet>
            </Body>
          </AppMessage>
        </AppData>
      </MessageData>
    </GasuMessage>
  </s:Body>
</s:Envelope>


Версия Google Chrome: 40.0.2214.93 m

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