Compartir a través de


Ejemplo findPrivateKey

Puede ser difícil buscar la ubicación y el nombre del archivo de clave privada asociados a un certificado X.509 concreto en el almacén de certificados. La herramienta FindPrivateKey.exe facilita este proceso.

Importante

Debe compilar el ejemplo FindPrivateKey antes de usarlo.

Un administrador o cualquier usuario instala los certificados X.509 en el equipo. Sin embargo, se puede acceder al certificado mediante un servicio que se ejecuta en una cuenta diferente. Por ejemplo, la cuenta NETWORK SERVICE.

Puede que esta cuenta no tenga acceso al archivo de clave privada porque no instaló el certificado en un principio. La herramienta FindPrivateKey le da la ubicación del archivo de clave privada de un certificado X.509 determinado. Puede agregar o quitar permisos a este archivo cuando conoce la ubicación del archivo de clave privada de los certificados X.509 determinados.

Los ejemplos que utilizan certificados para la seguridad utilizan la herramienta FindPrivateKey en el archivo Setup.bat. Una vez encontrado el archivo de clave privada, puede usar otras herramientas como Cacls.exe para establecer los derechos de acceso adecuados en el archivo.

Cuando se ejecuta un servicio de Windows Communication Foundation (WCF) bajo una cuenta de usuario, como una aplicación ejecutable autohospedada, asegúrese de que la cuenta de usuario tiene acceso de solo lectura al archivo. Cuando se ejecuta un servicio WCF en Internet Information Services (IIS), las cuentas predeterminadas en las que se ejecuta el servicio son NETWORK SERVICE en IIS 7 y versiones anteriores, o identidad del grupo de aplicaciones en IIS 7.5 y versiones posteriores. Para más información, consulte Identidades del grupo de aplicaciones.

Privilegios de lectura

Al tener acceso a un certificado para el que el proceso no tiene privilegio de lectura, se ve un mensaje de excepción similar al siguiente ejemplo:

System.ArgumentException was unhandled
Message="The certificate 'CN=localhost' must have a private key that is capable of key exchange. The process must have access rights for the private key."
Source="System.ServiceModel"

Cuando esto se produce, utilice la herramienta FindPrivateKey para buscar el archivo de clave privada y, luego, establezca el derecho de acceso para el proceso bajo el que el servicio se está ejecutando. Por ejemplo, esto se puede hacer con la herramienta Cacls.exe, tal y como se muestra en el ejemplo siguiente:

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

Convenciones: entradas de la línea de comandos

"[opción]" representa un conjunto opcional de parámetros.

"{opción}" representa un conjunto obligatorio de parámetros.

"opción1 | opción2" representa una opción entre los conjuntos de opciones.

"<valor>" representa un valor de parámetro que se va a escribir.

Uso

FindPrivateKey <storeName> <storeLocation> [{ {-n <subjectName>} | {-t <thumbprint>} } [-f | -d | -a]]

Donde:

Parámetro Descripción
<subjectName> El nombre del sujeto del certificado
<thumbprint> La huella digital del certificado (puede usar la herramienta Certmgr.exe para buscarlo).
-f solo nombre del archivo de salida
-d solo directorio de salida
-a nombre del archivo absoluto de salida

Si no se especifica ningún parámetro en el símbolo del sistema, se mostrará un texto de ayuda con esta información.

Ejemplos

En este ejemplo se busca el nombre de archivo del certificado con un nombre del sujeto de "CN=localhost", en el almacén personal del usuario actual.

FindPrivateKey My CurrentUser -n "CN=localhost"

En este ejemplo se busca el nombre de archivo del certificado con un nombre de asunto de "CN=localhost", en el almacén personal del usuario actual y genera la ruta de acceso completa al directorio.

FindPrivateKey My CurrentUser -n "CN=localhost" -a

Este ejemplo busca el nombre de archivo del certificado con una huella digital de "03 33 98 63 d0 47 e7 48 71 33 62 64 76 5c 4c 9d 42 1d 6b 52", en el almacén personal del equipo local.

FindPrivateKey My LocalMachine -t "03 33 98 63 d0 47 e7 48 71 33 62 64 76 5c 4c 9d 42 1d 6b 52"