Клиент WCF не может подключиться к серверу WCF без наличия сертификата сервера на локальном компьютере. - PullRequest
3 голосов
/ 23 марта 2012

Сценарий таков: на разных машинах развернуто 2 веб-службы WCF, один клиент (WCFClient), один сервер (WCFServer). Мне нужно было сертификатное соединение между ними.

На сервере WCF я установил привязку для использования сертификатов в качестве типа учетных данных клиента.

<security mode="Message">
      <message clientCredentialType="Certificate" />
</security>

Также в разделе поведения, среди прочих настроек, у меня есть

<serviceBehaviors>
      <behavior name="Server.ServiceBehavior">                  
          <serviceCredentials>
            <clientCertificate>
              <authentication certificateValidationMode="PeerTrust"/>
            </clientCertificate>
            <serviceCertificate findValue="Server"
            storeLocation="LocalMachine"
            storeName="TrustedPeople"
            x509FindType="FindBySubjectName" />
          </serviceCredentials>
        </behavior>
</serviceBehaviors>

На клиентской службе WCF я добавил это поведение конечной точки

<endpointBehaviors>
   <behavior name="CustomBehavior">
     <clientCredentials>
       <clientCertificate findValue="Client" 
                          x509FindType="FindBySubjectName" 
                          storeLocation="LocalMachine" 
                          storeName="TrustedPeople" />
       <serviceCertificate>            
         <authentication certificateValidationMode="PeerTrust"/>
       </serviceCertificate>
     </clientCredentials>
   </behavior>
 </endpointBehaviors>

Когда я хотел проверить свои услуги, у меня было сообщение об ошибке:

The service certificate is not provided for target 'http://blablabla...'. Specify a service certificate in ClientCredentials.

Так что я начал проверять вещи в Интернете. После многих попыток единственное, что на самом деле сработало, это добавило это на мой клиент:

<serviceCertificate>
         <defaultCertificate findValue="Server"
                             storeLocation="LocalMachine"
                             storeName="TrustedPeople"
                             x509FindType="FindBySubjectName" />
         <authentication certificateValidationMode="PeerTrust"/>
       </serviceCertificate>

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

Я бы хотел понять, что на самом деле может вызвать это сообщение об ошибке и какое может быть решение.

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

Ответы [ 3 ]

3 голосов
/ 23 марта 2012

Глядя здесь читает,

При рассмотрении аутентификации вы можете привыкнуть думать в первую очередь о личности клиента.Однако в контексте WCF аутентификация обычно относится к взаимной аутентификации.Взаимная аутентификация не только позволяет идентифицировать клиентов, но также позволяет клиентам идентифицировать сервисы WCF, к которым они подключены.Взаимная проверка подлинности особенно важна для служб WCF с выходом в Интернет, поскольку злоумышленник может подделать службу WCF и перехватить вызовы клиента для выявления конфиденциальных данных.

Используемые учетные данные службы в значительной степени зависят отвыбранная вами схема аутентификации клиента.Как правило, если вы используете проверку подлинности клиента, отличного от Windows, такую ​​как проверка подлинности имени пользователя или сертификата, сертификат службы используется как для проверки подлинности службы, так и для защиты сообщений.Если вы используете аутентификацию клиента Windows, учетные данные Windows идентификатора процесса можно использовать как для аутентификации службы, так и для защиты сообщений.

Мне кажется, что вам do нужнасертификат сервера на клиентском компьютере, и это хорошо, а не плохо.Обратите внимание, что не нужен (и не должен помещаться) закрытый ключ сервера на клиентском компьютере.Закрытый ключ не содержится в сертификате - только открытый ключ.

Наличие сертификата сервера на клиентском компьютере означает только наличие открытого ключа сервера на клиентском компьютере.Преимущество заключается в том, что клиент теперь знает, что он общается с реальным сервером.

Я не знаком со службами WCF, но, похоже, это нормально при использовании сертификатов.

1 голос
/ 24 марта 2012

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

если вы используете wshttpbinding, вы можете установитьgotiateServiceCredential = true, и в этом случае клиент получит сертификат сервера динамически. Цена немного снижает производительность, и эта конечная точка не будет совместима с клиентами, не входящими в .net.

0 голосов
/ 11 июля 2012

Я действительно забыл об этом вопросе, но в то время я нашел решение.

Моя настоящая проблема заключалась в том, что я использовал базовую HttpBinding для связи, которую я хотел защитить.basicHttpBinding подразумевает использование этой части serviceCredential.http://msdn.microsoft.com/en-us/library/ms731338(v=vs.85).aspx

Из-за системных требований я изменил привязку на wsHttpBinding.Теперь мне не нужно помещать сертификат сервера на клиентскую машину.

...