Comment configurer WCF pour utiliser les certificats x509 sur internet?

j'ai besoin d'utiliser un certificat x509 pour obtenir l'authentification de niveau de message sécurisé d'un client riche via internet à un Service Web sécurisé de la WCF.

plus précisément, je suis à la recherche d'un guide fonctionnel étape par étape pour la configuration, la configuration, le codage et le déploiement, y compris la création d'un certificat "dev", son installation et l'obtention d'un certificat "réel" pour la production.

37
demandé sur dsolimano 2008-12-03 01:37:22

2 réponses

les étapes suivantes sont un guide pour vous aider à commencer:

1) Tout d'abord, vous avez besoin d'une autorité racine pour générer vos certificats client et serveur. Vous pouvez utiliser un fournisseur D'autorité externe (par exemple Verisign) ou vous pouvez générer votre propre en utilisant quelque chose comme Microsoft Certificate Server.

pour générer un certificat D'autorité racine de développement, vous pouvez utiliser l'outil" makecert "fourni avec Visual Studio, par exemple

makecert -n "CN=MyRootCA" -r -sv RootCA.pvk RootCA.cer

2) vous devez alors demander/générer vos certificats client et serveur. Les deux types de certificats peuvent être installés en tant que certificats machine locaux et les deux doivent être signés en utilisant la même autorité racine. Vous pouvez demander des certificats clients à partir de L'interface Web D'un serveur de certificats Microsoft, par exemple http://mycertserver/certsrv .

pour générer un certificat client de développement pour chaque machine, vous pouvez à nouveau utiliser" makecert". Notez que les certificats clients sont signé avec le certificat D'autorité racine de développement créé à l'étape 1.

makecert -pe -n "CN=MyCert" -ss my -sky exchange -sk MyCert 
         -iv MyRootCA.pvk -ic MyRootCA.cer -sr localmachine MyCert.cer

cela installera le certificat sur la machine sur laquelle la commande est exécutée, dans le dossier des certificats personnels dans le magasin Machine Local.

pour que le serveur puisse faire confiance aux certificats clients, vous devez installer le certificat D'autorité racine de développement dans la base de données des Autorités de certification racine de confiance du serveur (utilisez les certificats mmc composant logiciel enfichable pour ce faire). Les clients doivent également avoir le certificat racine installé de la même manière afin qu'ils puissent faire confiance à leurs propres certificats.

3) configurer votre service WCF pour exiger l'authentification du client à l'aide d'un certificat (par exemple via le web.config).

<services>
  <service
    name="TestService"
    behaviorConfiguration="wsHttpCertificateBehavior">
    <endpoint name="TestEndPoint"
      address=""
      binding="wsHttpBinding"
      bindingConfiguration="wsHttpEndpointBinding"
      contract="TestService.IMyContract">
      <identity>
        <dns value=""/>
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
  </service>
</services>

<bindings>
  <wsHttpBinding>
    <binding name="wsHttpEndpointBinding">
      <security mode="Message">
        <message clientCredentialType="Certificate"/>
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

<behaviors>
  <behavior name="wsHttpCertificateBehavior">
    <serviceMetadata httpGetEnabled="false" httpsGetEnabled="true"/>
    <serviceCredentials>
      <clientCertificate>
        <authentication 
          certificateValidationMode="PeerOrChainTrust" 
          revocationMode="NoCheck"/>
      </clientCertificate>
      <serverCertificate findValue="CN=MyCert"/>
    </serviceCredentials>
  </behavior>
</behaviors>

4) maintenant configurer l'appelant (par exemple via l'application.config).

<client>
  <endpoint name="wsHttpBinding"
    address="https://localhost/TestService/TestService.svc"
    binding="wsHttpBinding"
    bindingConfiguration="wsHttpBinding"
    behaviorConfiguration="wsHttpCertificateBehavior"
    contract="TestService.IMyContract">
    <identity>
      <dns value="MyCert"/>
    </identity>
  </endpoint>
</client>

<bindings>
  <wsHttpBinding>
    <binding name="wsHttpBinding">
      <security mode="Message">
        <message clientCredentialType="Certificate"/>
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

<behaviors>
 <endpointBehaviors>
  <behavior name="wsHttpCertificateBehavior">
    <clientCredentials>
      <clientCertificate findValue="MyCert" storeLocation="LocalMachine"/>
      <serviceCertificate>
        <authentication 
          certificateValidationMode="PeerOrChainTrust" 
          revocationMode="NoCheck" 
          trustedStoreLocation="LocalMachine"/>
      </serviceCertificate>
    </clientCredentials>
  </behavior>
 </endpointBehaviors>
</behaviors>
44
répondu Nigel Spencer 2009-07-15 11:38:18

je recommande la lecture du WCF Guide de sécurité de Microsoft

ceci traite de ce scénario ainsi que de beaucoup d'autres

http://www.codeplex.com/WCFSecurityGuide /

10
répondu ChrisCa 2008-12-02 23:07:14