Procedimiento para hacer los certificados X.509 accesibles para WCF

Para que Windows Communication Foundation (WCF) pueda acceder a un certificado X.509, el código de la aplicación debe especificar el nombre y la ubicación del almacén de certificados. En ciertas circunstancias, la identidad del proceso debe tener el acceso al archivo que contiene la clave privada asociada al certificado X.509. Para obtener la clave privada que está asociada a un certificado X.509 en un almacén de certificados, WCF debe tener permiso para hacerlo. De forma predeterminada, solo el propietario y la cuenta del sistema pueden tener acceso a la clave privada de un certificado.

Para hacer los certificados X.509 accesibles para WCF

  1. Proporcione la cuenta donde WCF está ejecutando el acceso de lectura al archivo que contiene la clave privada que está asociada al certificado X.509.

    1. Determine si WCF necesita el acceso de lectura a la clave privada para el certificado X.509.

      La tabla siguiente detalla si una clave privada debe estar disponible al utilizar un certificado X.509.

      Uso del certificado X.509 Clave privada
      Firmar digitalmente un mensaje SOAP saliente.
      Comprobar la firma de un mensaje SOAP entrante. No
      Cifrar un mensaje SOAP saliente. No
      Descifrar un mensaje SOAP entrante.
    2. Determine la ubicación del almacén de certificados y diga dónde está almacenado el certificado.

      El almacén de certificados en el que el certificado está almacenado se especifica en código de aplicación o en configuración. Por ejemplo, el ejemplo siguiente especifica que el certificado se encuentra en el almacén de certificados CurrentUser denominado My.

      cc.ClientCredentials.ClientCertificate.SetCertificate(
          StoreLocation.CurrentUser,
          StoreName.My,
          X509FindType.FindBySubjectName,
          "contoso.com");
      
      cc.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySubjectName, "contoso.com")
      
    3. Determine dónde se encuentra la clave privada para el certificado en el equipo mediante la herramienta FindPrivateKey.

      La herramienta FindPrivateKey necesita el nombre del almacén de certificados, la ubicación y algo que lo identifique de forma exclusiva. La herramienta acepta el nombre de sujeto del certificado o su huella digital como identificador único. Para obtener más información sobre cómo determinar la huella digital de un certificado, consulte Procedimiento para recuperar la huella digital de un certificado.

      En el siguiente ejemplo de código se usa la herramienta FindPrivateKey para determinar la ubicación de la clave privada para un certificado en el almacén My en CurrentUser con una huella digital de 46 dd 0e 7a ed 0b 7a 31 9b 02 a3 a0 43 7a d8 3f 60 40 92 9d.

      findprivatekey.exe My CurrentUser -t "46 dd 0e 7a ed 0b 7a 31 9b 02 a3 a0 43 7a d8 3f 60 40 92 9d" -a  
      
    4. Determine la cuenta donde WCF se ejecutando.

      La siguiente tabla detalla la cuenta donde WCF se está ejecutando para un escenario determinado.

      Escenario Identidad de proceso
      Cliente (consola o aplicación WinForms). Usuario actualmente registrado.
      Servicio que tiene host propio. Usuario actualmente registrado.
      Servicio que se hospeda en IIS 6.0 (Windows Server 2003) o IIS 7.0 (Windows Vista). SERVICIO DE RED
      Servicio que se hospeda en IIS 5.X (Windows XP). Controlado por el elemento <processModel> en el archivo Machine.config. La cuenta predeterminada es ASPNET.
    5. Conceda el acceso de lectura al archivo que contiene la clave privada de la cuenta donde WCF se está ejecutando, mediante una herramienta como cacls.exe.

      En el siguiente ejemplo de código se modifica la lista de control de acceso discrecional (DACL) para el archivo especificado a fin de conceder a la cuenta de SERVICIO DE RED acceso de lectura (:R) al archivo.

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

Consulte también