Compartir a través de


Trabajar con certificados

Para programar la seguridad de Windows Communication Foundation (WCF), los certificados digitales de X.509 se utilizan normalmente para autenticar clientes y servidores, codificar mensajes y firmar mensajes digitalmente. Este tema explica brevemente las características de certificado y cómo utilizarlas en WCFe incluye vínculos a los temas que explican estos conceptos en mayor profundidad o que muestran cómo lograr tareas comunes mediante WCF y certificados.

En resumen, un certificado digital forma una parte de una infraestructura de clave pública (PKI), que es un sistema de certificados digitales, entidades emisoras de certificados y otras autoridades de registro que comprueban y autentican la validez de cada parte implicada en una transacción electrónica a través del uso de criptografía de claves públicas. Una entidad de certificación emite certificados y cada certificado tiene un conjunto de campos que contienen datos, como asunto (la entidad a la que se emite el certificado), fechas de validez, emisor y clave pública. En WCF, cada una de estas propiedades se procesa como Claimy cada demanda se divide en dos tipos: identidad y derecho. Para obtener más información, consulte Administración de notificaciones y autorización con el modelo de identidad. Para obtener más información acerca de la implementación de una PKI, vea Best Practices for Implementing a Microsoft Windows Server 2003 Public Key Infrastructure.

Una función principal del certificado es la de autenticar la identidad del sujeto a otros. Un certificado también contiene la clave pública del asunto, mientras que el asunto contiene la clave privada. Cualquiera puede utilizar la clave pública para cifrar un mensaje. Sin embargo, ambas claves son necesarias para descifrar un mensaje; por consiguiente, sólo el titular de la clave privada puede descifrar los mensajes. La clave pública se puede utilizar para cifrar los mensajes al propietario del certificado. Sólo el propietario tiene acceso a la clave privada, por lo que sólo el propietario puede descifrar esos mensajes.

Los certificados han de ser emitidos por una entidad de certificación, que es a menudo un emisor de certificados de otra empresa. En un dominio de Windows, se incluye una entidad de certificación que se puede utilizar para emitir los certificados a los equipos del dominio.

Certificados Para obtener más información acerca de , vea Certificados.

Visualización de certificados

Para trabajar con certificados, a menudo es necesario verlos y examinar sus propiedades. Esto se hace con facilidad con la herramienta de complemento Microsoft Management Console (MMC). Para obtener más información, consulte Cómo: Ver certificados con el complemento de MMC. Puede encontrar documentos de procedimientos adicionales para utilizar la herramienta en Httpcfg Overview.

Almacenes de certificados

Los certificados se encuentran en almacenes. Existen dos ubicaciones de almacenamiento principales que se dividen en subalmacenes. Si es el administrador en un equipo, puede ver ambos almacenes principales utilizando la herramienta de complemento MMC. Los usuarios que no sean administradores sólo pueden ver el almacén del usuario actual.

  • El almacén del equipo local. Este contiene los certificados a los que los procesos del equipo obtiene acceso, como ASP.NET. Utilice esta ubicación para almacenar certificados que autentiquen el servidor a los clientes.
  • El almacén del usuario actual. Las aplicaciones interactivas colocan aquí, por lo general, certificados para el usuario actual del equipo. Si está creando una aplicación de cliente, es aquí donde normalmente colocará los certificados que autentiquen un usuario a un servicio.

Estos dos almacenes se dividen en subalmacenes. Entre los más importantes de éstos al programar con WCF se incluyen:

  • Entidades de certificación raíz de confianza. Puede utilizar los certificados en este almacén para crear una cadena de certificados, que se pueden trazar hacia atrás hasta un certificado de la entidad de certificación en este almacén.

    Nota

    El equipo local confía implícitamente en cualquier certificado ubicado en este almacén, aún cuando el certificado no proceda de una entidad de certificación de otro fabricante de confianza. Por esta razón, no coloque ningún certificado en este almacén a menos que confíe plenamente en el emisor y comprenda las consecuencias.

  • Personal. Este almacén se utiliza para los certificados asociados a un usuario de un equipo. Normalmente este almacén se utiliza para los certificados emitidos por uno de los certificados de la entidad de certificación situado en el almacén de las Entidades emisoras de certificados raíz de confianza. Alternativamente, una aplicación puede confiar en y autoemitir un certificado encontrado aquí.

