Невозможно отправить данные POST в службу отдыха WCF при использовании безопасности транспорта и клиентских сертификатов - PullRequest
2 голосов
/ 14 декабря 2010

У меня есть собственная служба WCF REST на основе WebHttpBinding. Один из методов службы выглядит примерно так:

    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "myMethod")]
    Stream MyMethod(Stream contents);

Я написал простую тестовую программу, которая создает запрос HttpWebRequest, чтобы попытаться отправить данные POST этому методу. Это прекрасно работает в следующих сценариях:

  1. Сервис не использует никакой безопасности.
  2. Служба использует транспортную безопасность без сертификата клиента.
  3. Сервис использует транспортную безопасность с клиентским сертификатом и I POST 0 байтов.

Если я пытаюсь использовать безопасность транспорта с сертификатом клиента POST более 0 байтов, служба возвращает HTTP 403 (запрещено) и никогда не затрагивает мой код.

Это сводит меня с ума.

Есть идеи?

UPDATE

После включения трассировки для http.sys я заметил следующее сообщение в трассировке:

Попытка приложением сервера получить сертификат клиента не удалась со статусом: 0xC0000225.

Кто-нибудь знает, что это значит? Я уверен, что отправляю сертификат клиента и уверен, что он является доверенным на хост-компьютере.

Ответы [ 3 ]

0 голосов
/ 15 декабря 2010

Необходимо включить защиту как на клиенте, так и на сервере.

  1. На сервере в веб-конфигурации необходимо настроить привязку безопасности: TRANSPORT и CERTIFICATE

  2. На клиенте при создании запроса HttpWebRequest также необходимо включить ТРАНСПОРТ и СЕРТИФИКАТ.Вам также следует программно назначить клиентский сертификат.

  3. Порт SSL (443) должен быть открыт - проверьте по telnet.

  4. Иногда глагол POST имеет видотключено IIS.Вы должны включить его

, если вам нужна дополнительная информация или у вас есть вопрос, отправьте код и файл web.config.

0 голосов
/ 23 декабря 2010

После долгих и мучительных поисков я наконец обнаружил, что проблема в поврежденном клиентском сертификате.Хотя никаких внешних указаний не было, закрытый ключ для этого сертификата не был сохранен на локальном компьютере.Мы сгенерировали сертификат в коде, а затем импортировали его в личный магазин текущего пользователя.Однако мы не установили свойство RSACryptoServiceProvider.PersistKeyInCsp для объекта, используемого для генерации закрытого ключа.В результате .NET удалил контейнер закрытого ключа, и импортированный сертификат в итоге ссылался на несуществующий закрытый ключ.

Ответ на этот пост более подробно освещает проблемы импорта сертификатов с помощью .NET: Вставка сертификата с закрытым ключом .

0 голосов
/ 14 декабря 2010

Возможно, вам нужно установить сертификат SSL для вашего локального хоста.

1) Run -> "mmc"

2) Файл -> Добавить / удалить оснастку ...

3) В разделе «Доступные оснастки» выберите «Сертификаты» и «Добавить>»

4) Выберите «Учетная запись компьютера»

5) Нажмите «Далее»

6) Нажмите «Готово»

7) Нажмите «ОК»

8) Посмотрите в личном кабинете -> Сертификаты. Я думаю, у вас должно быть 127.0.0.1

.

9) Нажмите и перетащите этот сертификат в «Доверенные корневые центры сертификации»

Тогда какой бы адрес вы ни использовали, вам нужно изменить этот URL-адрес на 127.0.0.1 (не localhost), так как он не будет работать. Сертификат должен быть действительным, и я думаю, что вы сможете пройти авторизацию.

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

Чтобы помочь вам использовать трассировку WCF, чтобы увидеть, в чем конкретно проблема может возникнуть после этого, я постыдно укажу вам на мой пост в блоге. :)

http://jtstroup.net/post/Wcf-Tracing.aspx

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...