Come posso utilizzare un certificato jolly ssl per autenticare reciprocamente diversi server WCF tramite X509?

StackOverflow https://stackoverflow.com/questions/1630968

  •  06-07-2019
  •  | 
  •  

Domanda

Ho due server WCF, entrambi sul dominio mydomain.com (esempio fittizio, come IP sotto!), rispettivamente denominati server1 e server2.

Sono entrambi accessibili tramite i loro indirizzi IP pubblici (foo.1 e 2), ma anche dalla LAN privata su cui si trovano (ovvero 192.168.0.1 e 192.168.0.2)

Possiedo un certificato SSL jolly per * .mydomain.com. È installato correttamente nei negozi pertinenti (ad es. Personale per la crittografia e client attendibili per l'autenticazione)

Vorrei che entrambi i miei server si connettessero tra loro sui loro indirizzi di rete locale usando il mio certificato jolly per scopi di autenticazione.

Ho aggiornato il file C: \ Windows \ System32 \ drivers \ etc \ hosts per renderlo simile al seguente:

192.168.0.1     Server1.mydomain.com
192.186.0.2     Server2.mydomain.com

Questi non sono gli indirizzi IP che ottengo se risolvo Server1.mydomain.com (preferirei ricevere foo.1 - 2)

Ho anche modificato il suffisso DNS specifico della connessione per le mie interfacce locali IPV4 su " mydomain.com "

Il mio certificato viene indicato come questo nei miei file Server.config (ho rimosso tutte le parti non correlate all'autenticazione)

        <behavior name="ServerToServerBehavior" >
          <serviceCredentials>
            <clientCertificate>
              <authentication certificateValidationMode="PeerOrChainTrust" revocationMode="Online"/>
            </clientCertificate>
            <serviceCertificate x509FindType="FindByThumbprint" findValue="13a41b3456e431131cd461de"/>
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="myServerAsClientBehaviorConfiguration">
          <clientCredentials>
            <clientCertificate x509FindType="FindByThumbprint" findValue="13a41b3456e431131cd461de" storeLocation="LocalMachine"/>
            <serviceCertificate>
              <authentication certificateValidationMode="PeerOrChainTrust" revocationMode="Online" trustedStoreLocation="LocalMachine"/>
            </serviceCertificate>
          </clientCredentials>
        </behavior>
      </endpointBehaviors>

Funziona perfettamente sul mio computer di sviluppo con certificati X509 generati localmente, ma nel mio ambiente di produzione, ecco cosa ottengo:

  

Server.Connect: impossibile connettersi a   server Server2:   System.ServiceModel.Security.MessageSecurityException:   Controllo dell'identità non riuscito per uscita   Messaggio. L'identità DNS prevista di   l'endpoint remoto era   "server2.mydomain.com" ma il telecomando   l'endpoint ha fornito la richiesta DNS   'Mydomain.com'. Se questo è un   endpoint remoto legittimo, è possibile   risolvere il problema esplicitamente   specificando l'identità DNS 'mydomain.com'   come proprietà di identità di   EndpointAddress durante la creazione del canale   proxy.

Ho provato a convincere il server a rispondere a Server2.mydomain.com anziché a miodominio.com, senza successo. Qualche suggerimento su come farlo?

Ho anche provato la soluzione suggerita nel messaggio di errore, ma questo sembra non avere alcun effetto (altri utenti sembrano avere lo stesso problema e devo ancora trovare una soluzione). Qualche idea su come risolvere questo problema?

Modifica: Ho verificato con il mio fornitore di certificati che posso effettivamente usarlo per l'autenticazione X509.

È stato utile?

Soluzione

Alla fine ho capito perché il mio campo Identità veniva ignorato.

Il mio endpoint è stato costruito in questo modo:

DistantServer = new ServiceReferenceServerToServer.ServerToServerClient("myServerBinding", "net.tcp://server.mydomain.com/Server");

quando viene fornito il parametro uri, anche il campo di identità DNS (definito in app.config) viene ignorato (anche se è vuoto, come nel caso in cui utilizziamo una stringa anziché un oggetto URI reale).

la soluzione è impostarla a livello di codice usando il seguente codice:

        System.ServiceModel.EndpointAddress uri = new System.ServiceModel.EndpointAddress(new Uri("net.tcp://server.mydomain.com/Server"),new System.ServiceModel.DnsEndpointIdentity("mydomain.com"),new System.ServiceModel.Channels.AddressHeader[0]);

        DistantServer = new ServiceReferenceServerToServer.ServerToServerClient("myServerBinding", uri );

Altri suggerimenti

Penso che l'override del reclamo DNS di cui sta parlando l'errore sia specificato sul lato client, non sul server, quindi non stai aprendo nulla apportando tale modifica tranne che il tuo client potrebbe connettersi correttamente a qualsiasi server nel tuo dominio (se fosse in ascolto). L'errore che stai vedendo è un po 'come l'equivalente di sicurezza del messaggio di una mancata corrispondenza del nome host nel certificato. Ho ottenuto la sicurezza dei messaggi per lavorare con i certificati jolly dopo un sacco di problemi, ma potresti dover eseguire alcuni lavori di convalida personalizzati poiché il tuo certificato probabilmente non ha specificato l'utilizzo dell'autenticazione client.

Qualche motivo per cui non stai usando la sicurezza dei trasporti? MOLTO più semplice per funzionare a meno che tu non abbia un routing Layer7 intermedio ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top