Вопрос по https, wcf, certificate – Использование сертификата Wcf SSl через Tcp без сертификата клиента (только на стороне сервера)

5

Есть ли способ использовать WCF SSL с NetTcpBinding, который не требует установки сертификата клиента на клиентском компьютере? (SSL V2, если я не ошибаюсь).

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

мы используем NetTcpBinding, а не customBinding с обеих сторон. Если это может быть сделано, какова его правильная конфигурация? (на клиентских и серверных конфигурациях)

Заранее спасибо.


вот мои конфиги wcf.

SERVER CONFIG:



    <configuration>
      <system.serviceModel>
        <bindings>
         <netTcpBinding>
            <binding name="TcpSecureBinding">
            <security mode="Transport">
              <transport clientCredentialType="Certificate"/>            
            </security>
       </binding>
         </netTcpBinding>
       </bindings>
       <behaviors>
         <serviceBehaviors>
           <behavior name="ServiceCredentialsBehavior">          
             <serviceDebug includeExceptionDetailInFaults="True" />
             <serviceMetadata httpGetEnabled="true" />
             <serviceAuthorization 
                 principalPermissionMode="UseWindowsGroups">
             </serviceAuthorization>
          <serviceCredentials>
               <windowsAuthentication includeWindowsGruops="true"            
                                      allowAnonymousLogons="false"/>
               <clientCertificate>
                     <authentication certificateValidationMode="none"/>
               </clientCertificate>
               <serverCertificate
                   findValue="thumbprint"
                   storelocation="LocalMachine"
                   x509FindType="FindMyThumbprint"
                   storeName="My"/>
           </serviceCredentials>
        </behavior>
       </serviceBehaviors>
      </behaviors>
    <services>
        <service behaviorConfiguration="ServiceCredentialsBehavior"
               name="ServiceModel.Calculator">
          <endpoint address="net.tcp://localhost:8040/Calculator"
                  binding="netTcpBinding"
                  bindingConfiguration="TcpSecureBinding"
                  contract="ServiceModel.ICalculator" >
           <identity>
               <dns value="localhost"/>
           </identity>
         </endpoint>
        </service>
     </services>
    </system.serviceModel>
    </configuration>

CLIENT CONFIG:



    <configuration>
      <system.serviceModel>
        <client>
         <endpoint address="net.tcp://localhost:8040/Calculator"
                behaviorConfiguration="endpointCredentialBehavior"
                binding="netTcpBinding" 
                bindingConfiguration="Binding1" 
                contract="ServiceModel.ICalculator">
          <identity>
               <dns value="localhost"/>
          </identity>
          </endpoint>
        </client>
      <behaviors>
        <endpointBehaviors>
          <behavior name="endpointCredentialBehavior">
          </behavior>
         </endpointBehaviors>
       </behaviors>
       <bindings>
         <netTcpBinding>
          <binding name="Binding1">
            <security mode="Transport">
              <transport clientCredentialType="Windows" />
             </security>
          </binding>
          </netTcpBinding>
        </bindings>
     </system.serviceModel>
    </configuration>

я добавляю свой текущий сервер & amp; клиентские конфиги. другие вопросы:

  1. at the authentication level we want the client to authenticate ther server's cert (i think server's public key should be in trustedPeople store) , is this possible?

  2. do you recommend us use Transport Security Or Message?

  3. if we want to authenticate client & server by NTLM (clientCredentialType=Windows) is it can be done in addition to the server's cert authentication or just one of them can be applied? till now, we've used NTLM authentication.

  4. right now im getting exception: "The requested upgrade is not supported by 'net.tcp://servername:8040/**'. This could be due to mismatched bindings (for example security enabled on the client and not on the server)." i understand this error occured because the client is using Windows Security and server in om Certificate, but when im changing client security to Certificate also,im getting an error: "The client certificate is not provided". but i don't want to set client's certificate and thats part of my main problem.

  5. we read that we can use for server's cert authentication this tags:

    
        <identity>
          <certificate encodedValue="encoded certificate"/>
        </identity>
    

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

надеюсь, что вы сможете помочь в этом, еще раз спасибо.

