пятница, 16 марта 2012 г.

Веб-служба и SSL

    Обмен открытыми данными - это конечно просто. Но не слишком хорошо, потому их нужно шифровать, во избежание.

    Вся настройка самой веб-службы, при использовании сертификатов ограничивается настройкой биндинга. Использовать буду wsHttpBinding. Он предназначен для безопасной передачи данных по http. Собственно, весь биндинг выглядит так:

      <wsHttpBinding>
        <binding name="wsTestChecking">
          <security mode="Transport">
            <transport clientCredentialType ="Certificate" />
          </security>
        </binding>
      </wsHttpBinding>

Поскольку вся обработка будет происходить на данной службе, шифровать сообщения не буду, только транспорт.
    Теперь настройка Сервера.
    Первым делом нужно установить на компьютер, на котором он развернут, сертификат. Откуда его брать - вопрос отдельный, я брал у контроллера домена. Для этого пуск-выполнить, ввожу mmc. Открывается формочка, на ней файл-добавить или удалить оснастку, из списка выбираю "сертификаты". В открывшемся окне отмечаю пункт "учетной записи компьютера" - далее - указываю что управление ведется локальным компьютером - готово - ок. В древовидном меню появляется пункт "Сертификаты (локальный компьютер)". Раскрываем его, выбираем пункт "Личное". Там пусто. Правой кнопкой по этому пункту - все задачи - запросить сертификат. Откроется мастер и в два щелчка добавит сертификат компьютера.
    Затем настройка IIS.
    Для этого открываем диспетчер сервера, переходим в диспетчер служб IIS и выбираем из древовидного меню начальную страницу (только не пункт "Начальная страница" а пункт с именем компьютера). Выбираем "Сертификаты сервера", убеждаемся что полученный сертификат виден. Затем переходим в пункт "Проверка подлинности" и включаем проверку подлинности клиента Active Directory.
    Затем переходим к нужному сайту. Выбираем "привязки", жмем "Добавить", в открывшейся форме выбираем тип = https, назначаем порт и выбираем сертификат. Жмем Ок.
    Теперь выбираем "Параметры SSL". Ставим галочку напротив "Требовать SSL" и в "Сертификаты клиента:" тоже выбираем "требовать".
    Осталось указать проверку подлинности. Выбираем соответствующий пункт, включаем анонимную проверку (поскольку пользователь предоставляет сертификат), олицетворение (чтобы на основе сертификата подключившийся пользователь олицетворился с пользователем домена) и проверку подлинности Windows. Проверку подлинности Windows нужно настроить дополнительно: справа выбираем пункт меню "Поставщики" и в открывшейся форме ставим первым сверху поставщиком NTLM.
    На этом настройка службы завершена.

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


proxy.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.PeerTrust;

proxy.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySubjectName, "sert_name");

Нужно учитывать один момент: при установке соединения с сервером проверяется совпадение имени сервера, с которым соединяемся, и имени сервера в предоставляемом сервером сертификате. И если они не совпадут - вернется ошибка. Например, у вас сертификат выдан на сервер с именем server.domen.org, а обращаетесь вы просто к server. Вроде все правильно, но придет сообщение о невозможности установить соединение.
Как эту проблему решить? Есть 2 метода:
- правильный - обращаться строго по имени, на которое выдан сертификат.
- и верный - просто игнорировать эту ошибку, добавив после вышеуказанных строк работы с сертификатом :

System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

Похожие посты:

Комментариев нет:

Отправить комментарий