Asignación de certificados de empresa
El anclaje de certificados de empresa es una característica de Windows para recordar o anclar un certificado de entidad de certificación o entidad final de emisión raíz a un nombre de dominio determinado. La asignación de certificados de ayuda a reducir los ataques de tipo "Man in the middle" al permitirte proteger los nombres de dominio internos contra certificados de encadenamiento o no deseados o contra certificados emitidos de forma fraudulenta.
Nota
Los nombres de dominio externo, donde entidad de certificación pública emite el certificado emitido para estos dominios, no son ideales para la asignación de certificados de empresa.
Las API de certificados de Windows (CertVerifyCertificateChainPolicy y WinVerifyTrust) se actualizan para comprobar si la cadena del sitio que autentica los servidores coincide con un conjunto restringido de certificados. Estas restricciones se encapsulan en una lista de certificado de confianza (CTL) de reglas de asignación, que está configurada e implementada en equipos con Windows 10. Cualquier certificado de sitio que desencadene una falta de coincidencia de nombres hace que Windows escriba un evento en el registro de eventos CAPI2 e impide que el usuario navegue al sitio web mediante Microsoft Edge o Internet Explorer.
Nota
El desencadenamiento de la característica de anclaje de certificados de empresa no hace que clientes que no sean Microsoft Edge o Internet Explorer bloqueen la conexión.
Implementación
Para implementar la asignación de certificados de empresa, debes:
- Crear un archivo XML de reglas de asignación de certificados con formato correcto.
- Crear un archivo de lista de certificados de confianza de reglas de asignación a partir del archivo XML.
- Aplicar el archivo de lista de certificados de confianza de reglas de asignación a un equipo administrador de referencia.
- Implementar la configuración del registro en el equipo de referencia mediante la Consola de administración de directivas de grupo (GPMC), que se incluye en las Herramientas de administración remota del servidor (RSAT).
Crear un archivo XML de las reglas de asignación
El archivo de reglas de asignación basado en XML consta de una secuencia de elementos PinRule. Cada elemento PinRule contiene una secuencia de uno o más elementos Site y una secuencia de cero o más elementos Certificate.
<PinRules ListIdentifier="PinRulesExample" Duration="P28D">
<PinRule Name="AllCertificateAttributes" Error="None" Log="true">
<Certificate File="Single.cer"/>
<Certificate File="Multiple.p7b"/>
<Certificate File="Multiple.sst"/>
<Certificate Directory="Multiple"/>
<Certificate Base64="MIIBy … QFzuM"/>
<Certificate File="WillExpire.cer" EndDate="2015-05-12T00:00:00Z"/>
<Site Domain="xyz.com"/>
</PinRule>
<PinRule Name="MultipleSites" Log="false">
<Certificate File="Root.cer"/>
<Site Domain="xyz.com"/>
<Site Domain=".xyz.com"/>
<Site Domain="*.abc.xyz.com" AllSubdomains="true"/>
<Site Domain="WillNormalize.com"/>
</PinRule>
</PinRules>
Elemento PinRules
El elemento PinRules puede tener los atributos siguientes. Para obtener ayuda con el formato de las reglas de asignación, consulta Representar una fecha en XML o Representar una duración en XML.
Atributo | Descripción | Requerido |
---|---|---|
Duration o NextUpdate | Especifica cuándo expirarán las reglas de asignación. Uno es obligatoria. NextUpdate tiene prioridad si se especifican ambos. La duración, representada como un tipo de datos TimeSpan XML, no permite años y meses. El atributo NextUpdate se representa como un tipo de datos DateTime XML en UTC. |
¿Es obligatorio? Sí. Al menos uno es obligatorio. |
LogDuration o LogEndDate | Configura que la auditoría solo se extenderá más allá de la expiración del cumplimiento de las reglas de asignación. LogEndDate, declarado como una tipo de datos XML DateTime en hora UTC, tiene precedencia si se especifican ambos. Representa LogDuration como un tipo de datos TimeSpan XML, lo que no permite años y meses. Si no se especifica ninguno de los atributos, la auditoría de expiración usa los atributos Duration o NextUpdate . |
No. |
ListIdentifier | Proporciona un nombre descriptivo para la lista de reglas de asignación. Windows no usa este atributo para la aplicación de anclaje de certificados; sin embargo, se incluye cuando las reglas de anclaje se convierten en una lista de confianza de certificados (CTL). | No. |
Elemento PinRule
El elemento PinRule puede tener los atributos siguientes:
Atributo | Descripción | Obligatorio |
---|---|---|
Name | Identifica la PinRule de manera exclusiva. Windows usa este atributo para identificar el elemento en caso de un error de análisis o de una salida detallada. El atributo no se incluye en la lista de confianza de certificados (CTL) generada. | Sí. |
Error | Describe la acción que realiza Windows cuando encuentra un error de coincidencia de PIN. Puede elegir entre los siguientes valores de cadena: - Revoked: Windows denuncia el certificado que protege el sitio como si estuviera revocado. Normalmente esto impide que el usuario acceda al sitio. - InvalidName : Windows informa del certificado que protege el sitio como si el nombre del certificado no coincide con el nombre del sitio. Normalmente esto hace que se pregunte al usuario antes de acceder al sitio. - None: el valor predeterminado. No se devuelve ningún error. Puedes usar esta configuración para auditar las reglas de asignación sin introducir ninguna fricción con el usuario. |
No. |
Log | Un valor booleano representa una cadena que es igual a true o false. De manera predeterminada, el registro está habilitado (true). | No. |
Elemento Certificate
El elemento Certificate puede tener los atributos siguientes:
Atributo | Descripción | Obligatorio |
---|---|---|
Archivo | Ruta de acceso a un archivo que contiene uno o más certificados. Donde los certificados pueden codificarse como: -.Certificado único - p7b - sst Estos archivos también pueden tener el formato Base64. Todos los elementos Site que se incluyen en el mismo elemento PinRule pueden coincidir con cualquiera de estos certificados. |
Sí (Archivo, Directorio o Base64 deben estar presentes). |
Directory | Ruta de acceso a un directorio que contiene uno o varios de los archivos de certificado anteriores. Omite los archivos que no contienen ningún certificado. | Sí (Archivo, Directorio o Base64 deben estar presentes). |
Base64 | Certificados codificados con Base64. Donde los certificados pueden codificarse como: -.Certificado único - p7b - sst Esto permite incluir los certificados en el archivo XML sin una dependencia del directorio de archivos. Nota: Puedes usar certutil-encode para convertir un archivo .cer en base64. A continuación, puedes usar el Bloc de notas para copiar el certificado codificado en base64 y pegarlo en la regla de asignación. |
Sí (Archivo, Directorio o Base64 deben estar presentes). |
EndDate | Te permite configurar una fecha de expiración para cuando el certificado ya no sea válido en la regla de asignación. Si estás en el proceso de cambiar a una nueva entidad de certificación raíz, puedes establecer EndDate para permitir la coincidencia de certificados de este elemento. Si la hora actual supera endDate, al crear la lista de confianza de certificados (CTL), el analizador genera un mensaje de advertencia y excluye los certificados de la regla de pin en el CTL generado. Para obtener ayuda con el formato de las reglas de asignación, consulta Representar una fecha en XML. |
No. |
Elemento Site
El elemento Site puede tener los atributos siguientes:
Atributo | Descripción | Obligatorio |
---|---|---|
Domain | Contiene el nombre DNS que debe coincidir para esta regla de asignación. Al crear la lista de certificados de confianza, el analizador normaliza el valor de cadena de nombre de entrada como sigue: - Si el nombre DNS tiene un "*" inicial, se quita. - El nombre DNS no ASCII se convierte en código puny ASCII. - Los caracteres ASCII en mayúsculas se convierten en minúsculas. Si el nombre normalizado tiene un ".", se habilita la coincidencia de etiquetas con carácter comodín a la izquierda. Por ejemplo, ".xyz.com" coincidirá con "abc.xyz.com". |
Sí. |
AllSubdomains | De forma predeterminada, la coincidencia de etiquetas con caracteres comodín de la izquierda está restringida a una sola etiqueta izquierda. Este atributo se puede establecer en "true" para habilitar comodines que coincidan con todas las etiquetas izquierdas. Por ejemplo, al establecer este atributo también se hará que "123.abc.xyz.com" coincida con el valor de dominio ".xyz.com". |
No. |
Crear una lista de certificados de confianza de reglas de asignación
La utilidad de línea de comandos, Certutil.exe, incluye el argumento generatePinRulesCTL para analizar el archivo XML y generar la lista de certificados de confianza (CTL) codificada que agregas al equipo de referencia con Windows 10, versión 1703 e implementaciones posteriores. La sintaxis de uso es:
CertUtil [Options] -generatePinRulesCTL XMLFile CTLFile [SSTFile]
Generate Pin Rules CTL
XMLFile -- input XML file to be parsed.
CTLFile -- output CTL file to be generated.
SSTFile -- optional .sst file to be created.
The .sst file contains all of the certificates
used for pinning.
Options:
-f -- Force overwrite
-v -- Verbose operation
Los mismos certificados pueden presentarse en varios elementos PinRule. El mismo dominio puede presentarse en varios elementos PinRule. Certutil fusiona estos en la lista de certificados de confianza de reglas de asignación resultante.
Certutil.exe no aplica estrictamente la definición de esquema XML. Lleva a cabo lo siguiente para permitir que otras herramientas agreguen o consuman sus propios elementos y atributos específicos:
- Omite los elementos antes y después del elemento PinRules.
- Omite cualquier elemento que no coincida con Certificate o Site dentro del elemento PinRules.
- Omite los atributos que no coinciden con los nombres anteriores para cada tipo de elemento.
Usa el comando certutil con el argumento generatePinRulesCTL junto con el archivo XML que contiene tus reglas de asignación de certificados. Por último, proporciona el nombre de un archivo de salida que incluya las reglas de asignación de certificados en forma de una lista de certificados de confianza.
certutil -generatePinRulesCTL certPinRules.xml pinrules.stl
Aplicar reglas de asignación de certificados a un equipo de referencia
Ahora que las reglas de asignación de certificados tienen el formato de lista de certificados de confianza, debes aplicar la configuración a un equipo de referencia como requisito previo para implementar la configuración en la empresa. Para simplificar la configuración de implementación, es mejor aplicar las reglas de anclaje de certificados a un equipo que tenga la consola de administración de directiva de grupo (GPMC) incluida en las Herramientas de administración remota del servidor (RSAT).
Usa certutil.exe para aplicar las reglas de asignación de certificados en el equipo de referencia con el argumento setreg. El argumento setreg toma un argumento secundario que determina la ubicación de dónde certutil escribe las reglas de asignación de certificados. Este argumento secundario es chain\PinRules. El último argumento que proporcionas es el nombre de archivo que contiene tus reglas de asignación de certificados en el formato de lista de certificados de confianza (.stl). El nombre del archivo se pasa como último argumento; sin embargo, tienes que agregar un prefijo al nombre de archivo con el símbolo "@", tal como se muestra en el siguiente ejemplo. Debes ejecutar este comando desde un símbolo del sistema con privilegios elevados.
Certutil -setreg chain\PinRules @pinrules.stl
Certutil escribe la información binaria en la ubicación del Registro siguiente:
Nombre | Valor |
---|---|
Clave | HKLM\SOFTWARE\Microsoft\Cryptography\OID\EncodingType0\CertDllCreateCertificateChainEngine\Config |
Nombre | PinRules |
Valor | Contenido binario del archivo de lista de certificados de confianza de las reglas de asignación de certificados |
Tipo de datos | REG_BINARY |
Implementar la configuración de regla de asignación de empresa mediante directiva de grupo
Has creado correctamente un archivo XML de reglas de asignación de certificados. Desde el archivo XML, ha creado un archivo de lista de confianza de anclaje de certificados y ha aplicado el contenido de ese archivo al equipo de referencia desde el que puede ejecutar la consola de administración de directiva de grupo. Ahora tienes que configurar un objeto de directiva de grupo para incluir la configuración de reglas de asignación de certificados aplicada e implementarla en tu entorno.
Inicia sesión en el equipo de referencia con credenciales equivalente a la de administrador de dominio.
Inicia la Consola de administración de directivas de grupo (gpmc.msc).
En el panel de navegación, expande el nodo del bosque y luego expande el nodo de dominio.
Expanda el nodo que contiene el nombre de dominio de Active Directory.
Selecciona el nodo Objetos de directiva de grupo. Haz clic con el botón derecho en el nodo Objetos de directiva de grupo y luego en Nuevo.
En el cuadro de diálogo Nuevo GPO, escribe Enterprise Certificate Pinning Rules en el cuadro de texto Nombre y haz clic en Aceptar.
En el panel de contenido, haz clic en el objeto de directiva de grupo Enterprise Certificate Pinning Rules y haz clic en Editar.
En el Editor de administración de directivas de grupo, en el panel de navegación, expande el nodo Preferencias bajo Configuración del equipo. Expande Configuración de Windows.
Haz clic con el botón derecho en el nodo Registro y haz clic en Nuevo.
En el cuadro de diálogo Nuevas propiedades de Registro, selecciona Actualizar de la lista Acción. Selecciona HKEY_LOCAL_MACHINE de la lista Subárbol.
Para la ruta de acceso de clave, haga clic en ... para iniciar el Explorador de elementos del Registro. Navega a la siguiente clave de registro y selecciona el nombre del valor de registro PinRules:
HKLM\SOFTWARE\Microsoft\Cryptography\OID\EncodingType0\CertDllCreateCertificateChainEngine\Config
Haz clic en Seleccionar para cerrar el Explorador de elementos del Registro.
La Ruta de la clave debe contener la clave del Registro seleccionada. La configuración de nombre de valor debe contener el nombre de valor del Registro PinRules. El tipo de valor debe leer REG_BINARY y los datos de valor deben contener una serie larga de números de 0 a 9 y letras que van desde A-F (hexadecimal). Haz clic en Aceptar para guardar la configuración y cerrar el cuadro de diálogo.
Cierra el Editor de administración de directivas de grupo para guardar la configuración.
Vincula el objeto de directiva de grupo Enterprise Certificate Pinning Rules para aplicar en los equipos que ejecutan Windows 10, versión 1703 en tu empresa. Cuando estos equipos unidos a un dominio aplican la directiva de grupo, la información del Registro configurada en el objeto de directiva de grupo se aplica al equipo.
Registro de reglas de asignación adicionales
Para ayudar en la creación de reglas de asignación de certificados, puedes configurar la opción PinRulesLogDir debajo de la clave del Registro de configuración de la cadena de certificados para incluir un directorio principal para registrar las reglas de asignación.
Nombre | Valor |
---|---|
Clave | HKLM\SOFTWARE\Microsoft\Cryptography\OID\EncodingType0\CertDllCreateCertificateChainEngine\Config |
Nombre | PinRulesLogDir |
Valor | El directorio principal donde Windows debe escribir los registros de reglas de asignación adicionales |
Tipo de datos | REG_SZ |
Permiso para la carpeta del registro de reglas de asignación
La carpeta en la que Windows escribe los registros de reglas de asignación adicionales debe tener permisos para que todos los usuarios y aplicaciones tengan acceso completo. Puede ejecutar los siguientes comandos desde un símbolo del sistema con privilegios elevados para lograr los permisos adecuados.
set PinRulesLogDir=c:\PinRulesLog
mkdir %PinRulesLogDir%
icacls %PinRulesLogDir% /grant *S-1-15-2-1:(OI)(CI)(F)
icacls %PinRulesLogDir% /grant *S-1-1-0:(OI)(CI)(F)
icacls %PinRulesLogDir% /grant *S-1-5-12:(OI)(CI)(F)
icacls %PinRulesLogDir% /inheritance:e /setintegritylevel (OI)(CI)L
Siempre que una aplicación comprueba una cadena de certificados TLS/SSL que contiene un nombre de servidor que coinciden con un nombre DNS en el certificado del servidor, Windows escribe un archivo. p7b, que consta de todos los certificados de cadena del servidor, en una de tres carpetas secundarias:
- AdminPinRules coincidió con un sitio en las reglas de anclaje de certificados empresariales.
- AutoUpdatePinRules coincidió con un sitio en las reglas de anclaje de certificados administradas por Microsoft.
- NoPinRules no coincidía con ningún sitio en las reglas de anclaje de certificado.
El nombre del archivo de salida consta de los ocho dígitos hexadecimales ASCII iniciales de la huella digital SHA1 de la raíz seguidos del nombre del servidor. Por ejemplo:
D4DE20D0_xsi.outlook.com.p7b
DE28F4A4_www.yammer.com.p7b
Si hay una regla de pin de certificado de empresa o una Microsoft coincidencia de reglas de pin de certificado, Windows escribe el archivo .p7b en la carpeta secundaria MismatchPinRules. Si expiraron las reglas de asignación, Windows escribe el archivo. p7b en la carpeta secundaria ExpiredPinRules.
Representar una fecha en XML
Muchos atributos dentro del archivo XML de las reglas de asignación son fechas.
Estas fechas deben tener el formato correcto y estar representadas en hora UTC.
Puedes usar Windows PowerShell para dar formato a estas fechas.
Luego puedes copiar la salida del cmdlet y pegarla en el archivo XML.
Por cuestiones de simplicidad, puedes truncar el punto decimal (.) y los números de después de él. Sin embargo, asegúrate de anexar la "Z" mayúscula al final de la cadena de fecha XML.
2015-05-11T07:00:00.2655691Z
2015-05-11T07:00:00Z
Convertir una fecha XML
También puede usar Windows PowerShell para validar y convertir una fecha XML en una fecha legible humana para validar que es la fecha correcta.
Representar una duración en XML
Algunos elementos pueden configurarse para usar una duración, en lugar de una fecha. Debes representar la duración como un tipo de datos TimeSpan XML. Puedes usar Windows PowerShell para dar formato y validar correctamente las duraciones (TimeSpan), copiarlas y pegarlas en el archivo XML.
Convertir una duración XML
Puede convertir un intervalo de tiempo con formato XML en una variable de intervalo de tiempo que pueda leer.
Definición de esquema XML (XSD) de lista de certificados de confianza
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="PinRules">
<xs:complexType>
<xs:sequence>
<xs:element name="PinRule" maxOccurs="unbounded" minOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="Certificate" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:dateTime" name="EndDate" use="optional"/>
<xs:attribute type="xs:string" name="File" use="optional"/>
<xs:attribute type="xs:string" name="Directory" use="optional"/>
<xs:attribute type="xs:base64Binary" name="Base64" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="Site" maxOccurs="unbounded" minOccurs="1">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:string" name="Domain"/>
<xs:attribute type="xs:boolean" name="AllSubdomains" use="optional" default="false"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="xs:string" name="Name"/>
<xs:attribute name="Error" use="optional" default="None">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value ="Revoked"/>
<xs:enumeration value ="InvalidName"/>
<xs:enumeration value ="None"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute type="xs:boolean" name="Log" use="optional" default="true"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="xs:duration" name="Duration" use="optional"/>
<xs:attribute type="xs:duration" name="LogDuration" use="optional"/>
<xs:attribute type="xs:dateTime" name="NextUpdate" use="optional"/>
<xs:attribute type="xs:dateTime" name="LogEndDate" use="optional"/>
<xs:attribute type="xs:string" name="ListIdentifier" use="optional"/>
</xs:complexType>
</xs:element>
</xs:schema>