Domanda

Ho un applicazione client / servizio WCF che si basa su una comunicazione sicura tra due macchine e voglio utilizzare i certificati X509 uso installati nell'archivio certificati per identificare il server e il client gli uni agli altri. Faccio questo configurando il vincolante <security authenticationMode="MutualCertificate"/>. C'è solo client.

Il server ha un certificato rilasciato a server.mydomain.com installato nella / negozio Personal Computer locale e il cliente ha un certificato rilasciato a client.mydomain.com installato nello stesso posto. In aggiunta a questo server ha certificato pubblico del client in computer locali / persone di fiducia e il cliente ha certificato pubblico del server nel computer locale / Persone attendibili.

Infine il client è stato configurato per controllare il certificato del server. Ho fatto questo utilizzando l'elemento system.servicemodel/behaviors/endpointBehaviors/clientCredentials/serviceCertificate/defaultCertificate nel file di configurazione.

Fin qui tutto bene, funziona tutto questo. Il mio problema è che voglio specificare nel file di configurazione del server che solo i client che si identificano con il certificato client.mydomain.com dall'archivio certificati Persone attendibili possono connettersi.

Le informazioni corrette sono disponibili sul server utilizzando il ServiceSecurityContext, ma sto cercando un modo per specificare in app.config che WCF dovrebbe fare questo controllo invece del mio dover controllare il contesto di protezione dal codice.

È possibile? Eventuali suggerimenti sarebbe apprezzato.

A proposito, file di configurazione del mio server assomiglia a questo finora:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="MyServer.Server" behaviorConfiguration="CertificateBehavior">
        <endpoint contract="Contracts.IMyService" binding="customBinding" bindingConfiguration="SecureConfig">
        </endpoint>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost/SecureWcf"/>
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="CertificateBehavior">
          <serviceCredentials>
            <serviceCertificate storeLocation="LocalMachine" x509FindType="FindBySubjectName" findValue="server.mydomain.com"/>
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <customBinding>
        <binding name="SecureConfig">
          <security authenticationMode="MutualCertificate"/>
          <httpTransport/>
        </binding>
      </customBinding>
    </bindings>
  </system.serviceModel>
</configuration>
È stato utile?

Soluzione

Non sembra essere un modo per fare quello che voglio con web.config.

Ho finito per l'aggiunta di un comportamento con questo tag:

<clientCertificate>
  <authentication certificateValidationMode="PeerTrust" trustedStoreLocation="CurrentUser" revocationMode="NoCheck"/>
</clientCertificate>

E quindi aggiungere il certificato del client nell'archivio certificati "Persone attendibili" dell'utente che il server viene eseguito come.

Altri suggerimenti

Controlla la pagina WCF Security Guidance su CodePlex - roba eccellente e molto utile

In particolare, controlla il e How-To ancora più particolare il

Come - Usa autenticazione di certificati e protezione dei messaggi in WCF chiama da Windows Form

Si spiega in dettaglio come impostare un servizio WCF che richiede ai propri clienti di presentare un certificato valido, e come verificare che. Se si desidera consentire solo un singolo client, distribuire tale certificato solo specificamente a quello singolo cliente.

Spero che questo aiuti!

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