38 votes

Comment puis-je configurer WCF pour utiliser des certificats x509 sur Internet ?

Je dois utiliser un certificat x509 pour obtenir une authentification sécurisée au niveau du message d'un client riche via Internet vers un service Web WCF sécurisé.

Plus précisément, je cherche un guide pratique, étape par étape, pour l'installation, 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.

45voto

Nigel Spencer Points 560

Les étapes suivantes sont un guide pour vous aider à démarrer :

1) Tout d'abord, vous avez besoin d'une autorité racine pour générer vos certificats client et serveur. Vous pouvez soit utiliser un fournisseur d'autorité externe (par exemple Verisign), soit générer le vôtre à l'aide d'un outil tel que 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 ensuite demander/générer vos certificats client et serveur. Les deux types de certificats peuvent être installés en tant que certificats de machine locale et doivent être signés par la même autorité racine. Vous pouvez demander des certificats clients à partir de l'interface web d'un serveur de certificats Microsoft, par ex. http://mycertserver/certsrv .

Pour générer un certificat client de développement pour chaque machine, vous pouvez utiliser "makeecert" à nouveau. Notez que les certificats clients sont signés 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

Le certificat sera installé sur la machine sur laquelle la commande est exécutée, dans le dossier Personal certificates du magasin Local Machine.

Pour que le serveur puisse faire confiance aux certificats des clients, vous devez installer le certificat de l'autorité racine de développement dans le magasin des autorités de certification racine de confiance du serveur (utilisez le snap-in mmc Certificates pour ce faire). Les clients doivent également avoir le certificat racine installé de la même manière afin qu'ils fassent confiance à leurs propres certificats.

3) Configurez 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) Configurez maintenant l'appelant (par exemple via l'app.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>

0 votes

Le XML ci-dessus est incorrect. Malheureusement, ma modification a été rejetée. Si vous rencontrez des problèmes, notez que <serverCredentials> devrait être <serviceCredentials> et un <serviceBehaviors> est manquant. Ceci est vrai pour .NET 4.5, au moins. Voir stackoverflow.com/review/suggested-edits/7584410

10voto

ChrisCa Points 2995

Je vous recommande de lire le guide de sécurité WCF de Microsoft.

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

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

edit : maintenant à https://archive.codeplex.com/?p=wcfsecurityguide

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X