Almacenes de certificados Para obtener más información acerca de , vea Almacenes de certificados.

Selección de un almacén

Seleccionar dónde almacenar un certificado depende de cómo y cuándo se ejecute el cliente o el servicio. Se aplican las siguientes reglas generales:

  • Si el servicio es un servicio de Windows, un servicio que se ejecuta en modo "servidor" sin ninguna interfaz de usuario bajo una cuenta de servicio de red, utilice el almacén del equipo local. Observe que es necesario tener privilegios de administrador para instalar certificados en el almacén del equipo local.
  • Si el servicio o cliente está incrustado en una aplicación que se ejecuta bajo una cuenta de usuario, utilice el almacén del usuario actual.

Obtención de acceso a almacenes

Los almacenes son protegidos por las listas de control de acceso (ACL), como las carpetas de un equipo. Al crear un servicio alojado por Internet Information Services (IIS), el proceso ASP.NET se ejecuta bajo la cuenta ASP.NET. Esa cuenta debe tener acceso al almacén que contiene los certificados que utiliza un servicio. Cada uno de los almacenes principales se encuentra protegido mediante una lista de acceso predeterminada, pero se pueden modificar las listas. Si crea una función independiente para obtener acceso a un almacén, debe garantizar el permiso de acceso a esa función. Para aprender a modificar la lista de acceso mediante la herramienta WinHttpCertConfig.exe, vea Cómo: Crear certificados temporales que puedan utilizarse durante las operaciones de desarrollo. Para obtener más información acerca de la utilización de certificados de cliente con IIS, vea Cómo llamar a un servicio web usando un certificado de cliente para la autenticación en una aplicación web ASP.NET.

Confianza de cadena y entidades de certificación

Los certificados digitales se utilizan para autenticar una entidad confiando en una cadena de confianza. La cadena se forma desde la parte superior a la inferior, con una entidad emisora raíz en la parte superior. Puede ver la cadena de cualquier certificado utilizando el complemento MMC haciendo doble clic en cualquier certificado y, a continuación, haciendo clic en la ficha Ruta de certificado. El certificado de la entidad emisora raíz en la parte superior de una cadena de certificados es autoemitida. Es decir, el emisor y la entidad a las que se emite el certificado son iguales. El Para obtener más información acerca de que importa las cadenas de certificados para una Entidad de certificación, vea Cómo: Especificar la cadena de certificados de la entidad de certificación utilizada para comprobar las firmas (WCF).

Nota

A cualquier emisor se le puede designar una entidad emisora raíz de confianza colocando el certificado del emisor en el almacén de certificados de la entidad emisora raíz de confianza.

Deshabilitación de la confianza de cadena

Al crear un nuevo servicio, puede que esté utilizando un certificado que no ha emitido un certificado raíz de confianza, o puede que el propio certificado emisor no esté en el almacén Entidades de certificación raíz de confianza. Sólo con fines de desarrollo, puede deshabilitar temporalmente el mecanismo que comprueba la cadena de confianza de un certificado. Para hacerlo, establezca la propiedad CertificateValidationMode en PeerTrust o PeerOrChainTrust. Ambos modos especifican que el certificado puede autoemitirse (confianza de mismo nivel) o formar parte de una cadena de confianza. Puede establecer la propiedad en cualquiera de las clases siguientes.

Clase Propiedad

X509ClientCertificateAuthentication

System.ServiceModel.Security.X509ClientCertificateAuthentication.CertificateValidationMode

X509PeerCertificateAuthentication

System.ServiceModel.Security.X509PeerCertificateAuthentication.CertificateValidationMode

X509ServiceCertificateAuthentication

System.ServiceModel.Security.X509ServiceCertificateAuthentication.CertificateValidationMode

IssuedTokenServiceCredential

System.ServiceModel.Security.IssuedTokenServiceCredential.CertificateValidationMode

También puede establecer la propiedad mediante configuración. Los siguientes elementos se utilizan para especificar el modo de validación:

Autenticación personalizada

La propiedad CertificateValidationMode también le permite personalizar cómo se autentican los certificados. De manera predeterminada, el nivel se establece en ChainTrust. Para utilizar el valor Custom, también debe establecer el atributo CustomCertificateValidatorType en un ensamblado y tipo utilizado para validar el certificado. Para crear un validador personalizado, debe heredar a partir de la clase X509CertificateValidator abstracta.

