使用WCF SSL证书在TCP无客户端证书(仅服务器端)(Using Wcf SSl certifi

2019-06-25 04:05发布

有没有办法使用WCF SSL与不要求客户端证书在客户端计算机上安装NetTcpBinding的? (SSL V2如果我没有记错的话)。

我们希望服务器证书将在客户端的可信商店认证服务器的公钥,这意味着,只有在服务器计算机将举行一个私钥证书加密的消息。

我们正在使用NetTcpBinding的,而不是customBinding两侧。 如果其能完成博,什么是它的正确配置? (在客户端和服务器CONFIGS)

提前致谢。


这里有我的WCF CONFIGS。

服务器配置:



    <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>

客户端配置:



    <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>

IM加入我当前的服务器和客户端CONFIGS。 另一个问题:

  1. 在我们要在客户端进行身份验证疗法服务器的证书认证级别(我想服务器的公钥应该在trustedPeople店),这可能吗?

  2. 你建议我们使用传输安全或消息?

  3. 如果我们想通过NTLM(clientCredentialType =的Windows)来验证客户端和服务器可以在除服务器的证书认证完成,或者只是可以应用其中之一吗? 到现在为止,我们已经使用NTLM身份验证。

  4. 现在即时得到异常:“请求的升级不支持‘的net.tcp://服务器名称:8040 / **’,这可能是由于不匹配的绑定(客户端上启用例如安全性,而不是在服务器上) “。 我理解,因为客户端在OM证书使用Windows安全和服务器,但是当IM客户不断变化的安全证书也,即时得到一个错误发生这样的错误:“客户端证书不提供”。 但我不希望设置客户端的证书和多数民众赞成我的主要问题的一部分。

  5. 我们看到,我们可以使用服务器证书验证此标签:

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

但是,我认为这验证通过身份由一个编码的证书时,我们preffer该证书的标识将通过搜索在客户端的存储(trustedPeople)服务器的公钥来执行完成。 做到这一点的信息是真的吗? 这种身份的这个标签替代搜索客户端的公钥“S受信任的存储?

希望你能够再次协助这一方式,谢谢。

Answer 1:

它使用的是netTcpBiding以及需要使用的运输保障,那么你有3个选项,第一个选项需要维修证书,第二不需要证书可言,第三既需要服务证书和客户端证书。 你的情况,你应该使用选项1通过它的证书,并将proice保密性和完整性的消息,将认证服务。

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将被继续使用该服务必须提供客户端证书,所以你需要安装在服务器的证书和conigure该服务使用该证书来证明它的身份,还需要安装根证书对于客户机(通常在LOCALMACHINE /受信任的根证书颁发机构)上的服务的证书颁发机构的证书,和服务需要有以下行为,指定服务证书

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

2-选项2提供(A + [C + I])时,C和I是可选的,因为你通过的ProtectionLevel元件配置。 在客户端验证将是Windows验证(通常会使用Windows流安全,实现A,C和I)

<!--//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将被继续使用该服务必须提供客户端证书,所以你需要安装在服务器的证书和conigure该服务使用该证书来证明它的身份,还需要安装根证书对于客户机(通常在LOCALMACHINE /受信任的根证书颁发机构)上的服务的证书颁发机构的证书,和服务需要有以下行为,指定服务证书

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


文章来源: Using Wcf SSl certificate over Tcp without client certificate (Server side only)