Certificados y permisos

Creado el día 26/02/2010 08:46 por zorry

En los servicios WCF se puede establecer seguridad a nivel de mensaje. Para poderlo hacer, hay que instalar un certificado, que será el que se emplee para cifrar el contenido que se requiera.

Ahora bien, un certificado generalmente es instalado por un administrador, pero un servicio generalmente corre con credenciales de usuario restringido. Con lo que normalmente no tendrá privilegios para poder acceder al fichero de la clave privada de los certificados. Vamos a ver cómo manejar esta situación.

El error que nos dará en este caso es:

The certificate 'CN=xxxxxxxx' must have a private key that is capable of key exchange. The process must have access rights for the private key

Lo que nos hará falta es ubicar el archivo que contiene la clave privada del certificado en primer lugar. Y después conceder los permisos. Para lo 2º existe una herramienta en el sistema operativo: cacls.exe. Pero para lo 1º no existe ninguna herramienta.

En la página http://msdn.microsoft.com/en-us/library/aa717039.aspx existen aplicaciones de muestra para WCF, WF y CardSpace. Entre estas muestras hay una aplicación que se lama FindPrivateKey que sirve exactamente para esto.

Se le dice cual es el contenedor del certificado y el nombre del mismo. Por ejemplo, para si queremos obtener el certificado instalado en el almacén personal de la máquina para el nombre NOMBRE-CERTIFICADO pondremos :

FindPrivateKey My LocalMachine -n "CN=NOMBRE-CERTIFICADO" -a

La salida será la ruta del archivo con la clave privada del certificado. Por ejemplo:

C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys\8aeda5eb81555f14f8f9960745b5a40d_38f7de48-5ee9-452d-8a5a-92789d7110b1

Y entonces tendremos que ir a ese archivo y dar permisos de lectura al usuario del pool del servicio. Por ejemplo, si el usuario es NETWORK SERVICE, pondremos:

cacls.exe "C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys\8aeda5eb81555f14f8f9960745b5a40d_38f7de48-5ee9-452d-8a5a-92789d7110b1" /E /G "NETWORK SERVICE":R

He de dar las gracias a Luis de Santiago que me ha proporcionado esta entrada. Gran truco, Luiso!


Comentarios no permitidos