Al crear un autenticador personalizado, el método más importante para invalidar es el método Validate. Para obtener un ejemplo de autenticación personalizada, vea el ejemplo X.509 Certificate Validator. Para obtener más información, consulte Credencial personalizada y validación de la credencial.

Uso de Makecert.exe para generar una cadena de certificados

La herramienta de creación de certificados (Makecert.exe) crea certificados X.509 y pares de claves privadas y públicas. Puede guardar la clave privada en el disco y, a continuación, usarla para emitir y firmar nuevos certificados, simulando así una jerarquía de certificados encadenados. La herramienta está diseñada para usarla únicamente como una ayuda al desarrollar servicios y nunca se debería utilizar para crear los certificados para la implementación real. Al desarrollar un servicio de WCF, utilice los siguientes pasos para generar una cadena de confianza con Makecert.exe.

Para generar una cadena de confianza con Makecert.exe

  1. Cree un certificado temporal de la entidad emisora raíz (autofirmado) mediante la herramienta MakeCert.exe. Guarde la clave privada en el disco.

  2. Utilice el nuevo certificado para emitir otro certificado que contenga la clave pública.

  3. Importe el certificado de la entidad emisora raíz en el almacén Entidades emisoras de certificados raíz de confianza.

  4. Si desea obtener instrucciones paso a paso, vea Cómo: Crear certificados temporales que puedan utilizarse durante las operaciones de desarrollo.

¿Qué certificado utilizar?

Las preguntas más comunes sobre certificados son qué certificados utilizar y por qué. La respuesta depende de si está programando un cliente o servicio. La siguiente información proporciona una directriz general y no es una respuesta exhaustiva a estas preguntas.

Certificados de servicio

Los certificados de servicio tienen la tarea principal de autenticar el servidor a los clientes. Una de las comprobaciones iniciales cuando un cliente autentica un servidor es comparar el valor del campo Asunto con el Identificador uniforme de recursos (URI) utilizado para ponerse en contacto con el servicio: el DNS de ambos debe coincidir. Por ejemplo, si el URI del servicio es "https://www.contoso.com/endpoint/", el campo Asunto también debe contener el valor "www.contoso.com".

Observe que el campo puede contener varios valores, cada uno prefijado con una inicialización que indique el valor. Muy comúnmente, la inicialización es "CN" para designar un nombre común, por ejemplo, "CN = www.contoso.com". También es posible que el campo Asunto esté en blanco, en cuyo caso el campo Nombre alternativo de sujeto puede contener el valor Nombre DNS.

También tenga en cuenta el valor del campo Propósitos planteados del certificado debería incluir un valor adecuado, como "Autenticación del Servidor" o "Autenticación del cliente."

Certificados de cliente

Los certificados de cliente no son emitidos, por regla general, por una autoridad de certificación de otro fabricante. En su lugar, el almacén Personal de la ubicación del usuario actual contiene normalmente certificados colocados ahí por una entidad emisora raíz, con un propósito planteado de "Autenticación de cliente." El cliente puede utilizar un certificado de este tipo cuando se requiera una autenticación mutua.

Revocación en línea y sin conexión

Validez del certificado

Cada certificado es válido sólo durante un período determinado de tiempo, llamado el período de validez. Los campos Válido desde y Válido hasta de un certificado X.509 definen el período de validez. Durante la autenticación, el certificado se comprueba para determinar si el certificado todavía está dentro del período de validez.

Lista de revocación de certificados

En cualquier momento, durante el período de validez, la entidad de certificación puede revocar un certificado. Esto puede producirse por muchas razones, como que la clave privada del certificado esté en peligro.

Cuando esto sucede, cualquier cadena que descienda del certificado revocado dejará también de ser válida y no se confiará en ella durante los procedimientos de autenticación. Para averiguar qué certificados se revocan, cada emisor publica una lista de certificados revocados (CRL) con marca de fecha y hora. La lista se puede comprobar utilizando revocación en línea o sin conexión estableciendo la propiedad RevocationMode o DefaultRevocationMode de las siguientes clases en uno de los valores de enumeración X509RevocationMode : X509ClientCertificateAuthentication, X509PeerCertificateAuthentication, X509ServiceCertificateAuthentication, y las clases IssuedTokenServiceCredential. El valor predeterminado para todas las propiedades es Online.

