(MVC) MVC (2011 год)

Организация SSL транспортного уровня по программно загружаемому клиентскому сертификату.

Мне довольно часто приходится заниматься организацией защищенных соединений:


В принципе, защиту трафика можно организовать на различных уровнях:


Протоколы защиты бывают разные:


Теперь, когда я обьяснил что такое сертификат, как он используется для установления SSL-соединения - посмотрим куда его можно поставить - на сервер или на клиент:


Итак, на этой страничке я покажу, как работать с клиентскими сертификатами, но не просто для реквестов на web-сервер, как в моей софтине Электронная Москва в вашей квартире, а для SSL-реквестов к SOAP-WSDL сервису (который не имеет отображаемой в браузере странички). Причем в описании будет присутствовать одна особенность - клиентский сертификат будет не просто загружен в IIS, а будет искаться в хранилище сертификатов моим собственным кодом и загружаться для формирования SOAP-реквестов программно.

Если вы о хотите почитать о SOAP-WSDL сервисах вообще, то можете почитать следующие мои странички:


В виндузне существуют остнастка управления сертификатами - она раскрывает 13 узлов различного назначения из защищенного хранилища, в котором хранятся сертификаты. Этих 13-ти узловых защищенных хранилищ существует два - в контексте текущего пользователя и текущей машины. На скринах ниже видно, как после введения в командной строке MMC (менеждера управления остнастками) - можно запустить оснастку управления сертифкатами либо по контексту кампутера (LocalMachine) либо по контексту пользователя (CurrentUser):



Кроме того, для загрузки сертификатов в IIS7 нужна специальная оснастка ClientCertificateMapping - она отсутствует в изначальной комплектации IIS.

Кроме того, для преобразования различных форматов сертифкатов друг в друга, генерации ключей и всех прочих операций с сертификатами и ключами вам потребуется установить OpenSSL:



Итак, начинаем операции по организации SSL-шифрования на основе клиентского сертификата начинается с генерации личного секретного ключа:

  • Создаем пару секретный ключ и публичный ключ:

  • И отправляем CSR-файл с публичным ключом на подписание на сервер. Там удостоверяют наш публичный ключ своим публичным ключом, записывают в какую-то свою базу на сервере - имя клиента, чтобы когда WEB-сервер поднимет с транспортного уровня Request.ServerVariables("HTTP_CERTIFICATE_NUMBER") и Request.ServerVariables("HTTP_SUBJECT") - можно было понять что именно за клиент обратился по SSL на сервер. И создают собственно сертификат в формате CRT - это уже сертификат, который содержит и наш открытый клиентский ключ и подпись сервера, которым заверен наш ключ. Весь этот процесс называется Enrolment сертификата.

  • Теперь нужно собрать пакет PFX, который будет содержать и наш секретный ключ, и наш открытый ключ, подписанный сервером.

  • Теперь этот PFX-сертификат надо установить. Этот сертификат содержит уже не только открыто распространяемую информацию (наш личный открытый ключ, заверенный сервером), но и наш личный секретный ключ, применяемый для расшифровки ответов. Предпочтительно выбирать защищенное Windows-хранилище My.

  • Теперь надо обеспечить, чтобы учетная запись (под которой выполняется узел IIS) - имела право доступа к этому сертификату. Тут есть тысяча способов. Сейчас мне некогда возиться, я просто зашел на один из своих web-сервером и поставил что этот узел выполняется с правами администратора.

  • Теперь у нас все подготовительные работы выполнены, создан правильный сертификат, установлен в IIS и к нему обеспечен доступ со стороны нашей проги. Пришло время заняться прогой.

    Я отработал себе вот такой шаблон кода для SSL-обращения к защищенному SOAP-WSDL сервису: