2012-06-03 15 views
5

C'è un modo per utilizzare WCF SSL con NetTcpBinding che non richiede l'installazione di un certificato client sul computer client? (SSL V2 se non mi sbaglio).Utilizzo del certificato Wcf SSL su Tcp senza certificato client (solo lato server)

Vogliamo che il certificato del server sia nell'archivio attendibile del client per l'autenticazione e che crittografa il suo messaggio con la chiave pubblica del server, il che significa che solo la macchina server avrà un certificato di chiave privata.

stiamo utilizzando NetTcpBinding e non CustomBinding su entrambi i lati. Se è possibile farlo, qual è la configurazione corretta per questo? (sulle configurazioni del server &)

Grazie in anticipo.


qui ci sono i miei wcf Configs.

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> 

configurazione client:



    <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 aggiungendo il mio attuale server di & configurazioni client. altre domande:

  1. a livello di autenticazione si desidera che il client di autenticare cert del server ther (credo la chiave pubblica del server dovrebbe essere in magazzino trustedPeople), è possibile?

  2. ci consigliate di utilizzare la sicurezza o il messaggio di trasporto?

  3. se vogliamo per l'autenticazione client & server NTLM (clientCredentialType = Windows) è che può essere fatto in aggiunta all'autenticazione cert del server o semplicemente può essere applicato uno di loro? fino ad ora, abbiamo utilizzato l'autenticazione NTLM.

  4. momento Im ottenendo un'eccezione: "L'aggiornamento richiesto non è supportato da 'net.tcp: // nomeserver: 8040/**'. Questo potrebbe essere dovuto ad attacchi non corrispondenti (ad esempio la sicurezza abilitata su il client e non sul server). " ho capito che si è verificato questo errore perché il client sta utilizzando Windows Security e il server in om Certificate, ma quando si modifica anche la sicurezza del client in Certificate, sto ottenendo un errore: "Il certificato client non è fornito". ma non voglio impostare il certificato del cliente e questo è parte del mio problema principale.

  5. leggiamo che possiamo utilizzare per l'autenticazione cert del server questo tag:

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

ma, penso che questa autenticazione per identità è fatta da un certificato codificato quando abbiamo preffer che l'identificazione del CERT essere eseguita cercando la chiave pubblica del server nello store del client (trustedPeople). questa informazione è vera? che questo tag di identità sono alternativi alla ricerca della chiave pubblica nel cliente "s store supporta?

Spero che sarete in grado di aiutare in questo modo, grazie ancora.

+0

È possibile. Cosa hai provato fino ad ora? – Bernard

+0

Non dovresti avere bisogno di un certificato client a meno che non ne chiedi espressamente uno; come si presenta la tua configurazione di binding? –

+0

Qualcuno può aiutarmi con il nostro problema, per favore ?? – AmirT

risposta

11

che si sta utilizzando netTcpBiding ed è necessario utilizzare Sicurezza di trasporto quindi hai 3 opzioni, la prima opzione richiede il servizio di assistenza, la seconda non richiede alcun certificato, la terza richiede sia il certificato di servizio che il certificato cliente per il tuo scenario, dovresti usare l'opzione 1 che autentica il servizio tramite il suo certificato e promuoverà Riservatezza e integrità per i messaggi

C >> Riservatezza
I >> Integrità
A >> Authentication (Ciò accadrà per il cliente)

1- Opzione uno fornire (C + I) nessuna autenticazione avverrà per il cliente, in questo caso l'SSL TCP (non l'HTPS SSL) sarà utilizzato per fornire io e il C, e il servizio sarà

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

anche perché il TCP SSL verrà utilizzato quindi il servizio deve fornire un certificato per il cliente, quindi è necessario installare un certificato nel server e configurare il servizio per utilizzare questo certificato per dimostrare la sua identità, inoltre è necessario installare il certificato dell'autorità di certificazione radice per il ser Vice certificato sulla macchina client (tipicamente le autorità LocalMachine/certificazione fonti attendibili), e il servizio bisogno di avere il comportamento di seguito per specificare il certificato per il servizio

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

2- opzione due forniscono (A + [C + I]), C e I sono opzionali come si configura tramite l'elemento protectionLevel. l'autenticazione client sarà Windows autenticazione (Tipicamente utilizzerà flusso sicurezza di Windows per ottenere la A, C e 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- opzione 3 forniscono (A + C + I), I e C non sono facoltativi e l'autenticazione del client sarà via certificato del client (ogni cliente deve avere il proprio certificato), In questo caso lo SSL TCP (non lo SSL HTPS) saranno utilizzati per fornire la a, C e I.

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

anche perché verrà utilizzato il protocollo TCP SSL, quindi il servizio deve fornire un certificato per il client, quindi è necessario installare un certificato nel server e configurare il servizio da utilizzare questo certificato per dimostrare la sua identità, inoltre è necessario installare il certificato dell'autorità di certificazione radice per il certificato di servizio sul computer client (in genere nelle Autorità di certificazione Router/LocalMachine/Trusted Root) e il servizio deve avere il seguente comportamento per specificare il certificato per il servizio

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

Che aspetto deve avere la configurazione dell'endpoint del client per utilizzare solo la chiave CA pubblica radice? Ho provato a configurare il mio servizio con un certificato macchina firmato dalla CA principale, ma quando configuro il client per utilizzare la CA radice, il client e il server non sono in grado di parlare. Ma quando inserisco la chiave pubblica del certificato della macchina di servizio sul client (e cambio il valore "findValue" nel nome di quel certs), allora funziona. Che cosa sto facendo di sbagliato? –

+0

Risposta da [Blog di Ryan Gunn] (https://talkdotnet.wordpress.com/tag/nettcp/) – noobob

Problemi correlati