Cómo configurar un servicio WCF para aceptar sólo un único cliente identificado por un certificado X509

StackOverflow https://stackoverflow.com/questions/2276594

Pregunta

Tengo una aplicación cliente / servicio WCF que se basa en una comunicación segura entre dos máquinas y quiero usar Utilice certificados x509 instalados en el almacén de certificados para identificar el servidor y el cliente de la otra. Lo hago por la configuración de la unión como <security authenticationMode="MutualCertificate"/>. Sólo hay máquina cliente.

El servidor tiene un certificado expedido a server.mydomain.com instalado en el directorio / almacén personal del equipo local y el cliente tiene un certificado expedido a client.mydomain.com instalado en el mismo lugar. Además de esto, el servidor tiene el certificado público del cliente en el ordenador / Personas de confianza locales y el cliente tiene el certificado público del servidor en el ordenador / Personas de confianza locales.

Finalmente el cliente se ha configurado para comprobar el certificado del servidor. Hice esto usando el elemento system.servicemodel/behaviors/endpointBehaviors/clientCredentials/serviceCertificate/defaultCertificate en el archivo de configuración.

Hasta aquí todo bien, funciona todo esto. Mi problema es que quiero especificar en el archivo de configuración del servidor que sólo los clientes que se identifican con el certificado client.mydomain.com de la tienda de Personas certificado de confianza tienen permiso para conectarse.

La información correcta está disponible en el servidor mediante el ServiceSecurityContext, pero estoy buscando una manera de especificar en app.config que WCF debe hacer esta comprobación en lugar de mi tener que comprobar el contexto de seguridad del código.

¿Es posible? serían apreciados Alguna pista.

Por cierto, el archivo de configuración de mi servidor tiene este aspecto hasta el momento:

<?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>
¿Fue útil?

Solución

No parece ser una manera de hacer lo que quiera utilizando web.config.

acabé añadiendo un comportamiento con esta etiqueta:

<clientCertificate>
  <authentication certificateValidationMode="PeerTrust" trustedStoreLocation="CurrentUser" revocationMode="NoCheck"/>
</clientCertificate>

Y a continuación, añadir el certificado del cliente al almacén de certificados "personas de confianza" del usuario que ejecuta el servidor.

Otros consejos

Salida página del WCF de instrucciones de seguridad en CodePlex - excelente y muy útil cosas

En particular, echa un vistazo a la de y cómo hacerlo aún más específicamente, la

Cómo - Utilizar autenticación de certificado y la seguridad de los mensajes en WCF llama desde Windows Forms

En él se explica con gran detalle cómo configurar un servicio WCF, que exige a sus clientes a presentar un certificado válido, y cómo comprobar eso. Si desea permitir que un solo cliente, implementar dicha certificado sólo específicamente para que un solo cliente.

Espero que esto ayude!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top