Статьи

Включение SSL для службы WCF

На прошлой неделе читатель прислал мне несколько вопросов о моем блоге « WCF over HTTPS », который я написал почти 3 года назад.

Я создал пример кода, чтобы помочь ему включить SSL для службы WCF. В прошлом году это была моя самая популярная статья, поэтому я подумал, что было бы целесообразно создать новую актуальную версию, которая шаг за шагом покажет вам, как включить SSL для службы WCF с минимальными усилиями.

Давайте начнем…

Шаг 1 — Сервис

Сначала мы собираемся создать простой и удобный в использовании сервис WCF. Запустите Visual Studio 2010 и создайте новое пустое решение под названием «SslEnabledWcfService». Затем добавьте новый проект библиотеки классов под названием «CustomerService».

Обозреватель решений

Добавьте ссылку на сборки System.ServiceModel и System.Runtime.Serialization в проект CustomerService.

Добавьте новый интерфейс ICustomerService в проект,
который определяет контракт на обслуживание.

[ServiceContract]
public interface ICustomerService
{
    [OperationContract]
    IEnumerable<Customer> GetCustomers();
}

Сервис возвращает коллекцию клиентов. Каждый клиент представлен экземпляром класса Customer.

[DataContract]
public class Customer
{
    [DataMember]
    public Guid Id { get; set; }

    [DataMember]
    public string FirstName { get; set; }

    [DataMember]
    public string LastName { get; set; }
}

Идите дальше и добавьте файл с именем Customer.cs. Скопируйте и вставьте код, указанный выше.

Реальная реализация сервиса очень проста. Возвращает список клиентов, которые я создаю на лету. Нет смысла иметь дело с базой данных или другим постоянным хранилищем данных для этого поста. Давайте сделаем вещи максимально простыми.

[ServiceBehavior]
public class CustomerService : ICustomerService
{
    private IEnumerable<Customer> LoadCustomers()
    {
        //...
    }

    public IEnumerable<Customer> GetCustomers()
    {
        var customers = new List<Customer>();
        customers.AddRange(LoadCustomers());
        return customers;
    }
}

Ознакомьтесь с исходным кодом, сопровождающим этот пост, для получения полного кода класса CustomerService.

 

Шаг 2 — Конфигурация

Хорошо, теперь пришло время добавить некоторые настройки для нашего сервиса. Процесс хоста (IIS) нуждается в этом, чтобы иметь возможность выяснить, как разместить сервис. Сначала добавьте новый файл конфигурации приложения с именем Web.config в проект CustomerService.

Обозреватель решений

Сначала вам нужно перечислить службу в узле <system.serviceModel> .

<system.serviceModel>
  <services>
    <service name="CustomerService.CustomerService"
              behaviorConfiguration="MyServiceBehavior">

      <endpoint address=""
                binding="basicHttpBinding"
                bindingConfiguration="TransportSecurity"
                contract="CustomerService.ICustomerService" />

      <endpoint address="mex"
                binding="mexHttpsBinding"
                contract="IMetadataExchange" />
    </service>
  </services>

  <!--...-->
</system.serviceModel>

Как вы можете видеть, сервис связан с пользовательским поведением сервиса под названием «MyServiceBehavior». Вам необходимо определить это поведение в узле <поведениеiors> узла <system.serviceModel>.

<behaviors>
  <serviceBehaviors>
    <behavior name="MyServiceBehavior">
      <serviceMetadata httpsGetEnabled="true" httpsGetUrl="" />
      <serviceDebug includeExceptionDetailInFaults="false"/>
    </behavior>
  </serviceBehaviors>
</behaviors>

Обратите внимание, что для свойства httpsGetEnabled установлено значение true. Это позволяет нам получать метаданные для службы, используя HTTPS / GET-запрос. Удобно для создания прокси наших клиентов позже.

Первая конечная точка (не mex) службы также связана с пользовательской привязкой (basicHttpBinding), называемой TransportSecurity.

<bindings>
    <basicHttpBinding>
      <binding name="TransportSecurity">
        <security mode="Transport">
          <transport clientCredentialType="None" />
        </security>
      </binding>
    </basicHttpBinding>
</bindings>

Именно на уровне привязки вы должны указать, какую модель безопасности использует сервис. Здесь мы устанавливаем режим транспорта (SSL) и отключаем любой тип аутентификации клиента .

 

Шаг 3 — Хостинг Сервис

Сервис был создан и настроен. Время провести это. Для этой цели я использую IIS 7.5 (7.5.7600.16385) в Windows 7. Создайте новый текстовый файл с именем «Service.svc». Обратите внимание на расширение .svc!

Добавьте его в проект CustomerService.

Обозреватель решений

Он содержит только одну строку, а именно:

<%@ ServiceHost Language="C#"
                Service="CustomerService.CustomerService"
                CodeBehind="CustomerService.cs" %>

Здесь вы указываете сервис, используемый язык и расположение кода за файлом.

