Come configurare un servizio WCF per accettare solo un singolo client identificato da un certificato x509
-
21-09-2019 - |
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>
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!