Создание веб-службы, которая требует клиентских сертификатов - PullRequest
2 голосов
/ 08 декабря 2010

В настоящее время я работаю над проектом, который имеет следующие компоненты (все .NET 2.0)

  1. Клиентское приложение
  2. API вызова веб-службы
  3. Веб-служба

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

Следующим этапом проекта была защита Web-сервиса с помощью SSL.Поэтому я создал «Самоподписанный ЦС» и на этом подписал сертификат сервера для IIS.Опять же, красиво и просто, и все это работает именно так, как я хочу.

Следующим этапом проекта является защита веб-службы, требуя от вызывающего предоставить клиентский сертификат.Итак, я создал сертификат клиента (с помощью СА с собственной подписью).Затем я добавляю это к вызову вызова веб-службы в API:

WSBridge.Processor processor = new WSBridge.Processor();
processor.Url = this.endpoint;
processor.ClientCertificates.AddRange(this.clientCertificates);
processor.Timeout = (int)Settings.Default["DefaultTimeout"];

При отладке я вижу, что this.clientCertificates содержит сертификат, который я создал.Таким образом, теоретически он представляется веб-серверу.

Однако, когда я пытаюсь вызвать веб-сервис, я получаю следующее исключение в API:

The request failed with HTTP status 403: Forbidden.

Достаточно самообъяснение,но я понятия не имею, что является причиной проблемы.

Другая важная информация:

  • В моей среде разработки Клиент, API и веб-служба работают на одном компьютере
  • Если я пытаюсь получить доступ к описанию веб-службы в IIS, я получаю следующую ошибку (мне не предлагается выбрать сертификат клиента):

    Ошибка HTTP 403.7 - запрещено Страницавы пытаетесь получить доступ, требует, чтобы ваш браузер имел клиентский сертификат Secure Sockets Layer (SSL), который распознает веб-сервер.

  • Клиентский сертификат загружается в Личное хранилище длятекущий пользователь, корень CA находится в доверенном корне для локального компьютера и текущего пользователя.

  • Если я отключу «Требовать SSL» и поставлю «Сертификат клиента»s "примите в IIS, я могу сделать свой запрос.Однако, когда я смотрю на HttpContext.Current.Request.ClientCertificate.Count в веб-службе, это возвращается как 0.

  • Мне нужно иметь возможность запускать свою разработку с клиентскими сертификатами, так как части кода службы используютCN сертификата клиента для выполнения различных действий.Я мог бы взломать его, но было бы неплохо иметь возможность сделать реальный конец в конец.

  • Все упомянутые здесь сертификаты были сгенерированы с использованием OpenSSL.Я занимаюсь разработкой под Windows 7, поэтому у меня нет возможности установить Microsoft CA

Итак, у кого-нибудь есть идеи относительно причины этой проблемы?

В качестве отступления (не стоит создавать новый вопрос для этого) - по какой-то причине, когда я включаю SSL для веб-службы, Visual Studio больше не может отлаживать службу.

РЕДАКТИРОВАТЬ: дополнительная информация

  • Назначение сертификата клиента - <All>
  • Хотя я работаю на локальном хосте, сертификат сервера для веб-сервера был выдан devserver.xyz.com, поэтому яизменили мой файл hosts так, чтобы он указывал на localhost.Таким образом, теперь я могу просматривать (с отключенными сертификатами клиента в IIS) страницу дескриптора службы, не видя предупреждений о сертификатах SSL.

1 Ответ

3 голосов
/ 09 декабря 2010

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

Подробнее

Хотя плагин MMC Certificate отображал сертификат клиента в личном хранилище для текущего пользователя, я заметил, что при просмотре этого же магазина через Internet Explorer (Сервис -> Свойства обозревателя -> Содержимое -> Сертификаты) сертификат не былприсутствует.

После небольшого поиска в Google кажется, что IE будет принимать только формат PKCS12 для клиентских сертификатов, поэтому я конвертирую сертификат с помощью следующей команды OpenSSL:

openssl pkcs12 -export -in client_alpha.cer -inkey client_alpha.key -out client_alpha.p12

Затем я импортировал p12файл в IE, который позволил мне перейти на страницу описания веб-службы с полным TLS-сертификатом, сертифицированным клиентом / сервером.

После того, как я сделал это изменение, я повторил попытку клиентским приложением, и теперь это работает также.Это связано с тем, что IIS, как и IE, принимает клиентские сертификаты только в формате PKCS12.

...