Проверка собственного сертификата в службе WCF

Я хочу проверить клиентские сертификаты в моей службе WCF.

Моя цель - разрешить только клиентам с сертификатами с определенными отпечатками иметь возможность общаться с моим сервисом.

Моя служба WCF размещена в IIS, я использую basicHttpBinding и security mode = "transport" с типом учетных данных "Certificate". IIS требует клиентские сертификаты для связи с сервисом.

Заранее спасибо за помощь.

ОБНОВЛЕНИЕ: Моя конфигурация:

<basicHttpBinding>
<binding 
             name="testBinding"
         maxReceivedMessageSize="2147483647">
         <readerQuotas 
                    maxDepth="2147483647"
                maxStringContentLength="2147483647"
                maxArrayLength="2147483647"
                maxBytesPerRead="2147483647"
                maxNameTableCharCount="2147483647" />
 <security mode="Transport">
              <transport clientCredentialType="Certificate"/> 
             </security>

</binding>
</basicHttpBinding>

Поведение:

<serviceBehaviors>
    <behavior name="SomeServiceBehavior">
      <serviceMetadata httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
      <serviceCredentials>
        <clientCertificate>
          <authentication certificateValidationMode="Custom" customCertificateValidatorType="SomeService.CustomCertificateValidator,SomeService"  />
        </clientCertificate>
      </serviceCredentials>         
     </behavior> 
   </serviceBehaviors>

Сервисная конфигурация:

<service 
               behaviorConfiguration="SomeServiceBehavior"
               name="SomeService">
        <endpoint 
                  address=""
                  binding="basicHttpBinding"
                  bindingConfiguration="testBinding"
                  contract="ISomeService">
        </endpoint>
      </service>

И для целей тестирования я реализовал валидатор следующим образом:

public class CustomCertificateValidator : X509CertificateValidator
    {
        public override void Validate(System.Security.Cryptography.X509Certificates.X509Certificate2 certificate)
        {                
            throw new SecurityTokenValidationException("TEST Certificate was not issued by a trusted issuer TEST");
        }
    }

И это не работает. Я могу подключиться к своему сервису с любым действующим сертификатом.

13.10.2009 12:30:38
3 ОТВЕТА
РЕШЕНИЕ

Вы можете создать класс, производный от X509CertificateValidator, и использовать его для пользовательской проверки входящего сертификата. Бросьте исключение SecurityTokenValidationException, если вы хотите по какой-либо причине не пройти проверку.

Установите для CertificateValidationMode значение Custom и укажите свой валидатор в разделе о поведении службы clientCertificate файла конфигурации.

Как: создать сервис, который использует пользовательский сертификат валидатора

14
13.10.2009 12:51:24
Я пытался добавить пользовательский валидатор в clientCertificate, но он не работает. Похоже, что он предназначен для проверки сертификата клиента, который служба будет использовать в дуплексном режиме. Мне нужно проверить входящий сертификат (сертификат, который отправляет клиент). Вы пробовали эту опцию в этом сценарии?
empi 13.10.2009 12:54:22
Это может работать на стороне клиента или службы и используется для проверки сертификата входящего сообщения.
Maurice 13.10.2009 12:57:12
Я добавил свою конфигурацию. Вам нужна дополнительная информация?
empi 13.10.2009 13:07:35
Просто заметил, что вы используете транспорт вместо безопасности на уровне сообщений. Чтобы это работало, вам нужно использовать безопасность на уровне сообщений.
Maurice 13.10.2009 13:31:36
Вы можете использовать TransportWithMessageCredential в качестве режима безопасности. При этом используется сочетание HTTPS с безопасностью сообщений.
Maurice 13.10.2009 13:41:04

Я НЕ думаю, что в любом случае необходимо иметь «Проверка пользовательских сертификатов» с «Транспортной безопасностью». Работает только с «Message Security».

7
23.10.2016 12:14:37
Не правда. У меня есть пользовательская проверка сертификата, запущенная в транспортном режиме
Jeremy 24.04.2015 20:21:40

ДА, вы можете использовать basicHttpBinding с безопасностью, установленной на Transport, и вам нужно подключиться к созданию ServiceHost в IIS - см. Custom Service Host . Вы должны иметь возможность проверять значения отпечатков, сертификаты или любые другие данные, если вы создадите пользовательский раздел конфигурации для определения списка критериев проверки.

Пример кода для реализации всего вышеперечисленного доступен в загрузке кода из этой статьи CodeProject .

1
13.09.2010 15:33:37