Пример использования режима безопасности служб WCF в режиме транспорта (net.tcp) и использования идентификации клиента WCF на основе сертификата.

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

Данный пример демонстрирует использование режима транспорта net.tcp и идентификацией на основе сертификатов алгоритма ГОСТ.

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

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

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

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

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

Перед запуском примера необходимо создать два секретных ключа и два соответствующих им сертификата: ключ службы и ключ клиента как это описано в Сборка, запуск и местоположение примеров WCF.

Запуск примера с использованием самостоятельного приложения службы (SelfHost) соответстует инструкции Сборка, запуск и местоположение примеров WCF.

Для запуска приложения сервера необходима установленная серверная лицензия на КриптоПро CSP, в прайс-листе данная лицензия именуется как "Лицензия на право пользования СКЗИ КриптоПро CSP на одном сервере (включает право пользования КриптоПро TLS)."

Перед запуском примера с использованием службы IIS следует создать виртуальный каталог ServiceModelSamplesNetTcp2 как это описано в Сборка, запуск и местоположение примеров WCF. Далее необхоимо убедиться в правильности настройки net.tcp как это описано в Сборка, запуск и местоположение примеров WCF.

Как модифицировать базовый пример до данного

Для модификации клиента, необходимо

  • Модифицировать секцию configuration\system.serviceModel\behaviors\endpointBehaviors\behavior конфигурации клиента (app.config), добавив clientCredentials с сертификатом клиента и способом проверки сертификата сервера.

     Copy imageCopy Code
    <behavior name="NewBehavior">
        <clientCredentials>
            <clientCertificate 
                findValue="TestGostNet" 
                storeLocation="CurrentUser" 
                storeName="My" 
                x509FindType="FindBySubjectName"/>
            <serviceCertificate>
                <!-- Способ проверки серверного сертификата. -->
                <authentication certificateValidationMode="None"/>
            </serviceCertificate>
        </clientCredentials>
    </behavior>
                            
  • Модифицировать привязку: изменив секцию configuration\system.serviceModel\bindings с wsHttpBinding на netTcpBinding и установив аудентификацию по сертификату.

     Copy imageCopy Code
    <netTcpBinding>
        <binding name="NewBinding1" >
            <security mode="Transport">
                <transport clientCredentialType="Certificate"/>
            </security>
        </binding>
    </netTcpBinding>
                            
  • Изменить endpoint для указания на модифицированную привязку, изменив тег configuration\system.serviceModel\client\endpoint

     Copy imageCopy Code
    <!--
    <endpoint
        address="net.tcp://localhost/ServiceModelSamplesNetTcp2/CalculatorService.svc"
        binding="netTcpBinding"
        bindingConfiguration="NewBinding1"
        contract="ICalculator"
        name="WSHttpBinding_ICalculator"
        behaviorConfiguration="NewBehavior" />
    -->
    <endpoint
        address="net.tcp://localhost:8000/ServiceModelSamplesNetTcp2/CalculatorService.svc"
        binding="netTcpBinding"
        bindingConfiguration="NewBinding1"
        contract="ICalculator"
        name="WSHttpBinding_ICalculator"
        behaviorConfiguration="NewBehavior" />
                            

Для модификации самостоятельного приложения службы, необходимо внести следующие изменения в код SelfHost.cs

  • Изменить тип класса привязки

    C# Copy imageCopy Code
    NetTcpBinding b = new NetTcpBinding();
                            
  • Установить режим безопасности у данной привязки в транспорт

    C# Copy imageCopy Code
    b.Security.Mode = SecurityMode.Transport;
                            
  • Установить режим идентификации по сертификату у данной привязки

    C# Copy imageCopy Code
    b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate;
                            
  • Добавив параметры поиска сертификата сервиса:

    C# Copy imageCopy Code
    selfHost.Credentials.ServiceCertificate.SetCertificate(
        StoreLocation.LocalMachine,
        StoreName.My,
        X509FindType.FindBySubjectDistinguishedName,
        "CN=localhost, OU=Sharpei, O=CryptoPro, C=RU");
                            
  • Удалить доступ к метаданным удалив код:

    C# Copy imageCopy Code
    smb.HttpGetEnabled = true;
                            

Для модификации службы IIS необходимо внести следующие изменения в конфигурационный файл web.config

  • Изменить привязку с wsHttpBinding в netTcpBinding в теге configuration\system.serviceModel\bindings установить режим защиты служб в транспортный и установить аутентификацию клиента по сертификатам

     Copy imageCopy Code
    <netTcpBinding>
        <binding name="NewBinding1">
            <security mode="Transport">
                <transport clientCredentialType="Certificate"/>
            </security>
        </binding>
    </netTcpBinding>
                            
  • изменение параметров поиска ключа и сертификата службы и установка политики проверки сертификата клиента в теге configuration\system.serviceModel\behaviors\serviceBehaviors\behavior\serviceMetadata\serviceCredentials

     Copy imageCopy Code
    <serviceCredentials>
        <serviceCertificate
            findValue="CN=localhost, OU=Sharpei, O=CryptoPro, C=RU"
            x509FindType="FindBySubjectDistinguishedName" />
        <clientCertificate>
            <authentication certificateValidationMode="None"/>
        </clientCertificate>
    </serviceCredentials>
                            
  • Изменить точку привязки в теге configuration\system.serviceModel\services\service

     Copy imageCopy Code
    <endpoint 
        address="" 
        binding="netTcpBinding" 
        bindingConfiguration="NewBinding1"
        contract="CryptoPro.Sharpei.WCF.Samples.ICalculator" />
                            

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

Изменения при переходе от ключей и сертификатов Rsa к ГОСТ

На стороне клиента требуется

  • генерация новых ключей и сертификатов

    в конфигурационном файла клиента (app.config) изменить сертификат клиента на вновь сгенеренный в clientCertificate configuration\system.serviceModel\behaviors\endpointBehaviors\behavior\clientCredentials\clientCertificate

На стороне самостоятельного приложения службы требуется

  • генерация новых ключей и сертификатов

  • изменение параметров поиска ключа и сертификата службы в функции selfHost.Credentials.ServiceCertificate.SetCertificate

На стороне службы IIS

  • генерация новых ключей и сертификатов

  • изменение параметров поиска ключа и сертификата службы в конфигурационном файле web.config в теге configuration\system.serviceModel\behaviors\serviceBehaviors\behavior\serviceCredentials\serviceCertificate

См. также