Общие сведения о закреплении корпоративных сертификатов

Закрепление корпоративных сертификатов — это функция Windows для запоминания (закрепления), корневого центра сертификации или сертификата конечной сущности для доменного имени.
Эта функция помогает снизить количество атак "злоумышленник в середине", защищая внутренние доменные имена от связывания с нежелательными или выданными мошенническим путем сертификатами.

Примечание.

Внешние доменные имена (когда сертификат, выданный для этих доменов, выдается публичным центром сертификации) не подходят для закрепления корпоративных сертификатов.

API-интерфейсы сертификатов Windows (CertVerifyCertificateChainPolicy и WinVerifyTrust) обновляются до проверка, если цепочка сайта, которая проверяет подлинность серверов, соответствует ограниченному набору сертификатов.
Ограничения инкапсулируются в списке доверия сертификатов (CTL) правил закрепления , который настраивается и развертывается на устройствах Windows.
Любые сертификаты сайта, которые активируют несоответствие имен, приводят к тому, что Windows записывает событие в журнал событий CAPI2 и не позволяет пользователю просматривать веб-сайт.

Примечание.

Активация функции закрепления корпоративных сертификатов не приводит к блокировке подключения на клиентах, кроме Microsoft Edge.

Развертывание

Чтобы развернуть закрепление корпоративных сертификатов, выполните указанные ниже действия.

  • Создайте правильно отформатированный XML-файл для правил закрепления сертификатов
  • Из XML-файла создайте файл списка доверия сертификатов для правил закрепления
  • Примените файл списка доверия сертификатов для правил закрепления к управляющему компьютеру-образцу
  • Развертывание конфигурации реестра на компьютере-образце с помощью групповой политики

Создание XML-файла правил закрепления

XML-файл для правил закрепления состоит из последовательности элементов PinRule. Каждый элемент PinRule содержит последовательность из одного или нескольких элементов Site и последовательность из нуля или нескольких элементов 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>

Элемент PinRules

Элемент PinRules может иметь следующие атрибуты. Сведения о форматировании правил закрепления см. в разделе Представление даты в XML или Представление длительности в XML.

Атрибут Описание Обязателен
Duration или NextUpdate Указывает, когда истекает срок действия правил закрепления. Необходимо задать хотя бы один из двух атрибутов. NextUpdate имеет приоритет, если заданы оба атрибута.
Длительность, представленная как тип данных TimeSpan XML, не допускает годы и месяцы. Атрибут NextUpdate представляется как тип данных XML DateTime в формате UTC.
Обязательно? Да. Необходимо указать хотя бы один атрибут.
LogDuration или LogEndDate Настраивает аудит, чтобы он выполнялся только по истечении срока действия применения правил закрепления.
Атрибут LogEndDate, представленный как тип данных XML DateTime в формате UTC, имеет приоритет, если указаны оба атрибута.
LogDuration представляется как тип данных TimeSpan XML, который не допускает годы и месяцы.
Если "ни один из атрибутов не указан, для аудита истечения срока действия используются атрибуты Duration или NextUpdate .
Нет.
ListIdentifier Предоставляет понятное имя для списка правил закрепления. Windows не использует этот атрибут для принудительного применения закрепления сертификатов; однако он включается, когда правила пин-кода преобразуются в список доверия сертификатов (CTL). Нет.

Элемент PinRule

Элемент PinRule может иметь следующие атрибуты.

Атрибут Описание Обязательный
Name Служит уникальным идентификатором PinRule. Windows использует атрибут для идентификации элемента для ошибки синтаксического анализа или для подробных выходных данных. Атрибут не включен в созданный список доверия сертификатов (CTL). Да.
Error Описывает действие, которое Windows выполняет при обнаружении несоответствия ПИН-кода. Можно выбрать одно из следующих значений строки.
- Отозванный — Windows сообщает о сертификате, защищающем сайт, как об отозванном. Пользователю обычно закрывается доступ к сайту.
- InvalidName — Windows сообщает сертификат, защищающий сайт, как если бы имя сертификата не совпадает с именем сайта. Это обычно приводит к отображению запроса пользователю перед переходом на сайт.
- None — значение по умолчанию. Ошибка не возвращается. Этот параметр можно использовать для аудита правил закрепления без каких-либо проблем с пользователем.
Нет.
Log Логическое значение представляет строку, равную true или false. По умолчанию ведение журнала включено (true). Нет.

