2010-11-05 26 views
5

Tengo un servicio WCF que usa un certificado X.509 como credenciales del cliente. La mayoría de estas credenciales no requieren una contraseña para usarla, solo para instalarla.¿Cómo puedo enviar una contraseña junto con mi certificado (X.509) en un Servicio WCF?

Pero ahora, un cliente nuestro tiene un certificado que requiere que se ingrese una contraseña cada vez que se usa (es decir, cada vez que se ejecuta el servicio). Este servicio llama a otro servicio n veces al día, pero falla si el certificado no se puede validar.

Hasta ahora hemos pedido a nuestros clientes que pidan (y paguen) un nuevo certificado cada vez que hemos tenido este problema, pero tanto nosotros como nuestros clientes estamos cansados ​​de pasar por esto cada vez. No he hecho el servicio yo mismo, y no tengo mucho experiencia con WCF y servicios.

Lo que me gustaría saber es: ¿Es posible ingresar esta contraseña en nuestro archivo de configuración junto con toda la demás información sobre el certificado?

Aquí está una parte de la configuración XML para el servicio:

<configuration> 
    <system.serviceModel> 
    <client> 
     <endpoint 
     address="***" 
     binding="basicHttpBinding" 
     bindingConfiguration="***" 
     behaviorConfiguration="HTTPSEndpoint" 
     contract="***" 
     name="***" /> 
    </client> 
    <bindings> 
     <basicHttpBinding> 
     <binding 
      name="***" 
      sendTimeout="00:05:00" 
      maxBufferSize="2147483647" 
      maxReceivedMessageSize="2147483647" > 
      <readerQuotas maxStringContentLength="2147483647" /> 
      <security mode="Transport"> 
      <transport clientCredentialType="Certificate" /> 
      </security> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name ="HTTPSEndpoint"> 
      <clientCredentials> 
      <clientCertificate 
       findValue="***" 
       storeLocation="LocalMachine" 
       storeName="My" 
       x509FindType="FindBySubjectName"/> 
      </clientCredentials> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    </system.serviceModel> 
</configuration> 

Respuesta

3

El requisito para ingresar una contraseña al recuperar el certificado del almacén de certificados en la máquina cliente está porque el certificado se ha importado con el " Habilitar la protección de clave privada" opción verificado:

Importing a certificate to the certificate store.

Esto se establece a menudo como parte de los procesos del servidor endurecimiento estándar. Está destinado a situaciones en las que el certificado autentica a un usuario con un sistema remoto mientras el usuario está presente.

Como la solicitud de la contraseña se debe al proceso de importación del certificado y no es una propiedad intrínseca de los certificados, la compra de nuevos certificados no cambiará nada.

No conozco ninguna forma de pasar la contraseña mediante programación al almacén de certificados al recuperarla. Sin embargo, si lo piensas bien, incluso si fueras exitoso, tendrías que asegurar esa contraseña de alguna manera. Puede cifrar la contraseña en su archivo .config, pero ahora debe almacenar la clave de cifrado. Y así sucesivamente ... En algún lugar habrá un final suelto que hace que la "protección de clave privada fuerte" no tenga sentido.

Básicamente, su cliente no puede tener las dos cosas: no puede "habilitar una protección de clave privada fuerte" y no tiene que ingresar una contraseña cada vez que se requiere el certificado del cliente. Mucho mejor que almacenen el certificado correctamente.

Para un servicio al cliente sin vigilancia, el método más seguro para almacenar un certificado de cliente es el siguiente:

  1. ejecutar su servicio al cliente en una cuenta específica que tiene una contraseña criptográficamente fuerte.
  2. Elimine el certificado de la tienda LocalMachine. Los certificados instalados en la tienda LocalMachine son accesibles para cualquier cuenta que se ejecute en la máquina.
  3. Instale el certificado en la tienda CurrentUser de la cuenta de servicio del cliente. Esto significa que el certificado solo es accesible a la cuenta de servicio del cliente. Cuando el certificado está instalado, asegúrese de desmarcar la opción "Habilitar protección segura de la clave privada".
Cuestiones relacionadas