Настройка SSL для BizTalk – Рецепт

В прошлой статье мы рассмотрели возможность настройки IIS для работы с SSL. Сейчас попробуем настроить работу с BizTalk, поскольку одно дело настроить какую-то там веб-службу, и совсем другое дело – заставить с этим работать BizTalk Server 2010.

Итак, что имеем и что хочется: у нас есть некий веб-сервис, который подключен к BizTalk. Сообщения от веб-сервиса сыпятся на receive location приложения BizTalk, откуда попадают в нужные оркестровки. Работа самого приложения в данном случае не столь важна, я для примера сделал, чтобы мне на входящее сообщение просто возвращалось OK. Допустим, приложение у нас работает, и при отправке запроса через soapUI мы получаем ожидаемый ответ (не сообщение об ошибке! Winking smile). Затем перед нами встала задача настроить SSL, давайте разберем, как это можно сделать.

Забегая вперед, могу сказать, что данный рецепт подходит не только для создания связки “BizTalk на SSL”, но и для WCF, поскольку лишь последние шаги будут специфичны для BizTalk Server 2010.

1. Создание сертификата Root Certificate Authority

  • Нужно открыть Visual Studio Command Prompt, перейти в ту директорию, куда хотим сохранять файлы сертификатов;
  • Введите команду
    Makecert –n «CN=MyBizTalkRootCA» –r –sv MyBizTalkRootCA.pvk MyBizTalkRootCA.cer

    image
  • В появившемся окне Create Private Key Password введите пароль для сертификата, нажать ОК
    image
  • В появившемся окне Enter Private Key Password введите пароль, который вводили на предыдущем шаге
    image
  • В директории появились два файла, MyBizTalkRootCA.pvk и MyBizTalkRootCA.cer
    image
  • Visual Studio Command Prompt не закрывайте, пригодится далее.

2. Установка Root Certificate Authority (Root CA)

Наш Root CA должен быть установлен на серверные и клиентские машины, поскольку он будет использоваться в процессе верификации сертификатов, которые будут созданы с его использованием. Все шаги из этого пункта нужно будет совершать на сервере и на клиенте.

  • Запустите MMC (Run – mmc)
  • Добавьте оснастку Certificates (computer account, поскольку нужно сделать наш сертификат доступным для всех пользователей, и local computer)
    imageimage
  • В дереве оснастки перейдите на узел Trusted Root Certification Authorities, щелкните правой кнопкой по нему, выберите пункт Import из контекстного меню
    image
  • В появившемся окне нажмите Next, и выберите MyBizTalkRootCA.cer из директории, куда сохраняли файлы сертификатов, на остальных шагах мастера оставляйте дефолтные значения
  • Наш сертификат появится в списке сертификатов Trusted Root Certification Authorities\Certificates. По двойному щелчку открывается окно свойств сертификата
    image

3. Установка сертификата сервиса на сервер

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

  • Откройте Visual Studio Command Prompt (активной директорией должна быть та, в которую сохраняли файлы сертификатов)
  • Выполните команду
    makecert –sk <KeyName> –iv MyBizTalkRootCA.pvk –n “CN=<MachineName>” –ic MyBizTalkRootCA.cer –sr localmachine –ss my –sky exchange –pe

    где <KeyName> – уникальное имя и <MachineKey> – имя сервера, которое должно совпадать с DNS или NetBIOS именем (в свойствах системы, вызываемой по Win+Break, это строка Full computer name). Подробнее о команде makecert можно прочитать тут.
  • Команда запросит пароль к сертификату, вводим тот, что задавали при создании файлов сертификата.
    image
  • Установленный сертификат можно просмотреть в оснастке Certificates (Local Computer) \ Personal \ Certificates

4. Настройка сайта для использования сертификата SSL

Итак, у нас есть установленный сертификат, который будет выступать от имени Certificate Authority, и есть сертификат, который будет использоваться нашим сайтом. Теперь этот самый сайт нужно настроить на использование SSL.

  • Выберите в IIS Manager сайт, который нужно настроить на использование SSL
  • Щелкните правой кнопкой по узлу, выберите пункт “Edit bindings…”
    image
  • Появится окно со всеми биндингами. Если есть биндинг с Type=”https”, нужно его удалить. Далее нажмите кнопку “Add…” и настройте согласно рисунку ниже
    image
    В поле SSL certificate выберите тот сертификат, который был сгенерирован ранее.

Настройка самого сайта, в котором хостятся наши службы доступа к BizTalk, крайне проста. Нужно выбрать сайт в дереве IIS Manager, выбрать фичу SSL Settings и настроить как на рисунке ниже, после чего щелкнуть Apply в панели Actions.

image image

После закрытия всех окон сайт настроен на использование SSL.

5. Экспорт клиентского сертификата

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

  • Откройте MMC, добавьте оснастку Certificates (с настройками Computer Account \ Local Computer)
  • Перейдите на узел Certificates (Local Computer) \ Personal \ Certificates
  • Выберите созданный вами сертификат (его имя должно совпадать с именем сервера), щелкните правой кнопкой по нему, в контекстном меню выберите All Tasks \ Export
    image
  • В мастере нужно выбрать вариант с экспортом закрытого ключа, остальное всё по умолчанию.
    image
  • В итоге должен получиться файл с расширением PFX.

6. Импорт сертификата на клиент

