Solución:
Los siguientes pasos son una guía para comenzar:
1) En primer lugar, necesita una autoridad raíz para generar sus certificados de cliente y servidor. Puede utilizar un proveedor de autoridad externo (por ejemplo, Verisign) o puede generar el suyo propio utilizando algo como Microsoft Certificate Server.
Para generar un certificado de autoridad raíz de desarrollo, puede utilizar la herramienta “makecert” que viene con Visual Studio, p. Ej.
makecert -n "CN=MyRootCA" -r -sv RootCA.pvk RootCA.cer
2) A continuación, debe solicitar / generar sus certificados de cliente y servidor. Ambos tipos de certificados se pueden instalar como certificados de máquina local y ambos deben firmarse con la misma autoridad raíz. Puede solicitar certificados de cliente desde la interfaz web de un servidor de certificados de Microsoft, p. Ej. http://mycertserver/certsrv
.
Para generar un certificado de cliente de desarrollo para cada máquina, puede usar “makecert” nuevamente. Tenga en cuenta que los certificados de cliente están firmados con el certificado de la Autoridad Raíz de desarrollo creado en el paso 1.
makecert -pe -n "CN=MyCert" -ss my -sky exchange -sk MyCert
-iv MyRootCA.pvk -ic MyRootCA.cer -sr localmachine MyCert.cer
Esto instalará el certificado en la máquina en la que se ejecuta el comando, en la carpeta Certificados personales en el almacén de la máquina local.
Para que el servidor confíe en los certificados del cliente, deberá instalar el certificado de la Autoridad raíz de desarrollo en la tienda de Autoridades de certificación raíz de confianza del servidor (utilice el complemento Certificados mmc para hacer esto). Los clientes también deben tener instalado el certificado raíz de la misma manera para que puedan confiar en sus propios certificados.
3) Configure su servicio WCF para requerir la autenticación del cliente mediante un certificado (por ejemplo, a través de 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) Ahora configure la persona que llama (por ejemplo, a través de 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>
Recomiendo leer la guía de seguridad WCF de Microsoft
Se trata de este escenario y de muchos otros.
http://www.codeplex.com/WCFSecurityGuide/
editar: ahora en https://archive.codeplex.com/?p=wcfsecurityguide