2009-10-27 8 views
17

Sto creando un'applicazione WCF in cui utilizzerò i certificati per crittografare la comunicazione tra client e server. Nel mio ambiente di sviluppo, voglio utilizzare un certificato di test/certificato autofirmato che ho creato utilizzando makecert. (Solo il server avrà un certificato, il client non lo farà).Perché WCF lamenta un errore di controllo dell'identità?

Ho installato il certificato in un archivio certificati e tutto funziona correttamente. Sul client, certificateValidationMode è attualmente impostato su "false", dal momento che sto lavorando con un certificato di prova.

Il mio problema:

Nel app.config sul client, ho bisogno di specificare l'elemento identità come questo:

<endpoint ... > 
    <identity> 
     <dns value="<Name-Of-Server-Computer>"/> 
    </identity> 
</endpoint> 

Se rimuovo l'elemento di identità, ricevo il seguente messaggio di errore nel client quando provo a connettermi al server:

Controllo identità non riuscito per messaggio in uscita. L'identità DNS prevista dell'endpoint remoto era "localhost", ma l'endpoint remoto ha fornito l'indicazione DNS "Name-Of-Server-Computer". Se si tratta di un endpoint remoto legittimo, è possibile risolvere il problema specificando esplicitamente l'identità DNS 'Name-Of-Server-Computer' come proprietà Identity di EndpointAddress durante la creazione del proxy del canale.

è Quindi, ecco le mie domande:

  • è il controllo di identità fatto solo quando si utilizza un/certificato auto-firmato test? Quando distribuisco la mia applicazione utilizzando un certificato reale, attendibile, acquistato da una CA, verrà comunque effettuato il controllo dell'identità?

  • C'è un modo per disabilitare il controllo di identità? So che posso creare il mio validatore di certificato personalizzato, ma non sembra essere un modo per ignorare il controllo di identità che utilizza questi.

risposta

10

Il controllo viene eseguito sempre e dovrebbe essere. Fondamentalmente, WCF verificherà che il certificato sia emesso sul nome di dominio (yourcompany.com) o sul nome del computer in cui risiede il servizio. Questo è un controllo di sicurezza che non potrei mai disabilitare! Altrimenti, chiunque spoofing il tuo servizio potrebbe utilizzare qualsiasi certificato intestato a un dominio arbitrario/nome macchina e ottenere il tuo traffico - non quello che vuoi!

Quindi, ciò che è necessario assicurarsi è che il vero certificato sul server di produzione sia effettivamente assegnato a quel nome di dominio di cui farà parte il server di produzione, ad es. se il tuo server di produzione sarà in "production.yourcompany.com", il certificato deve essere intestato a quel dominio.

Marc

+0

> "Si tratta di un controllo di sicurezza che non avevo mai disattivare!" Giusto per essere sicuro di aver capito. Significa che c'è in realtà un modo per disabilitarlo? Capisco i vantaggi del controllo ... – Nitramk

+1

Non ho mai nemmeno pensato di farlo, quindi non ho mai sentito l'impulso di verificare se esiste un modo per disattivarlo. Non lo so, mi dispiace. –

24

La risposta a questa domanda è nel messaggio di errore stesso. Sul client è possibile effettuare le seguenti operazioni:

EndpointIdentity identity = EndpointIdentity.CreateDnsIdentity("Server"); 
EndpointAddress address = new EndpointAddress(new Uri("net.tcp://1.2.3.4:12345/ServiceName"), identity); 

Sostituire "Server", in base a quanto previsto. In genere questo sarebbe il nome comune (CN) del certificato autofirmato. Così facendo non si rovinerà la sicurezza, a patto che si assuma tutta la responsabilità di assicurarsi che il certificato presentato sia valido, cioè creare il proprio validatore di certificato personalizzato e fare controlli rilevanti lì.

+0

Hai ragione! Questa risposta è corretta. –

3

certificateValidationMode deve essere impostato su "None", non "false" ...