2008-12-02 14 views
37

Necesito usar un certificado x509 para obtener una autenticación de nivel de mensajes segura de un cliente rico a través de Internet a un servicio web seguro de WCF.¿Cómo puedo configurar WCF para usar certificados x509 a través de Internet?

Específicamente, estoy buscando una guía paso a paso para la configuración, configuración, codificación e implementación, incluida la creación de un certificado 'dev', su instalación y la obtención de un certificado 'real' para la producción.

Respuesta

44

Los siguientes pasos son una guía para empezar:

1) En primer lugar, necesita una autoridad raíz para generar sus certificados de cliente y servidor. Puede usar un Proveedor de autoridad externo (por ejemplo, Verisign) o puede generar el suyo usando algo como el Servidor de certificados de Microsoft.

Para generar un certificado de Root Authority de desarrollo, puede usar la herramienta "makecert" que viene con Visual Studio, p.

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

2) Luego necesita 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 autorización raíz. Puede solicitar certificados de cliente desde una interfaz web de Microsoft Certificate Server, p. 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 son firmados con el certificado de entidad emisora ​​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 de certificados personales en el almacén del equipo local.

Para que el servidor confíe en los certificados del cliente, deberá instalar el certificado de Root Authority en la tienda Trusted Root Certificate Authorities del servidor (use el complemento mmc Certificates para hacerlo). Los clientes también deben tener el certificado raíz instalado de la misma manera para que confíen en sus propios certificados.

3) Configure su servicio WCF para que requiera 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 la aplicación.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

El XML anterior es incorrecto. Lamentablemente, mi edición fue rechazada. Si tiene problemas, tenga en cuenta que '' debe ser '', y falta un elemento ''. Esto es cierto para .NET 4.5, al menos. Ver http://stackoverflow.com/review/suggested-edits/7584410 – Jimothy

Cuestiones relacionadas