Пример использования режима безопасности служб 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 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 Code <netTcpBinding> <binding name="NewBinding1" > <security mode="Transport"> <transport clientCredentialType="Certificate"/> </security> </binding> </netTcpBinding>
Изменить endpoint для указания на модифицированную привязку, изменив тег configuration\system.serviceModel\client\endpoint
Copy 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 Code NetTcpBinding b = new NetTcpBinding();
Установить режим безопасности у данной привязки в транспорт
C# Copy Code b.Security.Mode = SecurityMode.Transport;
Установить режим идентификации по сертификату у данной привязки
C# Copy Code b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate;
Добавив параметры поиска сертификата сервиса:
C# Copy Code selfHost.Credentials.ServiceCertificate.SetCertificate( StoreLocation.LocalMachine, StoreName.My, X509FindType.FindBySubjectDistinguishedName, "CN=localhost, OU=Sharpei, O=CryptoPro, C=RU");
Удалить доступ к метаданным удалив код:
C# Copy Code smb.HttpGetEnabled = true;
Для модификации службы IIS необходимо внести следующие изменения в конфигурационный файл web.config
Изменить привязку с wsHttpBinding в netTcpBinding в теге configuration\system.serviceModel\bindings установить режим защиты служб в транспортный и установить аутентификацию клиента по сертификатам
Copy Code <netTcpBinding> <binding name="NewBinding1"> <security mode="Transport"> <transport clientCredentialType="Certificate"/> </security> </binding> </netTcpBinding>
изменение параметров поиска ключа и сертификата службы и установка политики проверки сертификата клиента в теге configuration\system.serviceModel\behaviors\serviceBehaviors\behavior\serviceMetadata\serviceCredentials
Copy 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 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