Элемент Certificate

Элемент Certificate может иметь следующие атрибуты.

Атрибут Описание Обязательный
File Путь к файлу, содержащему один или несколько сертификатов. Сертификаты могут кодироваться как:
- один сертификат
- p7b
- sst
Эти файлы также могут быть в формате Base64. Все элементы Site, включенные в этот же элемент PinRule, могут соответствовать любому из этих сертификатов.
Да (файл, каталог или Base64 должны присутствовать).
Directory Путь к каталогу, содержащему один или несколько указанных выше файлов сертификатов. Пропускает все файлы, не содержащие какие-либо сертификаты. Да (файл, каталог или Base64 должны присутствовать).
Base64 Сертификаты в кодировке Base64. Сертификаты могут кодироваться как:
- один сертификат
- p7b
- sst
Это позволяет включать сертификаты в XML-файл без зависимости от каталога файлов.
Примечание.
Вы можете использовать certutil -encode, чтобы преобразовать CER-файл в формат base64. Затем с помощью Блокнота можно скопировать и вставить сертификат в кодировке base64 в правило закрепления.
Да (файл, каталог или Base64 должны присутствовать).
EndDate Позволяет настроить дату окончания срока действия, когда сертификат больше не будет действителен в правиле закрепления.
Если вы находитесь в процессе переключения на новый корневой каталог или ЦС, вы можете задать EndDate , чтобы разрешить сопоставление сертификатов этого элемента.
Если текущее время истекло endDate, при создании списка доверия сертификатов (CTL) средство синтаксического анализа выводит предупреждающее сообщение и исключает сертификаты из правила закрепления в созданном CTL.
Сведения о форматировании правил закрепления см. в разделе Представление даты в ФОРМАТЕ XML.
Нет.

Элемент Site

Элемент Site может иметь следующие атрибуты.

Атрибут Описание Обязательный
Domain Содержит DNS-имя, которое будет соответствовать этому правилу закрепления. При создании списка доверия сертификатов средство синтаксического анализа нормализует значение строки входного имени следующим образом:
— Если DNS-имя имеет начальное значение "*", оно удаляется.
— DNS-имя, отличное от ASCII, преобразуется в ASCII Puny Code.
- символы ASCII в верхнем регистре преобразуются в нижний регистр.
Если нормализованное имя имеет начальное значение ". ", то включено сопоставление меток с подстановочными знаками слева. Например, ".xyz.com" будет соответствовать "abc.xyz.com".
Да.
AllSubdomains По умолчанию сопоставление меток слева с подстановочными знаками ограничено одной левой меткой. Для этого атрибута можно задать значение "true", чтобы включить соответствие подстановочных знаков для всех уровней слева.
Например, если задать этот атрибут, значению домена ".xyz.com" будет также соответствовать "123.abc.xyz.com".
Нет.

Создание списка доверия сертификатов правил пин-кода

Команда Certutil.exe включает аргумент generatePinRulesCTL . Аргумент анализирует XML-файл и создает закодированный список доверия сертификатов (CTL), который вы добавляете на эталонное устройство Windows, а затем развертываете. Используется следующий синтаксис:

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
  • Одни и те же сертификаты могут встречаться в нескольких элементах PinRule .
  • Один и тот же домен может находиться в нескольких элементах PinRule .
  • Certutil объединяет их в результирующий список доверия сертификатов правил закрепления.
  • Certutil.exe не обеспечивает строгое применение определения схемы XML

