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, cifrar y firmar mensajes digitalmente. En este tema se explican brevemente las características de los certificados digitales de X.509 y cómo utilizarlos en WCF e incluye vínculos a los temas que explican estos conceptos en mayor profundidad o que muestran cómo llevar a cabo tareas comunes mediante WCF y los 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 de certificación 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 el asunto (la entidad a la que se emite el certificado), las fechas de validez (cuándo es válido el certificado), el emisor (la entidad que emitió el certificado) y una clave pública. En WCF, cada una de estas propiedades se procesa como clase Claim y cada notificación se divide en dos tipos: identidad y derecho. Para obtener más información sobre los certificados X.509, vea Certificados de clave pública X.509. Para obtener más información sobre notificaciones y autorizaciones en WCF, vea Administración de notificaciones y autorización con el modelo de identidad. Para obtener más información sobre la implementación de una PKI, vea Windows Server 2008 R2: servicios de certificados.

Una función principal del certificado es la de autenticar la identidad del propietario del certificado ante los demás. Un certificado también contiene la clave pública del propietario, mientras que el propietario conserva la clave privada. La clave pública se puede usar para cifrar los mensajes enviados al propietario del certificado. Solo el propietario tiene acceso a la clave privada, por lo que únicamente él puede descifrar esos mensajes.

Los certificados los debe emitir una entidad de certificación, que suele ser un emisor de certificados de terceros. En un dominio de Windows, se incluye una entidad de certificación que se puede usar para emitir los certificados a los equipos del dominio.

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, vea Cómo: Ver certificados con el complemento de MMC.

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 solo 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 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.

    ms731899.Important(es-es,VS.100).gif 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. O bien, una aplicación puede confiar en un certificado que se encuentre aquí y que sea de emisión propia.

Para obtener más información sobre almacenes de certificados, 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 WCF se hospeda en un servicio Windows use el almacén de la máquina local. Observe que es necesario tener privilegios de administrador para instalar certificados en el almacén de la máquina local.

  • Si el servicio o cliente es 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 un rol independiente para obtener acceso a un almacén, debe garantizar el permiso de acceso a ese rol. 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 sobre 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 se crean en una jerarquía en la que cada certificado individual se vincula a la CA que emite el certificado. Este vínculo va al certificado de la CA. Después, el certificado de la CA se vincula a la CA que emitió el certificado original de la CA. Este proceso se repite hasta que se llegue al certificado de la CA raíz. Se confía intrínsecamente en el certificado de la CA raíz.

Los certificados digitales se utilizan para autenticar una entidad confiando en esta jerarquía, que también se denomina cadena de confianza. Puede ver la cadena de cualquier certificado mediante el complemento MMC haciendo doble clic en cualquier certificado y, a continuación, haciendo clic en la pestaña Ruta de certificado. Para obtener más información sobre la importación de 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).

ms731899.note(es-es,VS.100).gifNota:
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. Solo 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 Validador de certificado X.509. Para obtener más información, vea 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 solo 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> ElementserviceBehaviors section<authentication> of <clientCertificate> Element(de la endpointBehaviors section) y el (de la ).

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 un almacén, un tipo de "búsqueda” (parámetrox509FindType) que especifica un campo del certificado, y un valor que se debe 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

Dim baseAddress As New Uri("http://cohowinery.com/services")
Dim sh As New ServiceHost(GetType(CalculatorService), baseAddress)
sh.Credentials.ServiceCertificate.SetCertificate( _
StoreLocation.LocalMachine, StoreName.My, _
X509FindType.FindBySubjectName, "cohowinery.com")
Uri baseAddress = new Uri("http://cohowinery.com/services");
ServiceHost sh = new ServiceHost(typeof(CalculatorService), baseAddress );
sh.Credentials.ServiceCertificate.SetCertificate(
StoreLocation.LocalMachine, StoreName.My,
X509FindType.FindBySubjectName, "cohowinery.com");

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 hay más de un certificado con el mismo valor, se genera una excepción porque no hay manera de distinguir cuál es el certificado necesario. 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 sobre la característica, vea Asignar certificados a cuentas de usuario.

Para obtener más información sobre 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>true en , 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.

Vea también

Referencia

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

Otros recursos

Protección de servicios y clientes