Теперь нам нужно импортировать сертификат, который мы создали на предыдущем шаге. К этому моменту на клиенте уже должен быть установлен сертификат Root CA (см. шаг 2), это обязательное условие.

  • Откройте на клиенте консоль MMC, добавьте оснастку Certificate (My user account)
  • Перейдите на узел Certificates (Current User) \ Personal \ Certificates
  • Щелкните по нему правой кнопкой, в контекстном меню выберите All Tasks \ Import и импортируйте файл, который вы создали на предыдущем шаге (с расширением PFX).

7. Настройка WCF-сервиса

Итак, вроде бы всё готово. Нам теперь остается сконфигурировать BizTalk для использования SSL. Пусть у нас уже есть опубликованный WCF-сервис, на который настроен Receive Location. Его настройка крайне проста:

  • Открываем BizTalk Server Administration (команда «<Program Files>\Microsoft BizTalk Server 2010\BTSMMCLauncher.exe» BTSmmc.msc, кстати, недавно заметил, что ее можно открыть также через VS, в меню Tools после установки BizTalk Server 2010 появляется соответствующая команда)
  • Выбираем в узле BizTalk Server Administration \ BizTalk Group \ Applications наше приложение, в нем выбираем Receive Location, выбираем нужный нам receive location, открываем его свойства
    image
  • Нажимаем кнопку Configure…, в появившемся окне переходим на вкладку Security и настраиваем всё так, как показано на рисунке ниже, после нажимаем OK.
    image
  • Переходим на раздел Certificates в том же окне свойств Receive Location Properties
  • Нажимаем кнопку Browse… и выбираем установленный нами сертификат, нажимаем везде OK.
    image
    Внимание. Если вы нажали на кнопку Browse…, а в появившемся окне нет нужного сертификата, вам нужно установить PFX-файл сертификата в Certificates (Local Computer) \ Other People (через импорт, как на шаге 6). После этого злополучный сертификат таки появляется в окне выбора.
  • Затем идем в папку с сервисом (обычно это c:\inetpub\wwwroot\<Имя сервиса>), открываем web.config и комментируем следующую часть:
    <endpoint name="HttpsMexEndpoint" address="mex" binding="mexHttpsBinding" bindingConfiguration="" contract="IMetadataExchange" />


    Хотя Серотер пишет, что эту часть наоборот нужно разкомментировать, но у меня с этой строчкой появлялась ошибка “The SSL settings for the service ‘None’ does not match those of the IIS ‘Ssl, SslNegotiateCert, SslRequireCert, SslMapCert’” при попытке просмотреть сервис в браузере или дернуть его. Подробнее см. здесь.

    В итоге web.config должен выглядеть примерно так:

    <?xml version="1.0" ?>
    <configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
    	<configSections>
    		<section name="bizTalkSettings"
    		         type="Microsoft.BizTalk.Adapter.Wcf.Runtime.BizTalkConfigurationSection, Microsoft.BizTalk.Adapter.Wcf.Runtime, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
    	</configSections>
    	<bizTalkSettings>
    		<mexServiceHostFactory debug="false">
    			<receiveLocationMappings>
    				<!--add markupFileName="*.svc" receiveLocationName="?" publicBaseAddress="protocol://host[:port]" /-->
    			</receiveLocationMappings>
    		</mexServiceHostFactory>
    		<webServiceHostFactory debug="false" />
    		<isolatedReceiver disable="false" />
    		<btsWsdlExporter disable="false" />
    	</bizTalkSettings>
    	<appSettings />
    	<connectionStrings />
    	<system.web>
    		<compilation defaultLanguage="c#"
    		             debug="false"
    		             targetFramework="4.0">
    			<assemblies>
    				<add assembly="Microsoft.BizTalk.Adapter.Wcf.Common, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
    				<add assembly="Microsoft.BizTalk.Adapter.Wcf.Runtime, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
    				<add assembly="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    			</assemblies>
    		</compilation>
    		<authentication mode="Windows" />
    		<pages controlRenderingCompatibilityVersion="3.5"
    		       clientIDMode="AutoID" />
    	</system.web>
    	<system.serviceModel>
    		<behaviors>
    			<serviceBehaviors>
    				<behavior name="ServiceBehaviorConfiguration">
    					<serviceDebug httpHelpPageEnabled="true"
    					              httpsHelpPageEnabled="true"
    					              includeExceptionDetailInFaults="true" />
    					<serviceMetadata httpGetEnabled="false"
    					                 httpsGetEnabled="true" />
    				</behavior>
    			</serviceBehaviors>
    		</behaviors>
    		<services>
    			<!-- Note: the service name must match the configuration name for the service implementation. -->
    			<service name="Microsoft.BizTalk.Adapter.Wcf.Runtime.BizTalkServiceInstance"
    			         behaviorConfiguration="ServiceBehaviorConfiguration">
    				<!--<endpoint name="HttpMexEndpoint" address="mex" binding="mexHttpBinding" bindingConfiguration="" contract="IMetadataExchange" />-->
    				<!--<endpoint name="HttpsMexEndpoint" address="mex" binding="mexHttpsBinding" bindingConfiguration="" contract="IMetadataExchange" />-->
    			</service>
    		</services>
    	</system.serviceModel>
    </configuration>

* В статье-оригинале можно посмотреть, как настроить SSL для WCF-сервиса через web.config, там же можно посмотреть, как настроить WCF-клиент на работу с сервисом.

8. Настройка soapUI

Для тестирования я использую удобную утилиту под названием soapUI. При использовании SSL нужно указать сертификат клиента (который создавали на шаге 5) в настройках утилиты:

image

Итог

Мы рассмотрели вариант настройки среды для работы через SSL, который включает в себя генерацию сертификатов, их установку и настройку Receive Location через оснастку BizTalk Server Administration.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *