Подключение к ASP.NET web сервису по протоколу HTTPS (SSL)

Наиболее простым и надежным способом обеспечения безопасного взаимодействия с XML web сервисом, разработанном на ASP.NET является подключение по протоколу HTTPS (SSL). Данный способ обеспечивает полное шифрование трафика на уровне транспортного протокола и не требует от разработчика web сервиса принятия, каких либо дополнительных мер для обеспечения его поддержки.

Введение


 

Наиболее простым и надежным способом обеспечения безопасного взаимодействия с XML web сервисом, разработанном на ASP.NET является подключение по протоколу HTTPS (SSL). Данный способ обеспечивает полное шифрование трафика на уровне транспортного протокола и не требует от разработчика web сервиса принятия, каких либо дополнительных мер для обеспечения его поддержки.


 

Однако при разработке клиентской части требуется определенные усилия для установления соединения с web сервисом через HTTPS. Требуется соответствующим образом сконфигурировать прокси класс web сервиса, а также необходимо проинсталлировать клиентский сертификат.


 

Использование ASP.NET web сервисов совместно с протоколом HTTPS открывает нам большие возможности построения распределенных систем с хорошим уровнем защищенности без особых затрат. Однако на этом пути нас поджидает масса неожиданностей и подводных камней, заботливо расставленных парнями из Редмонта, которые запросто могут поставить нас в тупик. Данная статья обобщает опыт автора в данной области. Предполагается, что читатель уже знаком с web сервисами ASP.NET и имеет некоторый опыт практического использования их.


 

Включаем HTTPS на сервере.


 

Прежде всего, для того, чтобы иметь возможность работать с HTTPS протоколом, необходимо включить его поддержку на сервере IIS. Делается это очень просто, однако есть одна сложность, которая может показаться на первый взгляд непреодолимой – необходимо получить серверный сертификат


 

Руководство рекомендует открыть оснастку MMC “Internet Information Services”, выбрать сайт и открыть окно его свойств. На вкладке “Directory security” есть кнопка “Server Certificate…”, которая запускает мастера запроса нового сертификата. Этот мастер, задав вам массу вопросов, сформирует файл запроса, который предлагается отправить в “certification authority” для получения серверного сертификата. Беда в том, что фирмы, занимающиеся выдачей сертификатов, требуют за это деньги, и вам придется долго объяснять в бухгалтерии для чего необходимо перечислить 20 долларов в какой-то там VeriSign


 

Возможно, в локальной сети вашей компании развернута служба “Enterprise Certificate Services”. В таком случае вам сильно повезло, и вам остается обратиться к администратору и получить заветный сертификат.


 

