Пример взаимодействия с сервисом СМЭВ с использованием Windows Communication Foundation.

Демонстрирует

Данный пример демонстрирует взаимодействие с сервиcом СМЭВ в режиме безопасности сообщений с использованием алгоритмов ГОСТ.

Исходные тексты

Исходные тексты примера находятся в файле WCF.zip в подкаталоге SMEV, Подробнее см. Сборка, запуск и местоположение примеров WCF.

Как собрать пример

Сборка приммера не требует дополнительных действий, по сравнению с инструкциями по сборке к данной группе примеров, указанных в Сборка, запуск и местоположение примеров WCF.

Как запустить пример

Перед запуском примера необходимо получить сертификат подписи запроса, выпущенный Удостоверяющим центом, входящим в ЕПД.

Особенности взаимодействия с сервисом СМЭВ

Для взаимодействия с сервисом СМЭВ требуется модифицировать привязку сгенерированную по WSDL сервиса. По умолчанию, режим безопасности сообщений на задан. Требуется внести следующие изменения:

  • Задать режим защиты WCF на уровне сообщений.

  • Задать алгоритм аутентификации ГОСТ (BasicGostObsolete).

  • Задать аутентификацию клиента по сертификату.

 Copy imageCopy Code
<binding name="binding_name" messageEncoding="Text" textEncoding="utf-8">
    <security mode="Message">
        <transport clientCredentialType="None" proxyCredentialType="None" />
        <message clientCredentialType="Certificate" algorithmSuite="BasicGostObsolete" />
    </security>
</binding>
                

Для режима защиты Message по умолчанию задано требование подписи и шифрования сообщений. Для взаимодействия с сервисом СМЭВ требуется только подпись сообщения.

C# Copy imageCopy Code
smevClient.ChannelFactory.Endpoint.Contract.ProtectionLevel = System.Net.Security.ProtectionLevel.Sign;
                

Для того чтобы сервис СМЭВ понимал заголовок безопасности SOAP запроса нужно задать собственный кодировщик сообщений CryptoPro.Sharpei.ServiceModel.SMEVTextMessageEncoder, определённый в сборке CryptoPro.Sharpei.ServiceModel.dll. Задать кодировщик сообщений можно как программно, так и через файл конфигурации.

  • Пример программного задания кодировщика сообщений.

    C# Copy imageCopy Code
    SMEVMessageEncodingBindingElement textBindingElement = new SMEVMessageEncodingBindingElement();
    
    CustomBinding binding = new CustomBinding(smevClient.Endpoint.Binding);
    binding.Elements.Remove<TextMessageEncodingBindingElement>();
    binding.Elements.Insert(0, textBindingElement);
                            
  • Пример задания кодировщика сообщений через файл конфигурации.

     Copy imageCopy Code
    <extensions>
        <bindingElementExtensions>
            <add name="SMEVTextMessageEncoder" type="CryptoPro.Sharpei.ServiceModel.SMEVMessageEncodingElement, 
    	CryptoPro.Sharpei.ServiceModel, Version=*.*.*.*, Culture=neutral, PublicKeyToken=473b8c5086e795f5" />
        </bindingElementExtensions>
    </extensions>
    
    <customBinding>
        <binding name="binding_name">
    	<security defaultAlgorithmSuite="BasicGostObsolete" 
    		     includeTimestamp="false">
                   <localClientSettings detectReplays="false"/>
                   <localServiceSettings detectReplays="false"/>
            </security>
            <SMEVTextMessageEncoder/>
        </binding>
    </customBinding>
                            

    При регистрации кодировщика (секция <bindingElementExtensions/>) требуется указать полное имя сборки, в коротой реализован соответвующий класс. В атрибуте Version задается версия сборки: 1.0.0.1 для NET3.5, 1.4.0.1 для NET4. Для элемента конфигурации <SMEVTextMessageEncoder/> определены следующие атрибуты:

    • recepient - значение атрибута actor для отправляемого сообщения. Значение по умолчанию: http://smev.gosuslugi.ru/actors/smev

    • sender - значение атрибута actor для входящего сообщения. Значение по умолчанию: http://smev.gosuslugi.ru/actors/recipient

    • messageVersion - версия SOAP-сообщения. Значение по умолчанию: Soap11WSAddressingNone

Для того чтобы клиент смог проверить подпись под ответом сервиса, требуется изменить поведение WCF по умолчанию:

C# Copy imageCopy Code
binding.Elements.Find<AsymmetricSecurityBindingElement>().LocalClientSettings.DetectReplays = false;
                

См. также