Откройте проводник Windows и перейдите в папку установки по умолчанию для IIS (C: \ inetpub). Я начал с чистой установки, чтобы все было легко. Поскольку я не размещаю другие сайты локально, я удалил все, что нашел в подпапке wwwroot. Возможно, вы захотите создать подпапку в папке wwwroot для размещения вашего сервиса. После этого создайте новый каталог bin в папке wwwroot или в своей пользовательской подпапке.

Для размещения службы вы должны скопировать следующие файлы в каталог, в котором размещена ваша служба:

  • Service.svc
  • Web.config
  • CustomerService.dll (\ bin)

Вы должны скопировать скомпилированную сборку CustomerService.dll (и любые другие зависимые сборки) в папку bin! Просто установите конфигурацию вашего решения на Release, перестройте свое решение и скопируйте необходимые файлы, как описано.

Inetpub wwwroot

Почти там, нам просто нужно настроить IIS. Запустите диспетчер информационных служб Интернета (IIS) и перейдите к узлу веб-сайта по умолчанию на левой панели.

IIS Manager

Дважды щелкните документ по умолчанию, отображаемый на средней панели под группой IIS.

Документ по умолчанию

Удалите все документы, перечисленные там, а затем добавьте новый документ с именем Service.svc. Когда мы переходим на http: // localhost, мы хотим, чтобы IIS по умолчанию обслуживал документ Service.svc.

Документ по умолчанию

Откройте ваш любимый браузер (* кашель * Chrome * кашель *) и перейдите по адресу http: // localhost . Вас встретит следующая страница с ошибкой:

Защищенная страница

Страница защищена и недоступна через http. Именно то, что мы хотим! Вы можете попробовать получить к нему доступ через https: // localhost , но это приведет к ошибке на странице не найден, так как мы еще не настроили SSL.

 

Шаг 4 — SSL-сертификат

Прежде чем вы сможете настроить свою службу для использования SSL, вам нужен действительный сертификат SSL. К счастью, вы можете создать его самостоятельно для целей разработки / тестирования, а не покупать его. Используя утилиту командной строки makecert.exe, вы можете создавать свои собственные сертификаты.

Давайте быстро создадим сертификат. Запустите командную строку Visual Studio с повышенными правами и введите следующую команду:

makecert -r -pe -n “CN=YourComputerName” -b 01/01/2012 -e 01/01/2020
-eku 1.3.6.1.5.5.7.3.1 -ss my -sr localMachine -sky exchange -sp
“Microsoft RSA SChannel Cryptographic Provider” -sy 12

Обязательно замените термин «YourComputerName» на фактическое имя вашего компьютера. После выполнения команды вы должны получить простое сообщение «успешно».

Makecert.exe

 

Шаг 5 — Включить SSL

Alright, we have our SSL certificate. Let’s bind it to our service. Go back to IIS Manager and select the Default Web Site node. In the right pane click on the “Bindings…” link.

Наручники

In the Site Bindings popup click on the Add button to add a new binding.

Привязки сайта

and enter the following data to enable SSL for your site:

Привязка сайта

Be sure to select the SSL certificate you created earlier! Just click OK to add the binding and close the Site Bindings popup afterwards.

Restart your web site and navigate to https://localhost. This time it’ll work, but you’ll probably get a warning message because of your untrusted SSL certificate. Just ignore it.

Служба с поддержкой SSL

 

Step 6 – Consume The Service

Now that we have our service running in IIS and secured with SSL let’s test it. Time to consume the service. Add a new console application to the solution called ClientApp. Add a service reference to our newly created WCF service.

Добавить сервисную ссылку

When adding the service reference Visual Studio will report a problem with the SSL certificate.

Проблема с сертификатом

Just click Yes to proceed. The message is shown because the certificate has not been issued by a company you have chosen to trust.

After you’ve created the service reference you can consume the service. Let’s display a list of the customers.

using (var proxy = new CustomerServiceClient())
{
    var customers = proxy.GetCustomers();
    foreach(var customer in customers)
    {
        Console.WriteLine(String.Format("{0} {1}", customer.FirstName, customer.LastName));
    }
}

When you try to execute this code you’ll get the following exception:

SecurityNegotiatianException

The client application does not trust the service. You can fix this by inspecting the certificate which the service hands over to the client. You need to hook up a handler for the ServicePointManager’s ServerCertifcateValidationCallback.

ServicePointManager.ServerCertificateValidationCallback += customXertificateValidation;

When this callback is triggered you can inspect the server certificate.

private static bool customXertificateValidation(object sender, X509Certificate cert,
    X509Chain chain, SslPolicyErrors error)
{
    var certificate = (X509Certificate2) cert;

    // Inspect the server certficiate here to validate 
    // that you are dealing with the correct server.
    // If so return true, if not return false.
    return true;
}

We’re finally there. If you run the client application now it will correctly list the customers returned by the SSL-enabled WCF service.

Потребители

You can download the source code accompanying this article from the download page. If you have any questions or suggestions please drop me an e-mail or submit a comment.

 

Source: http://cgeers.com/2012/01/30/enabling-ssl-for-a-wcf-service/