Ну и, наконец, есть третий способ. Специально для того, чтобы разработчики могли тестировать свои продукты, Microsoft выпустила “ IIS6 Resource Kit Tools”, в состав которого входит утилита SelfSSL (скачать можно здесь http://www.microsoft.com/downloads/details.aspx?FamilyID=56fc92ee-a71a-4c73-b628-ade629c89499&DisplayLang=en). Несмотря на то, что Resource Kit предназначен для сервера IIS6 большинство входящих в него утилит (и SelfSSL в том числе) прекрасно работают и с IIS5.1, который входит в состав Windows XP Prof. Сертификаты, которые генерирует эта утилита, вполне пригодны для целей тестирования.


 

Итак, для того, чтобы установить серверный сертификат, вам необходимо проинсталлировать “IIS Resource Kit”. Далее запускаем утилиту: меню Start -> All Programs -> IIS Resources ->SelfSSL. Например, следующая команда создаст сертификат с именем компьютера, для дефолтного сайта со сроком действия в один год:


 

selfssl.exe /s:1 /v:365
 

 

Умная утилита не только создаст сертификат, но и установит его на сайт. Чтобы убедиться в этом, открываем оснастку MMC “Internet Information Services”, выбираем “Default web site” и открываем окно его свойств. На вкладке “Directory security” теперь доступна не только кнопка “Server Ccertificate…” но и “View certificate…”. Нажав на нее, мы можем увидеть наш свежий сертификат.


 

 



 

 


 

Значок сертификата будет помечен красным крестиком и сопровожден надписью “This CA Root certificate is not trusted because it is not in the Trusted Root Certification Authorities store”. Пока мы не станем обращать на это внимание, потому что это не мешает нам работать с нашим сертификатом.


 

После того, как серверный сертификат установлен на сайте, нам остается включить поддержку SSL. Делается это на той же вкладке “Directory security” на странице свойств сайта. В разделе “Security Communications” нажимаем кнопку “Edit” (она тоже стала доступна после установки сертификата). В появившемся диалоге выставляем флажок “Require secure communications” и жмем “Ok”.


 

 



 

 


 

Все, поддержка SSL включена, можно приступать к тестированию web сервиса over HTTPS.


 

Конфигурирование клиентского прокси класса.


 

В данной статье я не буду рассматривать вопросы создания web сервиса и клиентского прокси для него. Предположим, web сервис уже существует, и для его использования вы уже добавили web reference web сервис в свой проект. Рассмотрим, как сконфигурировать клиентский прокси класс web сервиса для работы с ним по HTTPS.


 

Прежде всего, URL web сервиса должен начинаться с “https://”


 

WebServiceProxy service = new
WebServiceProxy(); service.Url =”https://server/webservice.asmx”;


 

 

Очевидно также, что если вам необходимо защищенное соединение с web сервисом, доступ к нему должен предоставляться только аутентифицированным пользователям. Для этого мы должны установить удостоверения пользователя (Credentials) от имени которого будет отправлен запрос к web сервису. Существует два способа установки удостоверений. Первый, вызов от имени текущего пользователя.


 

service.credentials = CredentialCache.DefaultCredentials;

 

 

Текущим пользователем будет являться пользователь, который запустил ваше приложение. Этот режим аутентификации называется “Windows Integrated”, его например, активно использует Internet Explorer при работе с ASP и ASP.NET web приложениями под IIS. При этом пользователю не надо вводить свое имя и пароль при посещении сайта. Для аутентификации используются имя и пароль, введенные при входе в домен Active Directory или NT.


 

Данный способ аутентификации хорош для консольного или Windows Forms приложения. Однако если вы разрабатываете web приложение, или windows службу CredentialCache.DefaultCredentials вернет вам удостоверения учетной записи, под которой исполняется серверный процесс. Ею может оказаться учетная запись ASPNET, SYSTEM, NETWORK SERVICE или какая ни будь другая, и это будет совсем не то, что нужно вам. В этих случаях необходимо явно указать удостоверения пользователя:


 

service.credentials = new
NetworkCredential(“user”, “password”, “domain”);

 

 

При этом в качестве “domain” может быть указано имя компьютера, если используется учетная запись локального пользователя, либо ничего не казано. В последнем случае используем перегруженный конструктор NetworkCredential с двумя параметрами.


 

И, наконец, третье условие, без которого нам никогда не удастся выполнить вызов web сервиса по HTTPS - это клиентский сертификат. У вас должен быть файл клиентского сертификата вашего сервера, и вы должны указать его прокси классу. К сожалению, .Net Framework версии 1.1, о котором мы ведем речь, не поддерживает работу с хранилищем сертификатов Windows. Поэтому нам придется загружать сертификат из файла:


 

service.ClientCertificates.Add( System.Security.Cryptography.X509Certificates.X509Certificate.CreateFromCertFile(“c:\test.cer”));
 

 

Теперь можно считать, что прокси класс готов к вызову web методов сервиса. В некоторых случаях вам может потребоваться установить значение свойства Proxy, однако рассмотрение этого вопроса выходит за рамки данной статьи.


 

Остается открытым вопрос, где взять файл с клиентским сертификатом X.509, который необходимо передать в качестве параметра метода X509Certificate.CreateFromCertFile()?


 

Получение клиентского сертификата X.509


 

HTTPS для установления защищенного соединения использует протокол SSL, которому для шифрования данных требуется открытый ключ, который в свою очередь и содержится в клиентском сертификате X.509. Как получить клиентский сертификат? Для этого воспользуемся Internet Explorer-ом. Введем в адресной строке URL вашего web сервиса начинающегося с https. С большой вероятностью, при этом мы увидим окошко “Security alert”.


 




 

 


 

При нажатии кнопку “View Certificate” откроется уже знакомое нам окно сертификата. В случае если предупреждение не отображается на экране, мы все равно можем увидеть сертификат, щелкнув по иконке замочка в правом нижнем углу окна IE.


 

 



 

 


 

В появившемся окне “Certificate” выбираем вторую вкладку “Details” и нажимаем кнопку “Copy to file…”. Появится “Certificate Export Wizard”


 



 

 


 

Выбираем опцию “DER encoded X.509 (.CER)”, вводим имя файла на следующем экране визарда и сохраняем сертификат в файл. Теперь файл сертификата у нас есть.


 

Остается обратить внимание на два существенных момента.


 

Первое. Сертификат содержит имя сервера, которому он выдан.


ПРЕДУПРЕЖДЕНИЕ

 

Будьте внимательны! URL сервиса должен содержать именно это имя в своем составе, иначе соединение не будет установлено.
 


 

Будьте внимательны. Например, у вас есть сервер Myserver.Company.com и вам выдан сертификат на имя Myserver. При этом соединение по адресу
https://Myserver/service.asmx
будет успешно установлено, а по адресу
https://Myserver.Company.com/service.asmx
вызовет ошибку. Помните об этом.


 

Второе. Клиентский сертификат, о котором говорилось выше, должен быть проинсталлирован в хранилище сертификатов локальной машины. В противном случае при попытке установить соединение мы получим невнятное сообщение об ошибке “Underlined connection was closed”. Чтобы проинсталлировать сертификат откроем его файл, и на первой вкладке окна “Certificate” нажмем кнопку “Install Certificate…”


 



 

 


 

Откроется окно “Certificate Import Wizard”. Нам надо указать, что инсталлировать сертификат надо именно в хранилище локального компьютера (а не локального пользователя). Нажмем кнопку “Next” выберем опцию “Place all certificates in the following store” и жмем кнопку “Browse…”. В появившемся окне “Select Certificate Story” надо отметить флаг “Show physical stores”, а в дереве выбрать “Trusted Root Certification Authorities” -> “Local Computer”. Нажимаем “Ok”.


 

В окне “Certificate Import Wizard” нажимаем "Next” и “Finish”.


 

Заключение


 

Итак, мы рассмотрели, как обеспечить безопасное и защищенное соединение с web сервисом, используя для этого SSL. Мы узнали, как получить и установить серверный сертификат и включить на сайте использование HTTPS (SSL). Рассмотрели, как сконфигурировать клиентский прокси класс web сервиса для соединения по HTTPS. Рассмотрели самый простой способ получения файла клиентского сертификата X.509 необходимого для установления соединения. А также узнали, как проинсталлировать клиентский сертификат в хранилище локальной машины.

Источник: http://stump-workshop.blogspot.com



Опубликовал admin
19 Дек, Вторник 2006г.



Программирование для чайников.