Certutil выполняет следующие действия, чтобы другие средства могли добавлять и использовать собственные определенные элементы и атрибуты:

  • Пропускает элементы до и после элемента PinRules
  • Пропускает любой элемент, не соответствующий Certificate или Site, в элементе PinRules
  • Пропускает атрибуты, не соответствующие приведенным выше именам для каждого типа элемента.

Используйте команду certutil с аргументом generatePinRulesCTL вместе с XML-файлом, содержащим правила закрепления сертификатов. И наконец, укажите имя выходного файла, который будет содержать правила закрепления сертификатов в виде списка доверия сертификатов.

certutil -generatePinRulesCTL certPinRules.xml pinrules.stl

Применение правил закрепления сертификатов к компьютеру-образцу

Теперь, когда ваши правила закрепления сертификатов представлены в формате списка доверия сертификатов, нужно применить параметры к компьютеру-образцу — это обязательное условие для развертывания параметра в вашей организации. Чтобы упростить конфигурацию развертывания, рекомендуется применить правила закрепления сертификатов к компьютеру с консолью управления групповая политика (GPMC), включенной в средства удаленного администрирования сервера (RSAT).

Используйте certutil.exe, чтобы применить правила закрепления сертификатов к компьютеру-образцу с помощью аргумента setreg.
Аргумент Setreg указывает дополнительный аргумент, который определяет расположение, где certutil записывает правила закрепления сертификатов.
Вторичный аргумент — chain\PinRules.
Последним аргументом, который вы предоставляете, является имя файла, содержащего правила закрепления сертификатов в формате списка доверия сертификатов (.stl).
Имя файла передается в качестве последнего аргумента. Имя файла должно быть префиксированным символом @ , как показано в следующем примере:

Certutil -setreg chain\PinRules @pinrules.stl

Примечание.

Команду необходимо выполнить из командной строки с повышенными привилегиями.

Certutil записывает двоичные данные в следующее расположение регистрации:

Имя Значение
Раздел HKLM\SOFTWARE\Microsoft\Cryptography\OID\EncodingType0\CertDllCreateCertificateChainEngine\Config
Имя PinRules
Значение Двоичные данные из файла списка доверия сертификатов для правил закрепления сертификатов
Тип данных REG_BINARY

Сведения о двоичном файле реестра.

Развертывание параметров правила корпоративного пин-кода с помощью групповой политики

Из XML-файла вы создали файл списка доверия для закрепления сертификатов. Затем вы применили содержимое файла к устройству-образцу, с которого можно запустить консоль управления групповая политика.

Следующий шаг состоит в настройке объекта групповой политики, включающего параметры примененного правила пин-кода сертификата, и его развертывании в среде.

Войдите на компьютер-образец, используя эквивалентные учетные данные администратора домена.

  1. Запустите консоль управления групповыми политиками (gpmc.msc).
  2. В области навигации разверните узел леса, а затем узел домена
  3. Разверните узел, содержащий доменное имя Active Directory.
  4. Выберите узел Объекты групповой политики. Щелкните правой кнопкой мыши узел объектов групповая политика и выберите Создать.
  5. В диалоговом окне Новый объект групповой политики введите Правила закрепления корпоративных сертификатов в текстовом поле Имя и нажмите кнопку ОК.
  6. В области содержимого щелкните правой кнопкой мыши объект Правила закрепления корпоративных сертификатов групповая политика и выберите изменить.
  7. В редакторе управления групповыми политиками в области навигации разверните узел Предпочтения в разделе Конфигурация компьютера. Разверните узел Параметры Windows
  8. Щелкните правой кнопкой мыши узел Реестр и выберите Создать.
  9. В диалоговом окне Новые свойства реестра выберите Обновить в списке Действие. Выберите HKEY_LOCAL_MACHINE в списке Hive
  10. В поле Путь к ключу выберите ... , чтобы запустить браузер элементов реестра. Перейдите к следующему разделу реестра и выберите имя значения реестра PinRules:

HKLM\SOFTWARE\Microsoft\Cryptography\OID\EncodingType0\CertDllCreateCertificateChainEngine\Config

