Проверка собственного сертификата в службе WCF - PullRequest
12 голосов
/ 13 октября 2009

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

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

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

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

UPDATE: Моя конфигурация:

<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");
        }
    }

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

Ответы [ 3 ]

14 голосов
/ 13 октября 2009

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

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

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

7 голосов
/ 28 января 2010

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

1 голос
/ 13 сентября 2010

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

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

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