También puede establecer el modo en la configuración mediante el atributo revocationMode del<authentication> of <clientCertificate> Element (de la serviceBehaviors section) y el <authentication> of <clientCertificate> Element (de la endpointBehaviors section).

El método SetCertificate

En WCF, debe especificar a menudo un certificado o conjunto de certificados que un servicio o cliente han de utilizar para autenticar, cifrar o firmar digitalmente un mensaje. Puede hacer esto mediante programación utilizando el método SetCertificate de varias clases que representan certificados X.509. Las siguientes clases utilizan el método SetCertificate para especificar un certificado.

Clase Método

PeerCredential

SetCertificate

X509CertificateInitiatorClientCredential

SetCertificate

X509CertificateRecipientServiceCredential

SetCertificate

X509CertificateInitiatorServiceCredential

SetCertificate

El método SetCertificate funciona designando una ubicación del almacén y almacén, un tipo de "búsqueda” (parámetrox509FindType ) que especifica un campo del certificado, y un valor para encontrar en el campo. Por ejemplo, el siguiente código crea una instancia ServiceHost y establece el certificado de servicio utilizado para autenticar el servicio a clientes con el método SetCertificate

Varios certificados con el mismo valor

Un almacén puede contener varios certificados con el mismo nombre de asunto. Esto significa que si especifica que x509FindType es FindBySubjectName o FindBySubjectDistinguishedName, y más de un certificado tiene el mismo valor, se genera una excepción porque no hay manera de distinguir qué certificado se requiere. Puede mitigar esto estableciendo el x509FindType en FindByThumbprint. El campo de huella digital contiene un valor único que se puede utilizar para encontrar un certificado concreto en un almacén. Sin embargo, este tiene su propia desventaja: si el certificado se revoca o renueva, el método SetCertificate falla porque también se ha ido la huella digital. O, si el certificado ya no es válido, se produce un error de autenticación. Para mitigar esto se ha de establecer el parámetro x590FindType en FindByIssuerName y especificar el nombre del emisor. Si no se requiere ningún emisor determinado, también puede establecer uno de los otros valores de enumeraciónX509FindType, como FindByTimeValid.

Certificados en configuración

También puede establecer certificados mediante configuración. Si está creando un servicio, las credenciales, incluidos los certificados, se especifican bajo la sección serviceBehaviors section. Si está programando un cliente, los certificados se especifican bajo endpointBehaviors section.

Asignación de un certificado a una cuenta de usuario

Una característica de IIS y Active Directory es la capacidad de asignar un certificado a una cuenta de usuario de Windows. Para obtener más información acerca de la característica, vea Asignar certificados a cuentas de usuario.

Para obtener más información acerca de uso de la asignación de Active Directory, vea Asignación de certificados de cliente mediante la asignación del servicio de directorio.

Con esta capacidad habilitada, puede definir la propiedad MapClientCertificateToWindowsAccount de la clase X509ClientCertificateAuthentication en true. En configuración, puede establecer el atributo mapClientCertificateToWindowsAccount del elemento <authentication> en true, tal y como se muestra en el código siguiente.

<serviceBehaviors>
 <behavior name="MappingBehavior">
  <serviceCredentials>
   <clientCertificate>
    <authentication certificateValidationMode="None" mapClientCertificateToWindowsAccount="true" />
   </clientCertificate>
  </serviceCredentials>
 </behavior>
</serviceBehaviors>

Asignar un certificado X.509 al token que representa una cuenta de usuario de Windows está considerado como un aumento de los privilegios, porque, una vez asignado, el token de Windows se puede utilizar para obtener acceso a recursos protegidos. Por consiguiente, la directiva de dominio requiere que el certificado X.509 cumpla con su directiva antes de realizar la asignación. El paquete de seguridad SChannel hace cumplir este requisito.

Si se utiliza .NET Framework versión 3.5 o una versión posterior, WCF garantiza que el certificado es conforme con la directiva de dominio antes de asignarlo a una cuenta de Windows.

En la primera publicación de WCF, la asignación se realiza sin consultar la directiva de dominio. Por consiguiente, es posible que las aplicaciones anteriores que solían funcionar al ejecutarse bajo la primera publicación, provoquen un error si se habilita la asignación y el certificado X.509 no cumple la directiva de dominio.

Consulte también

Referencia

System.ServiceModel.Channels
System.ServiceModel.Security
System.ServiceModel
X509FindType

Otros recursos

Protección de servicios y clientes