2010-12-08 2 views
2

В настоящее время я работаю над проектом, который имеет следующие компоненты (все .NET 2,0)Создание веб-сервиса, который требует клиентских сертификатов

  1. Client Application
  2. Web Service Invocation API
  3. Web Service

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

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

Следующий этап проекта - обеспечить безопасность веб-службы, потребовав, чтобы invoker предоставил сертификат клиента. Поэтому я создал клиентский сертификат (через самоподписанный ЦС). Я затем добавить это к вызову вызова веб-службы в 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. 

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

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

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

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

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

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

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

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

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

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

EDIT: Некоторые больше информации

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

Вы добавили сертификат CA в хранилище доверенных сертификатов? – 2010-12-09 00:26:12

ответ

3

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

Более подробно

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

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

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

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

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

Смежные вопросы