Выберите Выбрать, чтобы закрыть браузер элементов реестра.

  1. Путь к разделу должен содержать выбранный раздел реестра. Конфигурация имени значения должна содержать имя реестра PinRules. Тип значения должен считывать REG_BINARY и значение должно содержать длинный ряд чисел от 0 до 9 и буквы от A до F (шестнадцатеричные). Нажмите кнопку ОК , чтобы сохранить параметры и закрыть диалоговое окно.

Свойства PinRules.

  1. Закройте Редактор управления групповая политика, чтобы сохранить параметры
  2. Свяжите объект групповой политики правил закрепления корпоративных сертификатов с подразделением, содержащим устройства, которые требуется настроить.

Ведение журнала дополнительных правил закрепления

Чтобы упростить создание правил закрепления сертификатов, можно настроить параметр PinRulesLogDir в разделе реестра конфигурации цепочки сертификатов, чтобы включить родительский каталог для регистрации правил закрепления.

Имя Значение
Раздел HKLM\SOFTWARE\Microsoft\Cryptography\OID\EncodingType0\CertDllCreateCertificateChainEngine\Config
Имя PinRulesLogDir
Значение Родительский каталог, в котором Windows будет записывать дополнительные журналы правил закрепления
Тип данных REG_SZ

Разрешение для папки журнала правила закрепления

Папка, в которой Windows записывает дополнительные журналы правил закрепления, должна иметь разрешения, чтобы у всех пользователей и приложений был полный доступ. Для получения необходимых разрешений можно выполнить следующие команды из командной строки с повышенными привилегиями.

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

Когда приложение проверяет цепочку tls/SSL-сертификатов, содержащую имя сервера, соответствующее DNS-имени в сертификате сервера, Windows записывает P7B-файл, состоящий из всех сертификатов в цепочке сервера, в одну из трех дочерних папок:

  • AdminPinRules: соответствует сайту в правилах закрепления корпоративных сертификатов.
  • AutoUpdatePinRules: соответствует сайту в правилах закрепления сертификатов, управляемых корпорацией Майкрософт.
  • NoPinRules: не соответствует ни одному сайту в правилах закрепления сертификатов.

Имя выходного файла состоит из восьми шестнадцатеричных цифр ASCII отпечатка SHA1 корня, за которым следует имя сервера. Пример:

  • D4DE20D0_xsi.outlook.com.p7b
  • DE28F4A4_www.yammer.com.p7b

Если существует правило закрепления корпоративных сертификатов или несоответствие правила закрепления сертификатов Майкрософт, Windows записывает P7B-файл в дочернюю папку MismatchPinRules . По истечении срока действия правил закрепления Windows записывает файл .p7b в дочернюю папку ExpiredPinRules.

Представление даты в ФОРМАТЕ XML

Многие атрибуты в XML-файле для правил закрепления — это даты.
Эти даты должны быть правильно отформатированы и представлены в формате UTC.
Для форматирования этих дат можно использовать Windows PowerShell.
Вы можете скопировать и вставить выходные данные командлета в XML-файл.

Представление даты.

Для простоты можно усечь десятичную запятую и цифры после нее. Однако обязательно добавьте прописные буквы "Z" в конец строки даты XML.

2015-05-11T07:00:00.2655691Z
2015-05-11T07:00:00Z

Преобразование даты XML

Вы также можете использовать Windows PowerShell для проверки и преобразования даты XML в удобочитаемую дату, чтобы проверить правильность даты.

Преобразование даты XML.

Представление длительности в XML

Некоторые элементы могут быть настроены на использование длительности, а не даты. Вы должны представить длительность как тип данных XML TimeSpan. Вы можете использовать Windows PowerShell, чтобы правильно отформатировать и проверить длительность (временной диапазон) и скопировать и вставить ее в XML-файл.

Представляет длительность.

Преобразование длительности XML

Вы можете преобразовать интервал времени в формате XML в переменную timespan, которую можно считать.

Преобразование длительности XML.

Определение схемы XML списка доверия сертификатов (XSD)

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