Возможно. Что ты уже испробовал Bernard
Вам не понадобится сертификат клиента, если вы не попросите его; как выглядит ваша конфигурация привязки? Michael Edenfield
Может кто-нибудь помочь мне с нашей проблемой, пожалуйста? AmirT

Ваш Ответ

1   ответ
11

ность транспорта, тогда у вас есть 3 варианта, первый вариант требует сертификата обслуживания, второй вообще не требует сертификата, третий требует как сертификата обслуживания, так и сертификата клиента. для вашего сценария вы должны использовать option1, который будет аутентифицировать сервис через его сертификат и будет предлагать Конфиденциальность и Целостность для сообщений.

C >> Конфиденциальность
I >> Целостность
A >> Аутентификация (это произойдет для клиента)

1- Вариант один: (C + I), для клиента не будет выполняться аутентификация. В этом случае TCP SSL (не HTPS SSL) будет использоваться для предоставления C и I, а служба будет

<!--//Below are the configuration for both the service and the client-->
<netTcpBinding>
    <binding name="TcpSecureBinding">
      <security mode="Transport">
        <transport clientCredentialType="None"></transport>
      </security>
    </binding>
  </netTcpBinding>

Кроме того, поскольку будет использоваться TCP SSL, служба должна предоставить сертификат для клиента, поэтому необходимо установить сертификат на сервере и настроить службу для использования этого сертификата, чтобы подтвердить его подлинность, также необходимо установить корневой каталог. сертификат центра сертификации для сертификата службы на клиентском компьютере (как правило, в LocalMachine / Trusted Root Certification Authorities), и служба должна иметь приведенное ниже поведение для указания сертификата для службы

<serviceBehaviors>
    <behavior>
      <serviceCredentials>
        <serviceCertificate findValue="localhost"
                            x509FindType="FindByIssuerName" />
      </serviceCredentials>
    </behavior>
  </serviceBehaviors>

2 - второй вариант обеспечивает (A + [C + I]), C и I являются необязательными при настройке через элемент protectionLevel. аутентификацией клиента будет аутентификация Windows (обычно для обеспечения A, C и I используется Windows Stream Security)

<!--//Below are the configuration for both the service and the client-->
<netTcpBinding>
    <binding name="TcpSecureBinding">
      <security mode="Transport">
        <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign"></transport>
      </security>
    </binding>
  </netTcpBinding>

3 - опция 3 обеспечивает (A + C + I), C и I не являются обязательными, и аутентификация клиента будет осуществляться с помощью сертификата клиента (каждый клиент должен иметь свой собственный сертификат), в этом случае TCP SSL (не HTPS SSL) будет использоваться для предоставления A, C и I.

<!--//Below are the configuration for both the service and the client-->
<binding name="TcpSecureBinding">
      <security mode="Transport">
        <transport clientCredentialType="Certificate"></transport>
      </security>
    </binding>

Кроме того, поскольку будет использоваться TCP SSL, служба должна предоставить сертификат для клиента, поэтому необходимо установить сертификат на сервере и настроить службу для использования этого сертификата, чтобы подтвердить его подлинность, также необходимо установить корневой каталог. сертификат центра сертификации для сертификата службы на клиентском компьютере (как правило, в LocalMachine / Trusted Root Certification Authorities), и служба должна иметь приведенное ниже поведение для указания сертификата для службы

<serviceBehaviors>
    <behavior>
      <serviceCredentials>
        <serviceCertificate findValue="localhost"
                            x509FindType="FindByIssuerName" />
      </serviceCredentials>
    </behavior>
  </serviceBehaviors>
Как должна выглядеть конфигурация конечной точки клиента, чтобы использовать только открытый ключ корневого CA? Я пытался настроить свой сервис с сертификатом компьютера, подписанным корневым ЦС, но когда я настраиваю клиент для использования корневого ЦС, клиент и сервер не могут общаться. Но когда я помещаю открытый ключ сертификата сервисного компьютера на клиенте (и меняю «findValue» на это имя сертификата), тогда он работает. Что я делаю не так Simon Gillbee
Ответ от Блог Райана Ганна noobob

Похожие вопросы