Безопасность на транспорте WCF с помощью peertrust и самозаверяющих клиентских сертификатов - PullRequest
2 голосов
/ 12 июля 2010

Я уже некоторое время борюсь с WCF и, похоже, не могу этого понять. У меня есть собственный сервис WCF с включенным SSL (с использованием подписанного сертификата от самоподписанного корневого центра сертификации), пока что все хорошо. Услуга предназначена для делового общения, поэтому сертификаты кажутся лучшим решением.

(в настоящее время я использую привязку WS, но это только для целей разработки, поскольку все методы привязки поддерживают (насколько мне известно) безопасность на транспортном уровне с помощью клиентских сертификатов.)

Некоторые соответствующие биты конфигурации для службы:

<bindings>
  <wsHttpBinding>
    <binding name="wsHttpBinding">
      <security mode="Transport">
        <transport clientCredentialType="Certificate"/>
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

<!-- snip -->

<serviceCredentials>
  <clientCertificate>
     <authentication certificateValidationMode="PeerTrust" trustedStoreLocation="CurrentUser" />
  </clientCertificate>
</serviceCredentials>

Когда у меня есть клиент, использующий самозаверяющий сертификат, который находится в хранилище «доверенных лиц» пользователя, запустившего службу WCF, происходит сбой. Когда я использую сертификат, подписанный моим собственным корневым центром сертификации, он работает, даже если его нет в хранилище «доверенных лиц».

Я ожидал, что смогу использовать самозаверяющие сертификаты, хранить их в хранилище "доверенных лиц", и все будет работать. Но, кажется, происходит какая-то дополнительная проверка, там что-то мне не хватает? Есть ли лучший способ?

Ответы [ 3 ]

1 голос
/ 16 марта 2016

Я столкнулся с той же проблемой, когда мой самозаверяющий клиентский сертификат будет проверен, даже если его нет в хранилище «Надежные люди», несмотря на режим проверки «PeerTrust».Наконец-то я смог ограничить службу приемом только определенного клиентского сертификата, используя следующие режимы работы службы:

<behaviors>
   <serviceBehaviors>
      <behavior ...>
      ...
         <serviceCredentials>
            <clientCertificate>
               <authentication certificateValidationMode="PeerTrust"
                               revocationMode="NoCheck" 
                               trustedStoreLocation="LocalMachine" />
               <certificate findValue="NameOfClientCertificate"
                            x509FindType="FindBySubjectName"
                            storeLocation="LocalMachine"
                            storeName="TrustedPeople" />
            </clientCertificate>
         </serviceCredentials>
         ...
      </behavior>
      ...

И элемент аутентификации, и элемент сертификата должны были указывать направильный магазин, в данном случае "LocalMachine".

0 голосов
/ 07 ноября 2018

Мне удалось заставить его работать, используя следующие строки кода:

m_host = gcnew WebServiceHost( IService::typeid, baseAddress );
....
m_host->Credentials->ClientCertificate->Authentication->CertificateValidationMode = X509CertificateValidationMode::Custom;  //PeerTrust did not work here
m_host->Credentials->ClientCertificate->Authentication->CustomCertificateValidator = System::IdentityModel::Selectors::X509CertificateValidator::PeerTrust;

Похоже на ошибку WCF.

0 голосов
/ 13 июля 2010

Правильно, поэтому безопасность на транспорте и проверка сертификатов обрабатываются на более низком уровне, который WCF не контролирует.Так что все эти модные вещи с пользовательскими валидаторами и т. Д. Не работают с безопасностью транспорта, а только с защитой сообщений.Чтобы ограничить доступ от клиентов, все еще используя только безопасность транспорта, вам нужно настроить CTL (Certificate Trust List).Следующие сайты должны дать вам несколько указателей.

http://www.leastprivilege.com/CertificateBasedAuthenticationAndWCFTransportSecurity.aspx http://viisual.net/configuration/IIS7-CTLs.htm

...