<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Vadims Podans's blog - Security | PKI | Chaining Engine</title>
    <link>http://www.sysadmins.lv/</link>
    <description>PowerShell powered</description>
    <image>
      <url>http://www.sysadmins.lv/images/imgusr/bilde.jpg</url>
      <title>Vadims Podans's blog - Security | PKI | Chaining Engine</title>
      <link>http://www.sysadmins.lv/</link>
    </image>
    <language>en-us</language>
    <copyright>Vadims Podāns</copyright>
    <lastBuildDate>Thu, 21 Jan 2010 20:20:06 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>vpodans@sysadmins.lv</managingEditor>
    <webMaster>vpodans@sysadmins.lv</webMaster>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=1d4b05e1-833f-4479-b110-c3ed63be1706</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,1d4b05e1-833f-4479-b110-c3ed63be1706.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,1d4b05e1-833f-4479-b110-c3ed63be1706.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=1d4b05e1-833f-4479-b110-c3ed63be1706</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <title>Certificate chaining engine и certificate revocation checking — FAQ</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,1d4b05e1-833f-4479-b110-c3ed63be1706.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,1d4b05e1-833f-4479-b110-c3ed63be1706.aspx</link>
      <pubDate>Thu, 21 Jan 2010 20:20:06 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; MARGIN: 0px 15px 0px 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=КДПВ border=0 alt=КДПВ align=left src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/Certificatechainingenginecertificaterevo_10A0B/kdpv_c1c4d0e5-0bf9-43dc-9d9e-3832618e4667.jpg" width=127 height=96&gt; Предлагаю немного отвлечься от autoenrollment и поговорить о часто задаваемым вопросам, которые относятся к проблемам certificate chaining engine. Данный FAQ основывается на вопросах, которые часто задаются на форумах TechNet. &lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000 size=4&gt;Q:&lt;/FONT&gt;&lt;/STRONG&gt; За что отвечают расширения &lt;STRONG&gt;CRL Distribution Points&lt;/STRONG&gt; (&lt;EM&gt;CDP&lt;/EM&gt;) и &lt;STRONG&gt;Authority Information Access&lt;/STRONG&gt; (&lt;EM&gt;AIA&lt;/EM&gt;) в цифровых сертификатах?&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#0000ff size=4&gt;A:&lt;/FONT&gt;&lt;/STRONG&gt; Расширение &lt;STRONG&gt;Authority Information Access&lt;/STRONG&gt; всегда содержит ссылки на сертификат &lt;STRONG&gt;Certification Authority&lt;/STRONG&gt; (&lt;EM&gt;CA&lt;/EM&gt;), который издал рассматриваемый сертификат. Например, у вас есть сервер CA, который издаёт пользователям сертификаты. Каждый такой сертификат будет содержать ссылку на скачивание сертификата этого самого CA. Это необходимо для построения цепочки сертификатов. Как известно, любая иерархия PKI включает себя как минимум один корневой CA (&lt;STRONG&gt;Root CA&lt;/STRONG&gt;) и может содержать несколько уровней промежуточных CA. Используя расширение AIA конечного сертификата, клиент скачивает сертификат издающего CA, который в расширении AIA так же содержит ссылки на скачивание сертификата вышестоящего CA. Этот процесс происходит до тех пор, пока цепочка не закончится самоподписанным сертификатом и который уже не содержит расширения AIA. Поскольку корневой сертификат самоподписанный, он является конечной точкой цепочки. По корневому сертификату определяется доверие цепочке. Чтобы доверять такой цепочке, корневой сертификат, на котором эта цепочка заканчивается, должен быть установлен в контейнере Trusted Root CAs в оснастке &lt;STRONG&gt;Certificates&lt;/STRONG&gt; консоли &lt;STRONG&gt;MMC&lt;/STRONG&gt;. &lt;BR&gt;Расширение &lt;STRONG&gt;CRL Distribution Point&lt;/STRONG&gt; содержит ссылки на файлы CRL, которые периодически публикует сервер CA, который издал рассматриваемый сертификат. Этот файл содержит серийные номера и прочую информацию о сертификатах, которые были отозваны. Сертификаты могут быть отозваны, когда есть подозрения или уже констатирован факт получения несанкционированного доступа к закрытому ключу третьим лицом. Закрытый ключ должен быть доступен только тому пользователю или компьютеру, которому выдан данный сертификат. Если третье лицо получило доступ к закрытому ключу, это лицо может воспользоваться им для получения конфиденциальной информации или выдавать себя за легитимного пользователя. В таких случаях администратор CA может отозвать такой сертификат. В таком случае если сертификат содержится в файле CRL, предъявителю данного сертификата никакого доверия не будет. Следует понимать, что CDP/AIA рассматриваемого сертификата содержат ссылки на файлы вышестоящего CA. Даже если владельцем рассматриваемого сертификата является сервер CA (&lt;STRONG&gt;Intermediate CA&lt;/STRONG&gt;), ссылки будут указывать на файлы вышестоящего CA. &lt;BR&gt;Более подробно вопрос рассмотрен по ссылке: &lt;A href="http://www.sysadmins.lv/PermaLink,guid,63f4fa92-f82b-4b01-a710-6324bae859bb.aspx"&gt;Certificate Chaining Engine — как это работает&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000 size=4&gt;Q:&lt;/FONT&gt;&lt;/STRONG&gt; Нужны ли расширения CDP и AIA в сертификатах корневых CA?&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#0000ff size=4&gt;A:&lt;/FONT&gt;&lt;/STRONG&gt; Нет. Как уже было сказано, CDP и AIA содержат ссылки на файлы вышестоящего CA, а корневой сертификат является высшей точкой в иерархии и выше корневого CA ничего быть не может. Поэтому данные расширения бесполезны для сертификатов корневых CA и обычно просто отсутствуют. &lt;BR&gt;Более подробно вопрос рассмотрен здесь: &lt;A href="http://www.sysadmins.lv/PermaLink,guid,b3521905-4696-4e23-a2d8-1f6fafbfa030.aspx"&gt;Certificate chaining engine (CCE) и отзыв корневых сертификатов&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000 size=4&gt;Q:&lt;/FONT&gt;&lt;/STRONG&gt; На каком сервере CA я могу отозвать определённый сертификат?&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#0000ff size=4&gt;A:&lt;/FONT&gt;&lt;/STRONG&gt; каждый сервер CA поддерживает свой список CRL в который может включать только те сертификаты, которые были выданы именно этим CA. Это означает, что сертификат отозвать может только CA, который указан в поле Issuer рассматриваемого сертификата.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000 size=4&gt;Q:&lt;/FONT&gt;&lt;/STRONG&gt; Стоит ли использовать &lt;STRONG&gt;Certificate Hold&lt;/STRONG&gt; в качестве причины отзыва сертификата? Если да, то в каких случаях?&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#0000ff size=4&gt;A:&lt;/FONT&gt;&lt;/STRONG&gt; Причина отзыва как &lt;STRONG&gt;Certificate Hold&lt;/STRONG&gt; обладает одной особенностью — его можно извлечь обратно из CRL файла, после чего он перестанет считаться отозванным. Данная причина задумана для случаев когда сотрудник уходит в отпуск и такой отзыв позволит избежать использование отозванного сертификата на этот период. Однако, данную причину не следует никогда использовать. Это связано с тем, что после извлечения сертификата из CRL вы не можете узнать был ли он отозван в какой-то период времени. Например, вы отозвали сертификат с причиной Certificate Hold и через некоторое время передумали и извлекли сертификат из CRL. В последствии вы получаете документ, подписанный этим сертификатом именно в период фактического нахождения сертификата в CRL. Фактически получается, что документ был подписан в тот момент, когда сертификат был отозван. Поскольку он был потом извлечён из CRL, вы больше не можете доказать, что сертификат был отозван на момент подписания документа. По этой причине вы не должны использовать данную причину отзыва.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000 size=4&gt;Q:&lt;/FONT&gt;&lt;/STRONG&gt; При установке сертификата на сервер иногда получаю ошибку: &lt;STRONG&gt;The revocation function was unable to check revocation because the revocation server was offline. 0x80092013 (-2146885613)&lt;/STRONG&gt;. Что это может означать и как эту ошибку исправить?&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#0000ff size=4&gt;A:&lt;/FONT&gt;&lt;/STRONG&gt; Данная ошибка указывает на то, что системе не удалось проверить сертификат на отзыв. Иными словами, система извлекла ссылку из CDP расширения сертификата и по этой ссылке не удалось скачать CRL файл. В данном случае вы должны обратиться к администратору сервера CA, чтобы тот обеспечил доступность файла по ссылкам в CDP расширении. Если же вы сами исполняете эти обязанности, то вы должны самостоятельно решить этот вопрос — настроить точки публикации CRL файлов. В качестве временного решения (например, вы опубликовали CRL только в Active Directory и у вас несколько доменов в лесу, причиной этого может быть репликация AD. В таком случае вы можете скачать CRL файл локально на компьютер (любым удобным способом) и выполнить команду: &lt;FONT color=#0000ff&gt;certutil –addstore –f Root &amp;lt;path\file.crl&amp;gt;&lt;/FONT&gt; &lt;BR&gt;где &lt;FONT color=#0000ff&gt;&amp;lt;path\file.crl&amp;gt;&lt;/FONT&gt; — путь к файлу CRL.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000 size=4&gt;Q:&lt;/FONT&gt;&lt;/STRONG&gt; При открытии файла сертификата я вижу следующее сообщение: &lt;STRONG&gt;Windows does not have enough information to verify this certificate&lt;/STRONG&gt;. Что это означает и как с этим бороться?&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#0000ff size=4&gt;A:&lt;/FONT&gt;&lt;/STRONG&gt; Данное сообщение говорит о том, что системе не удалось найти сертификат вышестоящего CA. Как уже было отмечено, этот сертификат можно скачать по ссылке (ссылкам) в расширении AIA, но по всей видимости они нерабочие. Вы можете попробовать вручную скачать файл по этим ссылкам и вероятней всего вам это не удастся. Для решения этой проблемы вы должны опубликовать физический файл в соответствующие места: папка веб-сервера (для протокола HTTP) или контейнер AIA в Active Directory (для протокола LDAP). Если файл сертификата CA публикуется только в AD и у вас лес с несколькими доменами, данная ошибка может быть кратковременно вызвана задержками репликации. В таком случае для временного решения вы можете скачать файл на локальную машину (любым удобным для вас способом) и выполнить одну из двух команд: &lt;BR&gt;&lt;FONT color=#0000ff&gt;certutil –addstore –f SubCA &amp;lt;path\file.crt&amp;gt;&lt;/FONT&gt; — если вышестоящий CA не является корневым &lt;BR&gt;&lt;FONT color=#0000ff&gt;certutil –addstore –f Root &amp;lt;path\file.crt&amp;gt;&lt;/FONT&gt; — если вышестоящий CA является корневым. &lt;BR&gt;где &lt;FONT color=#0000ff&gt;&amp;lt;path\file.crt&amp;gt;&lt;/FONT&gt; — путь к файлу CER/CRT.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000 size=4&gt;Q:&lt;/FONT&gt;&lt;/STRONG&gt; Я отозвал сертификат, опубликовал новый CRL, однако при запуске файла сертификата я не вижу ошибок, что сертификат отозван. Почему?&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff size=4&gt;&lt;STRONG&gt;A:&lt;/STRONG&gt;&lt;/FONT&gt; Когда вы запускаете файл сертификата (просматриваете его содержимое), проверка на отзыв не происходит. Система только строит цепочку, но ни один сертификат на отзыв не проверяется. Это by design. Для проверки статуса сертификата вы можете воспользоваться следующими командами: &lt;BR&gt;&lt;FONT color=#0000ff&gt;certutil –url &amp;lt;path\file.cer&amp;gt;&lt;/FONT&gt; — этой командой вызывается удобный графический интерфейс, в котором вы можете выяснить статус отзыва сертификата. &lt;BR&gt;&lt;FONT color=#0000ff&gt;certutil –verify –urlfetch &amp;lt;path\file.cer&amp;gt;&lt;/FONT&gt; — данная команда выведет очень подробный текстовый лог проверки. Рекомендуется для использования профессионалами, которые в состоянии проанализировать этот лог. &lt;BR&gt;где &lt;FONT color=#0000ff&gt;&amp;lt;path\file.cer&amp;gt;&lt;/FONT&gt; — путь к файлу проверяемого сертификата.&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#ff0000 size=4&gt;&lt;STRONG&gt;Q:&lt;/STRONG&gt;&lt;/FONT&gt; Я отозвал сертификат, опубликовал новые CRL, однако certutil показывает, что сертификат не отозван. Как так?&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff size=4&gt;&lt;STRONG&gt;A:&lt;/STRONG&gt;&lt;/FONT&gt; Это вызвано тем, что CRL'ы, как и ответы от OCSP Responder кешируются в оперативной памяти и жёстком диске. Для обновления кеша в памяти, следует перезапустить приложение, которое проверяет статус сертификата. А на самом диске CRL кешируется на срок действия конкретного CRL. Это значит, что клиент будет использовать данный кешированный CRL до срока указанного в поле Next update конкретного CRL файла. Кеширование используется для экономии ресурсов и пропускной способности сети. Но вы можете очистить кеш CRL (при этом удалятся все кешированные CRL), вы можете воспользоваться следующей командой: &lt;BR&gt;&lt;FONT color=#0000ff&gt;certutil -setreg chain\ChainCacheResyncFiletime @now &lt;BR&gt;&lt;/FONT&gt;после этого обязательно следует выполнить следующую команду: &lt;BR&gt;&lt;FONT color=#0000ff&gt;certutil –delreg chain\ChainCacheResyncFiletime&lt;/FONT&gt; &lt;BR&gt;Данные команды поддерживаются системами начиная с Windows XP SP3. Предыдущие системы не поддерживают очистку кеша CRL.&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#ff0000 size=4&gt;&lt;STRONG&gt;Q:&lt;/STRONG&gt;&lt;/FONT&gt; Какие протоколы разрешены для расширений CDP/AIA?&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#0000ff size=4&gt;A:&lt;/FONT&gt;&lt;/STRONG&gt; Для Windows систем доступны только следующие протоколы: &lt;BR&gt;&lt;STRONG&gt;HTTP://&lt;/STRONG&gt; — только для публикации в расширение сертификата. &lt;BR&gt;&lt;STRONG&gt;LDAP://&lt;/STRONG&gt; — для публикации физических файлов и для публикации ссылки в расширение сертификата. &lt;BR&gt;&lt;STRONG&gt;FILE://&lt;/STRONG&gt; — только для публикации физических файлов в сетевой папке (например, на веб-сервере). Хотя Windows Server 2003 и предыдущие системы позволяли такие ссылки в расширениях CDP/AIA, начиная с Windows Vista/Windows Server 2008 они больше не допускаются и не используются. &lt;BR&gt;&lt;STRONG&gt;C:\path&lt;/STRONG&gt; — только для публикации физических файлов в файловой системе локального компьютера. &lt;BR&gt;Более подробно можно прочитать по ссылке: &lt;A href="http://www.sysadmins.lv/PermaLink,guid,9beb4f0a-38a8-42b2-9a49-141c04fbdcd8.aspx"&gt;CRL Distribution Points и Authority Information Access&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000 size=4&gt;Q:&lt;/FONT&gt;&lt;/STRONG&gt; есть ли какие-то best practices по планированию расширений CDP/AIA?&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#0000ff size=4&gt;A:&lt;/FONT&gt;&lt;/STRONG&gt; да, существют определённые best practices по настройке расширений CDP/AIA на сервере CA. И вот как они выглядят в общем виде: &lt;BR&gt;1) не следует использовать ссылки вида LDAP:// если ваши сертификаты могут использоваться вне пределах вашего леса AD. Это вызвано тем, что скачивать файлы по таким ссылкам могут только клиенты текущего леса, остальные клиенты будут получать ошибки по этим ссылкам. Целесообразно использовать более универсальные протоколы как HTTP. Данный протокол поддерживается множеством систем, в том числе и мобильными системами (смартфоны) и пользователями других операционных систем. При использовании HTTP рассмотрите возможность высокой доступности этих веб-серверов, как NLB-кластер или использования двух различных веб-серверов. В таком случае вы должны будете указать ссылки на скачивание файла для каждого веб-сервера. &lt;BR&gt;2) используйте веб-сервера, которые доступны как изнутри сети, так и из интернета (если сертификаты могут использоваться пользователями интернета, например SSL-сертификаты) по одному и тому же URL. &lt;BR&gt;3) при планировании ссылок, которые будут публиковаться в расширениях CDP/AIA сертификатов следует учитывать их очерёдность. Если вы решили использовать 2 независимых веб-сервера, первым указывайте тот, который будет являться основным. Это обусловлено тем, что клиент скачивает файлы по ссылкам в порядке их следования. Первая ссылка будет использоваться в первую очередь. Для ссылок публикации физического файла очерёдность не имеет значения. &lt;BR&gt;4) для HTTP ссылок никогда не используйте SSL (т.е. HTTPS ссылки), поскольку это вызовет бесконечную проверку сертификатов, в результате чего вы никогда не скачаете нужный файл. &lt;BR&gt;Более подробно можно прочитать по ссылкам: &lt;A href="http://www.sysadmins.lv/PermaLink,guid,9beb4f0a-38a8-42b2-9a49-141c04fbdcd8.aspx"&gt;CRL Distribution Points и Authority Information Access&lt;/A&gt;, &lt;A href="http://www.sysadmins.lv/PermaLink,guid,67cd6d34-9304-4ea8-bc18-456cd1de7a31.aspx"&gt;OCSP или CRL?&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000 size=4&gt;Q:&lt;/FONT&gt;&lt;/STRONG&gt; Какие версии ОС Windows поддерживают нативного клиента OCSP?&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#0000ff size=4&gt;A:&lt;/FONT&gt;&lt;/STRONG&gt; Только ОС начиная с Windows Vista/Windows Server 2008 включают в себя клиента OCSP. Предыдущие системы никогда не поддерживали и не будут поддерживать клиента OCSP. Для них придётся приобретать отдельный программный продукт сторонних компаний.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000 size=4&gt;Q:&lt;/FONT&gt;&lt;/STRONG&gt; Я хочу использовать OCSP Responder как для внутренней, так и для внешней сети (интернета). На какое имя должен выдаваться сертификат OCSPResponseSigning?&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#0000ff size=4&gt;A:&lt;/FONT&gt;&lt;/STRONG&gt; на самом деле клиенту всё равно на какое имя выдаётся данный сертификат. Главное — сертификат должен отвечать следующим условиям: &lt;BR&gt;1) должен быть выдан тем же CA для которого OCSP Responder осуществлял проверку статуса сертификата. &lt;BR&gt;2) в &lt;STRONG&gt;Application Policies&lt;/STRONG&gt; (&lt;STRONG&gt;Extended Key Usage&lt;/STRONG&gt;) должен быть указан: &lt;STRONG&gt;OCSP Signing&lt;/STRONG&gt; &lt;BR&gt;3) в сертификате должно присутствовать расширение: &lt;STRONG&gt;OCSP No Revocation Checking&lt;/STRONG&gt; &lt;BR&gt;4) срок действия сертификата должен быть действующий.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000 size=4&gt;Q:&lt;/FONT&gt;&lt;/STRONG&gt; Мы в компании перешли на Windows Vista/Windows 7 и развернули OCSP Responder. Однако в сети уже выпущено огромное количество сертификатов, которые не содержат ссылок на OCSP Responder. Надо ли перевыпускать все сертификаты для включения в них ссылки на OCSP?&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#0000ff size=4&gt;A:&lt;/FONT&gt;&lt;/STRONG&gt; нет, вам не нужно перевыпускать все сертификаты, которые уже используются. Вы можете для доменных клиентов настроить групповую политику так, чтобы они получили адрес вашего OCSP Responder и которым они будут пользоваться при проверке сертификатов. В качестве руководства по настройке этой политики можете воспользоваться вот этой ссылкой: &lt;A href="http://technet.microsoft.com/en-us/library/ee619786(WS.10).aspx" target=_blank&gt;Appendix A: Managing OCSP Settings with Group Policy&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Что бы почитать?&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://www.sysadmins.lv/PermaLink,guid,8d874040-7f98-4539-ab0e-8af4146ae94b.aspx"&gt;OCSP (часть 1)&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://www.sysadmins.lv/PermaLink,guid,dd355e23-ba68-4ff5-a89b-26e7ff2fc089.aspx"&gt;OCSP (часть 2)&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://www.sysadmins.lv/PermaLink,guid,63f4fa92-f82b-4b01-a710-6324bae859bb.aspx"&gt;Certificate Chaining Engine — как это работает&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://www.sysadmins.lv/PermaLink,guid,9beb4f0a-38a8-42b2-9a49-141c04fbdcd8.aspx"&gt;CRL Distribution Points и Authority Information Access&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://www.sysadmins.lv/PermaLink,guid,b3521905-4696-4e23-a2d8-1f6fafbfa030.aspx"&gt;Certificate chaining engine (CCE) и отзыв корневых сертификатов&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://www.sysadmins.lv/PermaLink,guid,67cd6d34-9304-4ea8-bc18-456cd1de7a31.aspx"&gt;OCSP или CRL?&lt;/A&gt; &lt;/LI&gt;&lt;/UL&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=1d4b05e1-833f-4479-b110-c3ed63be1706"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,1d4b05e1-833f-4479-b110-c3ed63be1706.aspx</comments>
      <category>Security</category>
      <category>Security / PKI</category>
      <category>Security / PKI / Chaining Engine</category>
      <category>Security / PKI / OCSP</category>
      <category>Security / PKI / Tips &amp; Tricks</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=b3521905-4696-4e23-a2d8-1f6fafbfa030</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,b3521905-4696-4e23-a2d8-1f6fafbfa030.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,b3521905-4696-4e23-a2d8-1f6fafbfa030.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=b3521905-4696-4e23-a2d8-1f6fafbfa030</wfw:commentRss>
      <title>Certificate chaining engine (CCE) и отзыв корневых сертификатов</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,b3521905-4696-4e23-a2d8-1f6fafbfa030.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,b3521905-4696-4e23-a2d8-1f6fafbfa030.aspx</link>
      <pubDate>Sun, 08 Nov 2009 17:20:10 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; данный материал публикуется исключительно в учебных целях и его &lt;strong&gt;НЕ&lt;/strong&gt; следует повторять! Любые действия описанные в данной статье вы можете делать &lt;strong&gt;ТОЛЬКО&lt;/strong&gt; на свой страх и риск.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Мы с вами уже достаточно много обсудили про certificate chaining engine и расширения CDP в сертификатах и связанные с ними вопросы:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.sysadmins.lv/PermaLink,guid,63f4fa92-f82b-4b01-a710-6324bae859bb.aspx"&gt;&lt;strong&gt;Certificate Chaining Engine — как это работает&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.sysadmins.lv/PermaLink,guid,b14ea574-ca90-4f1b-9845-35b6ce273fb2.aspx"&gt;&lt;strong&gt;Certificate chaining engine в PowerShell&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.sysadmins.lv/PermaLink,guid,16ffa3d3-8449-4c16-9704-5d089b6a32e2.aspx"&gt;&lt;strong&gt;Certificate chaining engine в PowerShell (часть 2)&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.sysadmins.lv/PermaLink,guid,9beb4f0a-38a8-42b2-9a49-141c04fbdcd8.aspx"&gt;&lt;strong&gt;CRL Distribution Points и Authority Information Access&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Но я решил немного расширить сознание по этому вопросу и рассмотреть ситуацию с отозванным корневым (который является и самоподписанным) сертификатом. Для экспериментов использовались CA под управлением Windows Server 2003 и Windows Server 2008 R2 (в обоих случаях поведение было идентичное). Штатно (из консоли certsrv.msc) у нас нет возможности отозвать корневой сертификат CA, но мы можем технически это сделать с использованием CryptoAPI COM интерфейсов. Сразу после отзыва корневого сертификата в свойствах CA мы увидим вот такую картинку:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Revoked Root CA certificate" border="0" alt="Revoked Root CA certificate" src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/CDP_F9DB/rca_507c4f07-037c-46f6-8abf-470d2e397887.png" width="407" height="535" /&gt; &lt;/p&gt;  &lt;p&gt;и вот такое сообщение в журнале событий:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font color="#804000"&gt;Log Name:      Application       &lt;br /&gt;Source:        Microsoft-Windows-CertificationAuthority        &lt;br /&gt;Date:          2009.11.08. 17:35:44        &lt;br /&gt;Event ID:      51        &lt;br /&gt;Task Category: None        &lt;br /&gt;Level:         Error        &lt;br /&gt;Keywords:      Classic        &lt;br /&gt;User:          SYSTEM        &lt;br /&gt;Computer:      RootCA        &lt;br /&gt;Description:        &lt;br /&gt;A certificate in the chain for CA certificate 0 for Adatum CA has been revoked.  The certificate is revoked. 0x80092010 (-2146885616).&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Всё, приехали, что дальше? А дальше мы рассмотрим актуальность наличия CDP в корневых сертификатах, при помощи которых мы можем посмотреть CRL рассматриваемого CA (это корневой CA, поэтому в его CDP могут быть ссылки только на его собственный CRL), как это делают некоторые публичные коммерческие CA (например, &lt;strong&gt;StartCom&lt;/strong&gt;). Когда корневой сертификат отозван, мы продолжаем его не наблюдать в консоли certsrv.msc, но в БД это хорошо видно:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font color="#804000"&gt;Request Status Code: 0x0 (WIN32: 0) -- The operation completed successfully.       &lt;br /&gt;&lt;strong&gt;Request Disposition: 0xf (15) -- CA Cert&lt;/strong&gt;        &lt;br /&gt;&lt;strong&gt;Request Disposition Message: "Revoked by ADATUM\Administrator"&lt;/strong&gt;        &lt;br /&gt;Request Submission Date: 2009.11.07. 22:41        &lt;br /&gt;Request Resolution Date: 2009.11.07. 22:41        &lt;br /&gt;Revocation Date: 2009.11.08. 17:35:43        &lt;br /&gt;Effective Revocation Date: 2009.11.08. 17:35:43        &lt;br /&gt;Revocation Reason: 0x0 -- Reason: Unspecified&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Но мы же можем попробовать опубликовать новый CRL? Ответ — нет, не можете. Поскольку CRL подписывается закрытым ключом CA, то перед подписью CRL производится проверка валидности этого ключа для подписи CRL. Т.к. на данном этапе CA уже знает, что сертификат отозван, то ключ блокируется для подписи новых CRL, т.к. они будут считаться поддельными. Это будет первый аргумент в пользу отсутствия CDP в корневых сертификатах. Если CRL подписан отозванным ключом, то этот CRL должен игнорироваться по очевидным причинам.&lt;/p&gt;  &lt;p&gt;Однако, тут есть одна интересная вещь — пока служба CertSvc не перезапущена, мы можем энролить новые сертификаты. Т.е. в этом промежутке клиенты могут нагенерить запросы и получить в ответ сертификаты. Это действительно проблема, потому что сертификаты так же подписываются закрытым ключом CA. И, по всей видимости, CA лишь с некоторой периодичностью проверяет валидность закрытого ключа для данной операции. Хотя, в случае с CRL эта проверка производится каждый раз перед подписью. После остановки службы CertSvc наш CA отключается навсегда:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font color="#804000"&gt;Log Name:      Application       &lt;br /&gt;Source:        Microsoft-Windows-CertificationAuthority        &lt;br /&gt;Date:          2009.11.08. 17:42:21        &lt;br /&gt;Event ID:      100        &lt;br /&gt;Task Category: None        &lt;br /&gt;Level:         Error        &lt;br /&gt;Keywords:      Classic        &lt;br /&gt;User:          SYSTEM        &lt;br /&gt;Computer:      RootCA        &lt;br /&gt;Description:        &lt;br /&gt;Active Directory Certificate Services did not start: Could not load or verify the current CA certificate.  Adatum CA The certificate is revoked. 0x80092010 (-2146885616).&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;А дальше становится ещё интересней. Методика работы CCE описана в &lt;a href="http://tools.ietf.org/html/rfc3280" target="_blank"&gt;&lt;strong&gt;RFC3280&lt;/strong&gt;&lt;/a&gt;. Для администраторов PKI описываемый там материал нужно знать обязательно. Параграф 6 описывает процедуру построения цепочки сертификатов:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font color="#804000"&gt;§ 6.1.       &lt;br /&gt;        &lt;br /&gt;When the trust anchor is provided in the form of a self-signed        &lt;br /&gt;certificate, this self-signed certificate is not included as part of        &lt;br /&gt;the prospective certification path&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Это означает, что самоподписанный сертификат (корневой таковым и является) исключается из проспективной цепочки сертификатов. А проверка CRL допускается &lt;strong&gt;только&lt;/strong&gt; для этой проспективной цепочки.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font color="#804000"&gt;§ 6.1.1.       &lt;br /&gt;        &lt;br /&gt;The trusted anchor information is trusted because it was delivered        &lt;br /&gt;to the path processing procedure by some trustworthy out-of-band        &lt;br /&gt;procedure.&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font color="#804000"&gt;§ 9.&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#804000"&gt;The certification path validation algorithm depends on the certain       &lt;br /&gt;knowledge of the public keys (and other information) about one or        &lt;br /&gt;more trusted CAs. The decision to trust a CA is an important        &lt;br /&gt;decision as it ultimately determines the trust afforded a        &lt;br /&gt;certificate.&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Иными словами RFC предусматривает безоговорочное доверие конкретному корневому сертификату, когда доверие осуществляется каким-то механизмом (в Windows это наличие сертификата в Trusted Root CAs). И в § 6.1.3 говорится, что из цепочки (проспективной) удаляются все самоподписанные сертификаты, следовательно произвести проверку CRL можно только для сертификатов, которые в цепочке находятся на уровень ниже, чем самоподписанный сертификат. Это означает только одну вещь: если CCE является RFC3280-compliant, то он должен игнорировать расширение CDP в самоподписанном сертификате. Учитывая, что Windows CA технически не позволяет поместить свой сертификат в свой CRL, то скорее всего реализация CCE в CryptoAPI будет дейтсвовать адекватно и во всех случаях игнорировать это расширение. Поэтому даже при гипотетической возможности помещения отозванного корневого сертификата в его собственный CRL мы проигнорируем такой CRL и не узнаем, что корневой сертификат ВНЕЗАПНО был отозван.&lt;/p&gt;  &lt;p&gt;Это была реклама VeriSign.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=b3521905-4696-4e23-a2d8-1f6fafbfa030"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,b3521905-4696-4e23-a2d8-1f6fafbfa030.aspx</comments>
      <category>Security</category>
      <category>Security / PKI</category>
      <category>Security / PKI / Chaining Engine</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=9beb4f0a-38a8-42b2-9a49-141c04fbdcd8</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,9beb4f0a-38a8-42b2-9a49-141c04fbdcd8.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,9beb4f0a-38a8-42b2-9a49-141c04fbdcd8.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=9beb4f0a-38a8-42b2-9a49-141c04fbdcd8</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <title>CRL Distribution Points и Authority Information Access</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,9beb4f0a-38a8-42b2-9a49-141c04fbdcd8.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,9beb4f0a-38a8-42b2-9a49-141c04fbdcd8.aspx</link>
      <pubDate>Sun, 01 Nov 2009 15:53:06 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;Примечание:&lt;/FONT&gt;&lt;/STRONG&gt; данный материал публикуется как обязательный для знания IT-специалистами, которые занимаются или только собираются заниматься темой &lt;STRONG&gt;PKI&lt;/STRONG&gt; (&lt;EM&gt;Public Key Infrastructure&lt;/EM&gt;).&lt;/P&gt;
&lt;P&gt;Большинство системных администраторов считают, что планирование списков отзыва сертификатов (&lt;EM&gt;Certificate Revocation List&lt;/EM&gt; — &lt;STRONG&gt;CRL&lt;/STRONG&gt;) и файлов сертификатов самих серверов CA — это элементарная вещь. Но практика показывает, что очень многие из них сильно заблуждаются. Поэтому предлагаю немного повременить с CryptoAPI и поговорить о немного более насущных вещах — рекомендации по планированию публикации списков CRL и сертификатов CA (&lt;EM&gt;Certification Authority&lt;/EM&gt;), которые используются certificate chaining engine для построения и проверок цепочек сертификатов. О том, как работает этот движок можете почитать пост: &lt;A href="http://www.sysadmins.lv/PermaLink,guid,63f4fa92-f82b-4b01-a710-6324bae859bb.aspx"&gt;&lt;STRONG&gt;Certificate Chaining Engine — как это работает&lt;/STRONG&gt;&lt;/A&gt;.&lt;/P&gt;
&lt;H1 align=center&gt;Куда и как публиковать файлы CRL и CRT?&lt;/H1&gt;
&lt;P&gt;Как известно, каждый выданный в CA сертификат (кроме самоподписанных сертификатов. Корневой сертификат так же является самоподписанным сертификатом) содержит 2 расширения:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;В расширении «&lt;EM&gt;CRL Distribution Points&lt;/EM&gt; (&lt;STRONG&gt;CDP&lt;/STRONG&gt;)» хранятся ссылки на CRL издавшего конкретный сертификат CA; 
&lt;LI&gt;В расширении «&lt;EM&gt;Authority Information Access&lt;/EM&gt; (&lt;STRONG&gt;AIA&lt;/STRONG&gt;)» хранятся ссылки на сертификат CA, издавшего конкретный сертификат. А для сертификатов, выданных CA под управлением Windows Server 2008 и выше — могут содержаться ссылки на OCSP Responder (см. &lt;A href="http://www.sysadmins.lv/PermaLink,guid,8d874040-7f98-4539-ab0e-8af4146ae94b.aspx"&gt;&lt;STRONG&gt;OCSP (часть 1)&lt;/STRONG&gt;&lt;/A&gt; и &lt;A href="http://www.sysadmins.lv/PermaLink,guid,dd355e23-ba68-4ff5-a89b-26e7ff2fc089.aspx"&gt;&lt;STRONG&gt;OCSP (часть 2)&lt;/STRONG&gt;&lt;/A&gt;) &lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Эти ссылки берутся не из воздуха, а из настроек CA. Вот как они выглядят для дефолтной инсталляции Certificate Services:&lt;/P&gt;
&lt;DIV align=center&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="Default CDP" border=0 alt="Default CDP" src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/CRLDistributionPointsAuthorityInformatio_12CDF/DefaultCDP_7a1bcc02-67d0-469b-966a-f3395a35f4ee.jpg" width=407 height=482&gt;&amp;nbsp;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="Default AIA" border=0 alt="Default AIA" src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/CRLDistributionPointsAuthorityInformatio_12CDF/DefaultAIA_b7cbcc79-2945-4a14-9e7d-e84bfed51cba.jpg" width=407 height=482&gt; &lt;/DIV&gt;
&lt;P&gt;В принципе, эти настройки годятся для нормальной работы certificate chaining engine в небольших сетях с одним лесом и доменом без сайтов (или с сайтами, соединённых быстрыми каналами). Если сеть состоит из нескольких доменов (или лесов с настроенным Cross-forest enrollment) и сайтами, соединённых не очень быстрыми каналами, то эти настройки уже могут приводить к сбоям построения и проверок цепочек сертификатов. Я не буду рассказывать, что означают галочки, т.к. с ними вы можете ознакомиться в статьях &lt;A href="http://technet.microsoft.com/en-us/library/cc775373(WS.10).aspx" target=_blank&gt;&lt;STRONG&gt;CRL Publishing Properties&lt;/STRONG&gt;&lt;/A&gt; и &lt;A href="http://technet.microsoft.com/en-us/library/cc782266(WS.10).aspx" target=_blank&gt;&lt;STRONG&gt;AIA Publishing Properties&lt;/STRONG&gt;&lt;/A&gt;, а приступлю сразу к разбору путей.&lt;/P&gt;
&lt;P&gt;Первый путь указывает путь файловой системы, куда физически публикуются файлы CRL и CRT. Следующая ссылка (&lt;FONT color=#0000ff&gt;LDAP://{LDAP path}&lt;/FONT&gt;) указывает, точку публикации CRL и CRT в Active Directory. Так же эти пути будут прописаны во всех выдаваемых сертификатах. Третья ссылка (&lt;FONT color=#0000ff&gt;HTTP://{URL}&lt;/FONT&gt;) указывает URL, по которому клиенты могут скачать файл через HTTP и этот URL будет включён в расширение CDP/AIA всех выдаваемых сертификатов. Последняя ссылка ничего не делает и добавлена в целях дополнительной точки публикации файлов CRL/CRT в сетевой папке. Почему эти настройки не оптимальны для больших сетей?&lt;/P&gt;
&lt;P&gt;Вот как будут выглядеть расширения CDP и AIA в выдаваемых сертификатах при таких настройках:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;CDP&lt;/STRONG&gt; &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;[1]CRL Distribution Point &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Distribution Point Name: &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Full Name:&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp; URL=ldap:///CN=Contoso%20CA,CN=DC1,CN=CDP,CN=Public%20Key%20Services,CN=Services,CN=Configuration,DC=contoso,DC=com?certificateRevocationList?base?objectClass=cRLDistributionPoint &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; URL=http://dc1.contoso.com/CertEnroll/Contoso%20CA.crl&lt;/FONT&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;AIA&lt;/STRONG&gt; &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;[1]Authority Info Access &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Access Method=Certification Authority Issuer (1.3.6.1.5.5.7.48.2) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Alternative Name:&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp; URL=ldap:///CN=Contoso%20CA,CN=AIA,CN=Public%20Key%20Services,CN=Services,CN=Configuration,DC=contoso,DC=com?cACertificate?base?objectClass=certificationAuthority &lt;BR&gt;[2]Authority Info Access &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Access Method=Certification Authority Issuer (1.3.6.1.5.5.7.48.2) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Alternative Name: &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; URL=http://dc1.contoso.com/CertEnroll/DC1.contoso.com_Contoso%20CA.crt&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Как вы видите, ссылки в расширениях расположены в том же порядке, что и в настройках CA.&lt;/P&gt;
&lt;P&gt;Это важно знать, поскольку certificate chaining engine (сокращённо назовём его &lt;STRONG&gt;CCE&lt;/STRONG&gt;) будет проверять ссылки в том порядке, в котором они приведены в расширениях сертификата. Т.е. сперва будет пробовать скачать файл из Active Directory в течении 10 секунд. Если за 10 секунд файл не скачается, CCE будет пытаться скачать указанный файл по следующей ссылке (HTTP). При этом времени на это будет отводиться в 2 раза меньше (т.е. 5 секунд), чем в предыдущей попытке. И так будет происходить с каждой последующей ссылкой, пока не будет добыт файл, закончатся ссылки или отвалится по таймауту. На обработку каждого расширения для CCE выделяется ровно 20 секунд.&lt;/P&gt;
&lt;P&gt;Уже на данном этапе видно, что любой недоменный клиент (будь то смартфон, изолированная рабочая станция в интернете, etc.) при попытке скачать файл может терять до 10 секунд на обработку первой ссылки, которая всегда завершится неудачей. Следовательно, первой ссылкой в CDP/AIA должна быть ссылка, которая использует универсальный для всех протокол (это должен быть HTTP), не смотря на то, что в домене, где расположен CA доступ через LDAP будет чуточку быстрее.&lt;/P&gt;
&lt;P&gt;Второй момент заключается в репликации объектов AD. После того как CRL/CRT были опубликованы в Active Directory, клиенты об этом узнают не сразу, т.к. здесь вступает фактор репликации AD. Поскольку все объекты PKI публикуются в AD в разделе &lt;EM&gt;forest naming context&lt;/EM&gt;, то эти данные реплицируются не только в прелелах текущего домена, но и всего леса. Поэтому задержки в появлении новых файлов у клиентов могут быть очень значительными и достигать нескольких часов. Задержки могут составлять время до двух полных циклов полной репликации в лесу. А если у вас используется cross-forest enrollment, то там ситуация будет ещё хуже, поскольку это ещё будет зависить от периодичности репликации объектов PKI между лесами (AD не поддерживает репликацию между лесами и репликация объектов PKI выполняется вручную) и уже может достигать нескольких суток. По этой причине рекомендуется либо вовсе отказаться от публикации CRL/CRT в AD и включения этих ссылок в сертификаты, либо располагать следом за более доступными протоколами.&lt;/P&gt;
&lt;P&gt;С HTTP тоже не всё так идеально, как это может показаться с первого взгляда. Совсем не обязательно, чтобы сервер CA выполнял и роль веб-сервера (хотя, только для внутреннего использования это допустимо с определёнными оговорками). Будет лучше даже если файлы CRL/CRT будут копироваться как на внутренний, так и на внешний веб-серверы. В идеале эти файлы должны копироваться как минимум на 1-2 внутренних и 1-2 внешних веб-сервера для обеспечения высокой доступности. В таких случаях уже используется 4-я ссылка в настройках CA, которая должна указываь на шару DFS, чтобы файлы автоматически распространялись по веб-серверам. И вот здесь мы снова сталкиваемся с латентностью репликации DFS между серверами. Если все схемы публикации CRL/CRT подвержены латентности репликации, то как с этим бороться, чтобы файлы были всегда в актуальном состоянии?&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;Примечание:&lt;/FONT&gt;&lt;/STRONG&gt; хоть CCE поддерживает скачивание CRL и CRT с HTTPS ссылок, делать это категорически нельзя, иначе CCE свалится в бесконечный цикл проверки сертификатов.&lt;/P&gt;
&lt;H1 align=center&gt;Периодичность публикации и обновления файлов CRL и CRT&lt;/H1&gt;
&lt;P&gt;По умолчанию в Windows Server основные CRL (&lt;STRONG&gt;Base CRL&lt;/STRONG&gt;) публикуются раз в неделю и инкрементные CRL (&lt;STRONG&gt;Delta CRL&lt;/STRONG&gt;) публикуются раз в сутки. Файлы сертификатов CA обычно обновляются через промежутки равные времени жизни сертификата самого CA (или чаще, если сертификат CA обновляется внепланово). Если сертификаты CA нужно обновлять достаточно редко (раз в несколько лет) и к этому следует готовиться отдельно, то обновление CRL происходит автоматически без вмешательства администратора и здесь требуются особые корректировки о которых мы сейчас и поговорим.&lt;/P&gt;
&lt;P&gt;Если посмотреть на CRL, то мы увидим следующее:&lt;/P&gt;
&lt;DIV align=center&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="Certificate Revocation List Information" border=0 alt="Certificate Revocation List Information" src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/CRLDistributionPointsAuthorityInformatio_12CDF/crl1.png" width=423 height=521&gt;&amp;nbsp; &lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="Certificate Revocation List Information" border=0 alt="Certificate Revocation List Information" src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/CRLDistributionPointsAuthorityInformatio_12CDF/crl2.png" width=423 height=521&gt;&lt;/DIV&gt;
&lt;P&gt;Сейчас нас будут интересовать только 3 поля:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Effective Date&lt;/STRONG&gt; — указывает дату и время с которого данный CRL считается действительным и оно по умолчанию на 10 минут меньше, чем фактическое время, чтобы покрыть издержки рассинхронизации времени между сервером и клиентом; 
&lt;LI&gt;&lt;STRONG&gt;Next Update&lt;/STRONG&gt; — указывает дату и время, когда заканчивается срок действия конкретного CRL и он считается недействительным; 
&lt;LI&gt;&lt;STRONG&gt;Next CRL Publish&lt;/STRONG&gt; — указывает дату и время публикации следующего списка CRL. &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;Примечение:&lt;/FONT&gt;&lt;/STRONG&gt; время в этих полях указывается в формате UTC без учёта временных зон.&lt;/P&gt;
&lt;P&gt;Обычно время Next Update и Next CRL Publish одинаково. Но у меня, как вы видите на картинках, Next Update равен&amp;nbsp;8 дням (дефолтный срок действия CRL), а вот Next CRL Publish равен&amp;nbsp;7 дням после начала действия CRL. Т.е. CRL обновляется каждые&amp;nbsp;7 дней, но срок действия равен&amp;nbsp;8 дням (период публикации CRL + время overlap). Это сделано как раз для покрытия расходов времени (издержки репликации) распространения списков отозванных сертификатов от сервера CA до точек, откуда клиенты будут скачивать CRL. Как это делается?&lt;/P&gt;
&lt;P&gt;Для этого в реестре на сервере CA по пути &lt;FONT color=#0000ff&gt;HKLM\System\CurrentControlSet\Services\CertSvc\Configuration\CA Name&lt;/FONT&gt; существует 4 ключа:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;CRLOverlapUnits&lt;/STRONG&gt; — указывает время до истечения срока действия текущего основного CRL, за которое будет публиковаться новый основной CRL. 
&lt;LI&gt;&lt;STRONG&gt;CRLOverlapPeriod&lt;/STRONG&gt; — указывает единицу измерения этого времени для основного CRL 
&lt;LI&gt;&lt;STRONG&gt;CRLDeltaOverlapUnits&lt;/STRONG&gt; — указывает время до истечения срока действия текущего инкрементального (если используется) CRL, за которое будет публиковаться новый инкрементальный CRL 
&lt;LI&gt;&lt;STRONG&gt;CRLDeltaPeriodPeriod&lt;/STRONG&gt; — указывает единицу измерения этого времени для инкрементального CRL. &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Если вы используете LDAP ссылки в расширениях CDP/AIA сертификатов и/или у вас есть латентность репликации файлов между веб-серверами, то вы должны отрегулировать это время, которое должно быть не менее, чем максимальное время репликации каталога AD во всём лесу или DFS как для основных, так и для инкрементальных CRL (если они у вас используются). Данную операцию можно автоматизировать утилитой certutil:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;certutil –setreg ca\CRLOverlapUnits 1 &lt;BR&gt;certutil –setreg ca\CRLOverlapPeriod "days" &lt;BR&gt;certutil –setreg ca\CRLDeltaOverlapUnits 8 &lt;BR&gt;certutil –setreg ca\CRLDeltaOverlapPeriod "hours" &lt;BR&gt;net stop certsvc &amp;amp; net start certsvc&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;Примечание:&lt;/FONT&gt;&lt;/STRONG&gt; CRLOverlap не может быть больше периодичности публикации BaseCRL, а CRLDeltaOverlap не может быть больше 12 часов.&lt;/P&gt;
&lt;P&gt;в результате новые основные CRL будут публиковаться за сутки до истечения времени действия предыдущего основного CRL и новые инкрементальные CRL будут публиковаться за 8 часов до истечения предыдущего. Этим самым вы сможете гарантировать, что клиенты всегда получат актуальные CRL'ы. Более детальные сведения о порядке подсчёта временных интервалов публикации CRL и срока их&amp;nbsp;действия можно ознакомиться здесь: &lt;A href="http://blogs.technet.com/pki/archive/2008/06/05/how-effectivedate-thisupdate-nextupdate-and-nextcrlpublish-are-calculated.aspx"&gt;&lt;STRONG&gt;How EffectiveDate (thisupdate), NextUpdate and NextCRLPublish are calculated&lt;/STRONG&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Общая периодичность публикации самих файлов CRL зависит от количества отзываемых сертификатов за некоторый промежуток времени (обычно измеряется в неделях). Если сертификаты отзываются десятками в неделю, то есть смысл сократить периодичность публикации основных CRL до 2 раз в неделю и Delta CRL до 2-х раз в сутки. Если сертификаты отзываются редко (реже, чем раз в неделю), то периодичность публикации Base CRL можно увеличить до 2-4 недель, а от Delta CRL можно даже отказаться или публиковать раз в неделю. Но это касается только Issuing или Online CA. Для Offline CA рекомендации будут чуть другие. Поскольку Offline CA выдают сертификаты только другим CA и большую часть времени выключены, для них следует отключить публикацию Delta CRL (установив параметр &lt;STRONG&gt;CRL&lt;STRONG&gt;Delta&lt;/STRONG&gt;PeriodUnits&lt;/STRONG&gt; в ноль), а основные CRL публиковать раз в 3-12 месяцев. Хоть это и Offline CA, но на него так же распространяются требования по корректировке времени публикации и срока действия CRL.&lt;/P&gt;
&lt;H1 align=center&gt;CDP и AIA в корневых сертификатах&lt;/H1&gt;
&lt;P&gt;Как уже отмечалось, расширения CDP и AIA содержат ссылки на CRL/CRT издавшего конкретный сертификат CA, то с корневыми сертификатами будет немного иначе. Если быть точнее, то в корневых сертификатах этих расширений быть не должно совсем. Почему? Windows Server 2003 по умолчанию добавлял эти расширения в самоподписанный сертификат, когда CA конфигурировался как корневой CA. В нём AIA содержал ссылки по которым можно было скачать этот же сертификат. Очень прикольно &lt;img alt=":)" src="/smilies/happy.gif"&gt;.&lt;/P&gt;
&lt;P&gt;А CDP — не менее прикольно. Корневые сертификаты всегдя являются конечной точкой самой цепочки и доверия этой цепочки сертификатов. К корневым сертификатам доверие всегда устанавливается явное путём помещения сертификата в контейнер &lt;STRONG&gt;Trusted Root CAs&lt;/STRONG&gt; (а ко всем остальным сертификатам устанавливается неявное доверие через цепочку сертификатов). Следовательно отменить доверие корневому сертификату CA можно только одним способом — удалить сам сертификат из контейнера Trusted Root CAs и никак иначе. Вторая проблема заключается в том, что все CRL подписываются закрытым ключом самого CA. А теперь предположим, что CA отозвал свой сертификат и поместил его в CRL. Клиент скачивает CRL и видит, что сертификат CA отозван. Можно предположить, что это всё и никакой проблемы здесь нет. Однако, получается, что CRL подписан отозванным сертификатом и мы не можем доверять этому CRL как и считать сертификат CA отозванным. Именно поэтому начиная с Windows Server 2008 при установке корневого CA, эти расширения по умолчанию уже не включены в корневой сертификат. А для Windows Server 2003 приходилось лепить костыли в файле &lt;STRONG&gt;CAPolicy.inf&lt;/STRONG&gt;:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;[AuthorityInformationAccess] &lt;BR&gt;Empty = true &lt;BR&gt;[CRLDistributionPoint] &lt;BR&gt;Empty = true&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Как показывает практика, очень много администраторов игнорируют такие вещи и делают всё простым Next-Next, за что они должны гореть в аду. Но не только простые Windows-админстраторы, а луноходы (фаны линукса) тоже должны там гореть. Как живой пример бардака в сертификатах приведу компанию &lt;A href="http://www.startcom.org" target=_blank&gt;&lt;STRONG&gt;StartCom&lt;/STRONG&gt;&lt;/A&gt;, которая в сентябре 2009 получила право выдавать &lt;STRONG&gt;EV&lt;/STRONG&gt; (&lt;EM&gt;Extended Validation&lt;/EM&gt;) сертификаты и вот их корневой сертификат: &lt;A title="http://www.startssl.com/sfsca.crt&amp;#13;&amp;#10;" href="http://www.startssl.com/sfsca.crt"&gt;http://www.startssl.com/sfsca.crt&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Мало того, что у них в корневом сертификате есть расширение CDP, но и с ссылками на CRL у них в цепочке тоже бардак мутный. Есть подозрение, что это сделано для поддержки какой-то ветки линукса (для совместимости или просто как костыль), но вот такой он опенсорс. Так что не каждый публичный и коммерческий CA следует всем бест-практисам. А вам советую им следовать, тогда меньше вероятность, что вы потом будете гореть в аду.&lt;/P&gt;
&lt;H1 align=center&gt;Изменения в существующих инфраструктурах&lt;/H1&gt;
&lt;P&gt;Изменение путей в уже существующих инфраструктурах вопрос достаточно серьёзный, хоть и прост в реализации. Если вы решились на такой шаг, то следует руководствоваться следующими правилами:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;пути публикации физических файлов можно располагать в произвольном порядке; 
&lt;LI&gt;новые ссылки к файлам, по которым клиенты будут их скачивать должны располагаться первыми, т.е. с более высоким приоритетом (кроме случаев, когда вы добавляете ссылки только для обеспечения более высокой доступности файлов. Тогда новые ссылки можно просто добавить в хвост уже существующим); 
&lt;LI&gt;если вы собираетесь уйти от существующих ссылок на CRL/CRT, то в для них следует отключить опцию публикации ссылок в сертификатах. Однако, до окончания действия сертификата CA вы будете обязаны их поддерживать в рабочем состоянии, т.к. они содержатся в уже выданных сертификатах. А новые ссылки появятся только в сертификатах, которые были выпущены после изменения CDP/AIA. 
&lt;LI&gt;если у вас корневой сертификат уже содержит расширения CDP/AIA, то вы не можете их оттуда убрать до момента обновления корневого сертификата. При обновлении корневого сертификата на Windows Server 2003, вам потребуется создать CAPolicy.inf файл, прописать нужные настройки (например, как уже указано выше с пустыми CDP и AIA). Более подробно про файл &lt;STRONG&gt;CAPolicy.inf&lt;/STRONG&gt; можно прочитать по ссылке: &lt;A title=http://technet.microsoft.com/en-us/library/cc728279(WS.10).aspx href="http://technet.microsoft.com/en-us/library/cc728279(WS.10).aspx"&gt;http://technet.microsoft.com/en-us/library/cc728279(WS.10).aspx&lt;/A&gt; &lt;/LI&gt;&lt;/UL&gt;
&lt;H1 align=center&gt;Новые технологии&lt;/H1&gt;
&lt;P&gt;С выходом Windows Server 2008 Enterprise Edition вы можете внедрить в своей сети Online Responder для снижения нагрузки на серверы публикации CRL (хоть пути к OCSP публикуются в расширении AIA, к файлам CRT это никакого отношения не имеет). Но даже внедрение OCSP не решает этих проблем, поскольку реализация OCSP в Windows Server основана на регулярном чтении CRL и, следовательно, зависит от латентности репликации AD и/или DFS, а так же этим сервисом могут пользоваться только клиенты начиная с Windows Vista. Хочу отметить один приятный момент. Если изменения ссылок на CRL/CRT скажутся только на новых сертификатах (уже выпущенные сертификаты ничего не будут знать о новых путях в CDP/AIA), то интегрировать OCSP внутри домена/леса с уже существующей инфраструктурой PKI достаточно легко. Все уже выданные сертификаты могут быть проверены на отзыв с использованием OCSP: &lt;A href="http://technet.microsoft.com/en-us/library/ee619786(WS.10).aspx" target=_blank&gt;&lt;STRONG&gt;Managing OCSP Settings with Group Policy&lt;/STRONG&gt;&lt;/A&gt;.&lt;/P&gt;
&lt;H1 align=center&gt;Заключение&lt;/H1&gt;
&lt;P&gt;В данном посте я обозначил ключевые моменты в структуированном (как мне кажется) виде, которые следует знать при планировании публикации файлов CRL/CRT и ссылок на них. Как вы видите, внедрение новых технологий пока что не освобождает от знания и соблюдения рекомендаций публикации CRL/CRT в вашей инфраструктуре PKI. Я считаю этот материал достаточным для начального и среднего уровня знаний по теме revocation и chain building и для более детального изучения всего этого процесса уже следует обратиться сюда: &lt;A href="http://technet.microsoft.com/en-us/library/ee619730(WS.10).aspx" target=_blank&gt;&lt;STRONG&gt;Certificate Revocation Checking in Windows Vista and Windows Server 2008&lt;/STRONG&gt;&lt;/A&gt;.&lt;/P&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=9beb4f0a-38a8-42b2-9a49-141c04fbdcd8"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,9beb4f0a-38a8-42b2-9a49-141c04fbdcd8.aspx</comments>
      <category>Security</category>
      <category>Security / PKI</category>
      <category>Security / PKI / Chaining Engine</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=16ffa3d3-8449-4c16-9704-5d089b6a32e2</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,16ffa3d3-8449-4c16-9704-5d089b6a32e2.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,16ffa3d3-8449-4c16-9704-5d089b6a32e2.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=16ffa3d3-8449-4c16-9704-5d089b6a32e2</wfw:commentRss>
      <slash:comments>5</slash:comments>
      <title>Certificate chaining engine в PowerShell (часть 2)</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,16ffa3d3-8449-4c16-9704-5d089b6a32e2.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,16ffa3d3-8449-4c16-9704-5d089b6a32e2.aspx</link>
      <pubDate>Mon, 19 Oct 2009 18:52:44 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Примечание:&lt;/font&gt;&lt;/strong&gt; данный материал публикуется на правах ТЗ (&lt;strong&gt;ТЗ&lt;/strong&gt; — &lt;em&gt;Тайное Знание&lt;/em&gt;) и обязателен для знания администраторам PKI.&lt;/p&gt;  &lt;p&gt;В предыдущей части (&lt;a href="http://www.sysadmins.lv/PermaLink,guid,b14ea574-ca90-4f1b-9845-35b6ce273fb2.aspx"&gt;&lt;strong&gt;Certificate chaining engine в PowerShell&lt;/strong&gt;&lt;/a&gt;) мы рассмотрели реализацию certificate chaining engine в .NET в виде класса &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509chain.aspx"&gt;&lt;strong&gt;X509Chain&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&lt;/strong&gt;. Но этот рассказ был бы неполным, если мы не поговорили про &lt;a href="http://msdn.microsoft.com/en-us/library/aa377611(VS.85).aspx"&gt;&lt;strong&gt;CAPICOM.Chain&lt;/strong&gt;&lt;/a&gt;. Хоть Microsoft рекомендует использовать .NET, а не CAPICOM для решения данной задачи, я считаю необходимым осветить этот вопрос. Для начала начнём с реализации CAPICOM в PowerShell. По непонятным мне пока причинам мне не удалось завести его в PowerShell на системах Windows Vista и выше, поэтому примеры буду приводить на Windows Server 2003.&lt;/p&gt;  &lt;div style="width: 935px"&gt;   &lt;blockquote&gt;     &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;PS G:\&gt; $chain = New-Object -ComObject "CAPICOM.Chain"
PS G:\&gt; $chain

Certificates
------------



PS G:\&gt; $chain | gm -MemberType methods


   TypeName: System.__ComObject#{ca65d842-2110-4073-aee3-d0aa5f56c421}

Name                MemberType Definition
----                ---------- ----------
ApplicationPolicies Method     IOIDs ApplicationPolicies ()
Build               Method     bool Build (ICertificate)
CertificatePolicies Method     IOIDs CertificatePolicies ()
ExtendedErrorInfo   Method     string ExtendedErrorInfo (int)


PS G:\&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Так же, как и в .NET у нас есть метод &lt;a href="http://msdn.microsoft.com/en-us/library/aa377617(VS.85).aspx" target="_blank"&gt;&lt;strong&gt;Build()&lt;/strong&gt;&lt;/a&gt;, который запускает certificate chaining engine для указанного сертификата. Но это COM объект и X509Certificate2 объекты не принимает. Поэтому мы средствами этого же CAPICOM получим нужный объект сертификата:&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;PS G:\&gt; $store = New-Object -ComObject "CAPICOM.Store"
PS G:\&gt; $store.Open(2,"my",128)
PS G:\&gt; $cert = @()
PS G:\&gt; $store.Certificates | %{$cert += $_}
PS G:\&gt; $cert = $cert[1]
PS G:\&gt; $cert


Version       : 3
SerialNumber  : 167D6D32000000000011
SubjectName   : CN=Administrator, CN=Users, DC=sysadmins, DC=lv
IssuerName    : CN=sysadmins-LV-CA, DC=sysadmins, DC=lv
ValidFromDate : 2009.08.07. 16:09:56
ValidToDate   : 2010.08.07. 16:09:56
Thumbprint    : 1FA71B51BCE461BEE24B11AA9EF855ED00DFDFD4
Archived      : False
PrivateKey    :



PS G:\&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Вот такой объект сертификата мы получили. Вот его и пропустим через метод Build():&lt;/p&gt;

&lt;div style="width: 935px"&gt;
  &lt;blockquote&gt;
    &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;PS G:\&gt; $chain.Build($cert)
False
PS G:\&gt; $chain.Status()
32
PS G:\&gt; $chain.Certificates


Version       : 3
SerialNumber  : 167D6D32000000000011
SubjectName   : CN=Administrator, CN=Users, DC=sysadmins, DC=lv
IssuerName    : CN=sysadmins-LV-CA, DC=sysadmins, DC=lv
ValidFromDate : 2009.08.07. 16:09:56
ValidToDate   : 2010.08.07. 16:09:56
Thumbprint    : 1FA71B51BCE461BEE24B11AA9EF855ED00DFDFD4
Archived      : False
PrivateKey    :

Version       : 3
SerialNumber  : 3DFFAF914D613282427BD591C1FB586D
SubjectName   : CN=sysadmins-LV-CA, DC=sysadmins, DC=lv
IssuerName    : CN=sysadmins-LV-CA, DC=sysadmins, DC=lv
ValidFromDate : 2009.08.06. 10:21:01
ValidToDate   : 2014.08.06. 10:30:54
Thumbprint    : E82ACC45841280DDEAB9F7847418FA26354457A7
Archived      : False
PrivateKey    :



PS G:\&gt; $chain.ApplicationPolicies()

                                   Name FriendlyName                            Value
                                   ---- ------------                            -----
                                    123 Smart Card Logon                        1.3.6.1.4.1.311.20.2.2
                                    101 Client Authentication                   1.3.6.1.5.5.7.3.2


PS G:\&gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;

&lt;p&gt;Метод вернул &lt;strong&gt;False&lt;/strong&gt;, т.е. наш сертификат не прошёл проверку. Свойство &lt;a href="http://msdn.microsoft.com/en-us/library/aa377621(VS.85).aspx" target="_blank"&gt;&lt;strong&gt;Certificate&lt;/strong&gt;s&lt;/a&gt; содержит все сертификаты в текущей цепочке. А метод &lt;a href="http://msdn.microsoft.com/en-us/library/aa377615(VS.85).aspx" target="_blank"&gt;&lt;strong&gt;ApplicationPolicies()&lt;/strong&gt;&lt;/a&gt; показал Application Policies (в прошлом EKU). Ну и метод &lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa377630(VS.85).aspx" target="_blank"&gt;Status()&lt;/a&gt;&lt;/strong&gt; вернул код ошибки. Все коды ошибок расписаны в описании самого метода. Т.е. ошибка 32 по табличке означает:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;font color="#0000ff"&gt;CAPICOM_TRUST_IS_UNTRUSTED_ROOT (&amp;H00000020) — The certificate or certificate chain is based on an untrusted root.&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Особо углубляться дальше я смысла не вижу, поскольку используя эти примеры можно поупражняться в других задачах с использованием CAPICOM. А вместо этого, мы разберём кое-какие неочевидные, но очень важные вещи.&lt;/p&gt;

&lt;p&gt;Когда вышел &lt;strong&gt;Remote Desktop Connection 7.0&lt;/strong&gt; (который поставляется вместе с Windows 7), &lt;strong&gt;Александр Станкевич&lt;/strong&gt; (MVP: Enterprise Security) заметил очень плохую особенность с ним, а именно — рандомно пропал доступ к терминальным серверам, которые используют SSL для терминальных подключений. В ходе множества проверок было констатировано:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;цепочка завершалась на доверенном корневом сертификате (через просмотр сертификата); &lt;/li&gt;

  &lt;li&gt;CDP/AIA пути были валидные и CRL не были просрочены; &lt;/li&gt;

  &lt;li&gt;остальные параметры были сконфигурированы верно. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;RDP клиент мотивировал отказ в подключении следюущим: «RDP клиент не смог проверить сертификат на отзыв». Причём подключение с предыдущих версий RDC, а так же подключение к TS Web Access через IE было успешным. Как выяснилось на днях, причина была в том, что в новом RDC был изменён алгоритм certificate chaining engine и новая версия RDC больше не доверяла корневым сертификатам в пользовательском хранилище. Переустановка корневого сертификата в компьютерное хранилище решала проблему RDC 7. Но, как я говорил, в Windows 7/2008 R2 было изменено поведение certificate chaining engine в реализации X509Chain. Продемонстрирую небольшую табличку, которая покажет доверие пользовательским корневым сертификатам в CAPICOM и .NET реализациях certificate chaining engine для различных операционных систем:&lt;/p&gt;

&lt;table border="1" cellspacing="0" cellpadding="2" width="373" align="center"&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td valign="middle" width="202"&gt; &lt;/td&gt;

      &lt;td style="text-align: center" valign="middle" width="68"&gt;&lt;strong&gt;X509Chain (.NET)&lt;/strong&gt;&lt;/td&gt;

      &lt;td style="text-align: center" valign="middle" width="101"&gt;&lt;strong&gt;CAPICOM.Chain (CryptoAPI)&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="middle" width="202"&gt;&lt;strong&gt;Windows XP&lt;/strong&gt;&lt;/td&gt;

      &lt;td style="text-align: center" valign="middle" width="68"&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/td&gt;

      &lt;td style="text-align: center" valign="middle" width="101"&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="middle" width="202"&gt;&lt;strong&gt;Windows Server 2003&lt;/strong&gt;&lt;/td&gt;

      &lt;td style="text-align: center" valign="middle" width="68"&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/td&gt;

      &lt;td style="text-align: center" valign="middle" width="101"&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="middle" width="202"&gt;&lt;strong&gt;Windows Vista&lt;/strong&gt;&lt;/td&gt;

      &lt;td style="text-align: center" valign="middle" width="68"&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/td&gt;

      &lt;td style="text-align: center" valign="middle" width="101"&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="middle" width="202"&gt;&lt;strong&gt;Windows Server 2008&lt;/strong&gt;&lt;/td&gt;

      &lt;td style="text-align: center" valign="middle" width="68"&gt;&lt;img alt="Yes, of course!" src="/images/buttons/ok.png"&lt;/td&gt;

      &lt;td style="text-align: center" valign="middle" width="101"&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="middle" width="202"&gt;&lt;strong&gt;Windows 7&lt;/strong&gt;&lt;/td&gt;

      &lt;td style="text-align: center" valign="middle" width="68"&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/td&gt;

      &lt;td style="text-align: center" valign="middle" width="101"&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="middle" width="202"&gt;&lt;strong&gt;Windows Server 2008 R2&lt;/strong&gt;&lt;/td&gt;

      &lt;td style="text-align: center" valign="middle" width="68"&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/td&gt;

      &lt;td style="text-align: center" valign="middle" width="101"&gt;&lt;img alt="No!" src="/images/buttons/bad.png"&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;blockquote&gt;
  &lt;p align="center"&gt;Таблица доверия пользовательскким корневым сертификатам различными движками построения цепочки сертификатов &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Следует учитывать, что различные приложения могут использовать свой движок для построения цепочек сертификатов, как &lt;strong&gt;RDC 7.0&lt;/strong&gt; и &lt;strong&gt;PKIView.msc&lt;/strong&gt; использует &lt;strong&gt;CAPICOM&lt;/strong&gt;, а &lt;strong&gt;PowerShell&lt;/strong&gt; — &lt;strong&gt;X509Chain&lt;/strong&gt;. Однако, у меня есть уверенность, что существует ещё одна реализация этого движка, которую использует &lt;strong&gt;Internet Explorer&lt;/strong&gt;. Это только мои догадки, но они основаны на том, что Internet Explorer (кроме Windows 7 и выше) использует пользовательский контейнер для проверки SSL веб-сайтов, т.е. по симптомам похоже на X509Chain. Однако, этот класс появился только в .Net Framework 2.0, которого, к примеру в оригинальной инсталляции Windows XP/2003 не было. Либо, как вариант, есть возможность настраивать этот момент в каждой реализации движка построения цепочек, но я пока не нашёл как. Это пока всё, что у меня есть по этому поводу.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=16ffa3d3-8449-4c16-9704-5d089b6a32e2"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,16ffa3d3-8449-4c16-9704-5d089b6a32e2.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / Certificates</category>
      <category>Security / PKI / Chaining Engine</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=b14ea574-ca90-4f1b-9845-35b6ce273fb2</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,b14ea574-ca90-4f1b-9845-35b6ce273fb2.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,b14ea574-ca90-4f1b-9845-35b6ce273fb2.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=b14ea574-ca90-4f1b-9845-35b6ce273fb2</wfw:commentRss>
      <slash:comments>18</slash:comments>
      <title>Certificate chaining engine в PowerShell</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,b14ea574-ca90-4f1b-9845-35b6ce273fb2.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,b14ea574-ca90-4f1b-9845-35b6ce273fb2.aspx</link>
      <pubDate>Sat, 17 Oct 2009 20:51:59 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;Я предлагаю снова поговорить о certificate chaining engine, о котором мы уже говорили в посте &lt;A href="http://www.sysadmins.lv/PermaLink,guid,63f4fa92-f82b-4b01-a710-6324bae859bb.aspx"&gt;Certificate Chaining Engine — как это работает&lt;/A&gt; но в рамках его реализации в .NET и PowerShell. В Windows есть несколько реализаций этого chaining engine. Самые популярные:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509chain.aspx" target=_blank&gt;&lt;STRONG&gt;X509Chain&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt; &lt;/STRONG&gt;
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/aa377611(VS.85).aspx" target=_blank&gt;&lt;STRONG&gt;CAPICOM.Chain&lt;/STRONG&gt;&lt;/A&gt; &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;CAPICOM — вещь несколько стрёмная и её лучше избегать. Тем более мне не удалось завести его в Vista/Windows 7. Реализация в .NET в виде &lt;A href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509chain.aspx" target=_blank&gt;&lt;STRONG&gt;X509Chain&lt;/STRONG&gt;&lt;/A&gt; ничуть не хуже, но, в то же время, проще. Итак, предлагаю начать с создания этого объекта с помощью &lt;STRONG&gt;New-Object&lt;/STRONG&gt;:&lt;/P&gt;
&lt;DIV style="WIDTH: 935px"&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: #000040; FONT: 9pt consolas, lucida console"&gt;&lt;FONT color=#c0c0c0&gt;&lt;SPAN&gt;&lt;P&gt;&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $chain = New-Object System.Security.Cryptography.X509Certificates.X509Chain
&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $chain

                 ChainContext ChainPolicy                   ChainStatus                   ChainElements
                 ------------ -----------                   -----------                   -------------
                            0 System.Security.Cryptograp... {}                            {}


&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $chain | gm -membertype methods


   TypeName: System.Security.Cryptography.X509Certificates.X509Chain

Name        MemberType Definition
----        ---------- ----------
Build       Method     bool Build(System.Security.Cryptography.X509Certificates.X509Certificate2 certificate)
Equals      Method     bool Equals(System.Object obj)
GetHashCode Method     int GetHashCode()
GetType     Method     type GetType()
Reset       Method     System.Void Reset()
ToString    Method     string ToString()


&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans]&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;Здесь видно, что метод, который будет строить и проверять цепочку будет называться &lt;A href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509chain.build.aspx" target=_blank&gt;&lt;STRONG&gt;Build()&lt;/STRONG&gt;&lt;/A&gt; и в качестве аргумента этот метод принимает только объекты &lt;A href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2.aspx" target=_blank&gt;&lt;STRONG&gt;x509Certificate2&lt;/STRONG&gt;&lt;/A&gt;, а возвращать объект типа Boolean — &lt;STRONG&gt;True/False&lt;/STRONG&gt;. Объекты такого типа можно найти в провайдере Certififcates (просто выполнить &lt;STRONG&gt;dir cert:\store\container&lt;/STRONG&gt;) или импортировать из файла — &lt;A href="http://www.sysadmins.lv/PermaLink,guid,9932bca2-6f85-4ed5-b001-32a37b67b146.aspx"&gt;Импорт сертификатов в PowerShell&lt;/A&gt;. Но сначала мы посмотрим, что здесь можнол настроить. А настроить можно &lt;STRONG&gt;ChainPolicy&lt;/STRONG&gt;, представляющий собой объект &lt;A href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509chainpolicy.aspx" target=_blank&gt;&lt;STRONG&gt;X509ChainPolicy&lt;/STRONG&gt;&lt;/A&gt;. Эта политика позволяет задавать порядок проверки отзыва сертификатов, соответствие сертификата каким-то certificate policy, наличие определённых application policy (в прошлом известен нам как &lt;STRONG&gt;EKU&lt;/STRONG&gt; — &lt;EM&gt;Extended Key Usage&lt;/EM&gt;) и некритичность каких-то ошибок. Мы всё разбирать не будем, а только основное:&lt;/P&gt;
&lt;DIV style="WIDTH: 935px"&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: #000040; FONT: 9pt consolas, lucida console"&gt;&lt;FONT color=#c0c0c0&gt;&lt;SPAN&gt;&lt;P&gt;&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $chain.ChainPolicy


ApplicationPolicy   : {}
CertificatePolicy   : {}
RevocationMode      : Online
RevocationFlag      : ExcludeRoot
VerificationFlags   : NoFlag
VerificationTime    : 17.10.2009 20:35:17
UrlRetrievalTimeout : 00:00:00
ExtraStore          : {}



&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans]&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;Первое, что может быть интересным — &lt;STRONG&gt;Revocation Mode&lt;/STRONG&gt;, который задаёт режим проверки отзыва и может иметь 3 вполне понятных значения, которые перечислены в &lt;A href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509revocationmode.aspx" target=_blank&gt;&lt;STRONG&gt;X509RevocationMode&lt;/STRONG&gt;&lt;/A&gt;:&lt;/P&gt;
&lt;DIV style="WIDTH: 935px"&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: #000040; FONT: 9pt consolas, lucida console"&gt;&lt;FONT color=#c0c0c0&gt;&lt;SPAN&gt;&lt;P&gt;&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] [System.Enum]::GetNames([system.security.cryptography.x509certificates.x509revocationmode])
NoCheck
Online
Offline&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;Тут очень просто:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;NoCheck&lt;/STRONG&gt; — проверяет цепочку сертификатов без проверки на отзыв любых сертификатов в цепочке; 
&lt;LI&gt;&lt;STRONG&gt;Online&lt;/STRONG&gt; — проверяет сертификаты в цепочке скачивая новые списки CRL из свойства CDP сертификата, игнорируя локальный кеш CRL (используется по умолчанию, как это видно в просмотре свойств ChainPolicy) 
&lt;LI&gt;&lt;STRONG&gt;Offline&lt;/STRONG&gt; — проверяет сертификаты на отзыв с использованием кешированного CRL (если есть). &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Если проверяем сертификаты на отзыв, то мы можем выбрать что именно будем проверять и этот выбор перечислен в &lt;A href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509revocationflag.aspx" target=_blank&gt;&lt;STRONG&gt;X509RevocationFlag&lt;/STRONG&gt;&lt;/A&gt;:&lt;/P&gt;
&lt;DIV style="WIDTH: 935px"&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: #000040; FONT: 9pt consolas, lucida console"&gt;&lt;FONT color=#c0c0c0&gt;&lt;SPAN&gt;&lt;P&gt;&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] [System.Enum]::GetNames([system.security.cryptography.x509certificates.x509revocationflag])
EndCertificateOnly
EntireChain
ExcludeRoot&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;и здесь тоже всё достаточно понятно:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;EndCertificateOnly&lt;/STRONG&gt; — проверяет на отзыв только сам проверяемый сертификат. Остальные сертификаты в цепочке не проверяются; 
&lt;LI&gt;&lt;STRONG&gt;EntireChain&lt;/STRONG&gt; — проверяет на отзыв абсолютно все сертификаты в цепочке включая корневой сертификат. Правила хорошего тона диктуют нам не включать в корневой сертификат CA поля CDP и AIA, поскольку это лишено смысла и в большинстве случаев с этим флагом вы будете получать невалидную цепочку; 
&lt;LI&gt;&lt;STRONG&gt;ExcludeRoot&lt;/STRONG&gt; — проверяет на отзыв все сертификаты в цепочке, кроме корневого сертификата, что есть религионзно правильно и этот флаг установлен по умолчанию. &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Следующий момент определяет флаги проверки, т.е. по каким именно критериям будет проверяться цепочка сертификатов:&lt;/P&gt;
&lt;DIV style="WIDTH: 935px"&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: #000040; FONT: 9pt consolas, lucida console"&gt;&lt;FONT color=#c0c0c0&gt;&lt;SPAN&gt;&lt;P&gt;&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] [System.Enum]::GetNames([system.security.cryptography.x509certificates.x509verificationflags])
NoFlag
IgnoreNotTimeValid
IgnoreCtlNotTimeValid
IgnoreNotTimeNested
IgnoreInvalidBasicConstraints
AllowUnknownCertificateAuthority
IgnoreWrongUsage
IgnoreInvalidName
IgnoreInvalidPolicy
IgnoreEndRevocationUnknown
IgnoreCtlSignerRevocationUnknown
IgnoreCertificateAuthorityRevocationUnknown
IgnoreRootRevocationUnknown
AllFlags&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;Эти флаги так же достаточно понятны и подробно разжёваны в перечислении &lt;A href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509verificationflags.aspx" target=_blank&gt;&lt;STRONG&gt;X509VerificationFlags&lt;/STRONG&gt;&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#ff0000&gt;&lt;STRONG&gt;Примечание:&lt;/STRONG&gt;&lt;/FONT&gt; эти флаги показывают что будет исключено из проверки, а не наоборот. По умолчанию проверяется всё (установлен &lt;STRONG&gt;NoFlag&lt;/STRONG&gt;).&lt;/P&gt;
&lt;P&gt;Как можно задавать эти флаги и режимы, если есть такая потребность? Можно пойти двумя способами — правильным и неправильным, хотя оба рабочие:&lt;/P&gt;
&lt;DIV style="WIDTH: 935px"&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: #000040; FONT: 9pt consolas, lucida console"&gt;&lt;FONT color=#c0c0c0&gt;&lt;SPAN&gt;&lt;P&gt;&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] # правильный метод:
&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $revflag = [System.Security.Cryptography.X509Certificates.X509RevocationFlag]::EndCertificateOnly
&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $chain.ChainPolicy.RevocationFlag = $revflag
&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $chain.ChainPolicy


ApplicationPolicy   : {}
CertificatePolicy   : {}
RevocationMode      : Online
RevocationFlag      : EndCertificateOnly
VerificationFlags   : NoFlag
VerificationTime    : 17.10.2009 20:35:17
UrlRetrievalTimeout : 00:00:00
ExtraStore          : {}



&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] # неправильный метод, но мне он нравится
&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $chain.ChainPolicy.RevocationFlag = "excluderoot"
&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $chain.ChainPolicy


ApplicationPolicy   : {}
CertificatePolicy   : {}
RevocationMode      : Online
RevocationFlag      : ExcludeRoot
VerificationFlags   : NoFlag
VerificationTime    : 17.10.2009 20:35:17
UrlRetrievalTimeout : 00:00:00
ExtraStore          : {}



&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans]&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;В принципе, все эти enumeration можно просто указывать в виде строки, а PowerShell уже сам подобъёт его под нужный тип.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;Примечание:&lt;/FONT&gt;&lt;/STRONG&gt; флаги проверки на отзыв можно указывать только по одному, а флаги исключений можно перечислять через запятую. Это видно по названию класса: если класс указан в единственном числе (X509RevocationFlag), то и значение можно указать только одно, а если во множественном числе (X509VerificationFlags), то их можно указать несколько через запятую.&lt;/P&gt;
&lt;P&gt;В принципе, можно делать проверку:&lt;/P&gt;
&lt;DIV style="WIDTH: 935px"&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: #000040; FONT: 9pt consolas, lucida console"&gt;&lt;FONT color=#c0c0c0&gt;&lt;SPAN&gt;&lt;P&gt;&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $valid = (dir cert:\currentuser\my)[1]
&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $invalid = (dir cert:\currentuser\my)[0]
&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $chain.Build($valid)
True
&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $chain.ChainElements | select -expand certificate

Thumbprint                                Subject
----------                                -------
986D375362652FE9E39BA4D042A6B8BA75745998  CN=Administrator, CN=Users, DC=sysadmins, DC=lv
E82ACC45841280DDEAB9F7847418FA26354457A7  CN=sysadmins-LV-CA, DC=sysadmins, DC=lv


&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans]&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;Я из локального хранилища взял заведомо хороший сертификат и плохой (разумеется, это сертификат с сайта БиЛайн &lt;img alt=":)" src="/smilies/happy.gif"&gt;). Метод &lt;STRONG&gt;Build()&lt;/STRONG&gt; вернул True, что означает успешную проверку всей цепочки моего сертификата до доверенного корня. А вот что случилось с сертификатом билайна:&lt;/P&gt;
&lt;DIV style="WIDTH: 935px"&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: #000040; FONT: 9pt consolas, lucida console"&gt;&lt;FONT color=#c0c0c0&gt;&lt;SPAN&gt;&lt;P&gt;&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $chain.reset()
&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $chain.Build($invalid)
False
&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $chain.ChainElements | select -expand certificate

Thumbprint                                Subject
----------                                -------
EB74DA32E865C78FCB853DDA5FE45962098E1B3B  CN=trust.beeline.ru, OU=DIT, O=Vimpelcom, L=Moscow, S=Moscow, C=RU


&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $chain.ChainStatus

                                                     Status StatusInformation
                                                     ------ -----------------
                                               PartialChain Sertificesanas kedi nevareja veidot pie uzticamas saknes...
                                    RevocationStatusUnknown Atsauksanas funkcija nevareja parbaudit sertifikata atsa...
                                          OfflineRevocation Atsauksanas funkcija nevareja parbaudit atsauksanu, jo a...


&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] $chain.ChainStatus | %{$_.statusinformation.trim()}
Sertificesanas kedi nevareja veidot pie uzticamas saknes iestades.
Atsauksanas funkcija nevareja parbaudit sertifikata atsauksanu.
Atsauksanas funkcija nevareja parbaudit atsauksanu, jo atsauksanas serveris bija bezsaiste.
&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans]&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;Поскольку при каждой проверке сертификаты в ChainElements накапливаются, то после каждой проверки следует очищать объект методом &lt;A href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509chain.reset.aspx" target=_blank&gt;&lt;STRONG&gt;Reset()&lt;/STRONG&gt;&lt;/A&gt;. Как и следовало ожидать, сертификат билайна вернул False, показывая, что цепочка у этого сертификата имеет проблемы. В случае неуспешной проверки, будет заполняться свойство &lt;A href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509chain.chainstatus.aspx" target=_blank&gt;&lt;STRONG&gt;ChainStatus&lt;/STRONG&gt;&lt;/A&gt;. Данное свойство содержит все ошибки, которые были костатированы при проверке цепочки. Для меня пока непонятным стал факт, что ошибки он написал на латышском языке, хотя я его об этом не просил. Откуда он это взял — непонятно, но он сказал, что не смог построить цепочку до доверенного корня и функция проверки отзыва провалилась по всем статьям, поскольку пути в CDP сертификата нерабочие.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;Примечание:&lt;/FONT&gt;&lt;/STRONG&gt; обязательно следует учитывать тот факт, что при построении цепочки сертификатов и проверке доверия класс X509Chain в Windows 7 и Windows Server 2008 R2 работает в контексте &lt;STRONG&gt;LocalSystem&lt;/STRONG&gt; и всегда игнорирует пользовательские контейнеры &lt;STRONG&gt;Trusted Root Certification Authorities&lt;/STRONG&gt;. Поэтому если корень цепочки не заканчивается на одном из сертификатов &lt;STRONG&gt;Trusted Root CAs&lt;/STRONG&gt; хранилища &lt;STRONG&gt;LocalMachine&lt;/STRONG&gt;, то цепочка будет считаться недоверенной. Для предыдущих ОС цепочка может заканчиваться на пользовательском хранилище &lt;STRONG&gt;Current User&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;В принципе это всё, что вам следует знать про реализацию certificate chaining engine в .NET и его использование в PowerShell. В качестве бонуса прилагаю скрипт для проверки цепочки сертификатов:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;####################################################################&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; Test-Certificate.ps1&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; Version 1.0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
#
#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; Passes certificate through certificate chaining engine&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
#
#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; Vadims Podans (c) 2009&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; http://www.sysadmins.lv/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;####################################################################&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;requires –Version 2.0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;function&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;Test-Certificate&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {
[CmdletBinding()]
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;param&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(
        [Parameter(Mandatory &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$true&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, ValueFromPipeline &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$true&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, Position &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)]
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Certificate&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,
        [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;System.Security.SecureString&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Password&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,
        [ValidateSet(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;NoCheck&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Online&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Offline&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)]
        [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;string&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$CRLMode&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Online&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,
        [ValidateSet(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;EndCertificateOnly&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;EntireChain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;ExcludeRoot&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)]
        [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;string&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$CRLFlag&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;ExcludeRoot&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,
        [ValidateSet(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;AllFlags&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;AllowUnknownCertificateAuthority&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;NoFlag&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;IgnoreNotTimeValid&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;IgnoreCtlNotTimeValid&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;IgnoreNotTimeNested&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;IgnoreInvalidBasicConstraints&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;IgnoreWrongUsage&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;IgnoreInvalidName&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;IgnoreInvalidPolicy&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;IgnoreEndRevocationUnknown&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;IgnoreCtlSignerRevocationUnknown&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;IgnoreCertificateAuthorityRevocationUnknown&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;IgnoreRootRevocationUnknown&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)]
        [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;string&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;[]]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$VerificationFlags&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;NoFlag&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
    )
    
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;begin&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; создаём объекты X509Certificate2 и X509chain ещё до поступлениея первого объекта сертификата&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$cert&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;New-Object&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;System.Security.Cryptography.X509Certificates.X509Certificate2&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$chain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;New-Object&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;System.Security.Cryptography.X509Certificates.X509Chain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; в X509Chain записываем параметры проверки сертификатов. Как критерии&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; отзыва, так и исключения из проверки&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$chain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;ChainPolicy&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;RevocationFlag&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$CRLFlag&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$chain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;ChainPolicy&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;RevocationMode&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$CRLMode&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$chain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;ChainPolicy&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;VerificationFlags&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$VerificationFlags&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; мини-функция для предоставления понятного вывода на экран о статусе проверки&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; и ошибках в цепочке, если они есть.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;function&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;_getstatus_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$status&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$chain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$cert&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$status&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
                &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Write-Host&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Current&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;certificate&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$cert&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;SerialNumber&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;chain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;and&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;revocation&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;status&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;is&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;valid&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-ForegroundColor&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Green&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
            } &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;else&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {
                &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Write-Warning&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Current certificate $($cert.SerialNumber) chain is invalid due of the following errors:&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
                &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$chain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;ChainStatus&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;%&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Write-Host&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.StatusInformation.trim() &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-ForegroundColor&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Red&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;}
            }
        }
    }
    
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;process&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; если аргумент сертификата уже является объектом X509Certificate2, то&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; сразу строим цепочку и получаем статус цепочки вызывая мини-функцию&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-is&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;System.Security.Cryptography.X509Certificates.X509Certificate2&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]) {
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$status&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$chain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;Build&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;_getstatus_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$status&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$chain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
        } &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;else&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; если аргумент не является объектом X509Certificate2, то это будет путь к файлу&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; если указанный путь не существует, то ругаемся и выходим&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;!&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Test-Path&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Certificate&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)) {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Write-Warning&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Specified path is invalid&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;}
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;else&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; если путь существует, то проверяем, что это путь файловой системы.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; если это не так, то ругаемся и выходим&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;                &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; ((&lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Resolve-Path&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Certificate&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;).Provider.Name &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-ne&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;FileSystem&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
                    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Write-Warning&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Spicifed path is not recognized as filesystem path. Try again&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
                } &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;else&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {
                &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; если предварительные проверки прошли успешно, то выбираем объект файла&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;                    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Certificate&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;gi&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; $(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Resolve-Path&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Certificate&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)
                &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; и на основании расширения файла через Switch преобразуем файл в&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;                &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; X509Certificate2 объект или объекты&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;                    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;switch&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-regex&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Certificate&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.Extension) {
                    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;\.CER|\.DER|\.CRT&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$cert&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;Import&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Certificate&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.FullName)}
                    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;\.PFX&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {
                        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;!&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Password&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;) {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Password&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Read-Host&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Enter password for PFX file $certificate&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-AsSecureString&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;}
                        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; тут пришлось указать контекст хранилища, куда предполагается сохранить сертификат.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;                        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; на самом деле мы никуда не будем сохранять объект сертификата, это было сделано&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;                        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; по причине отсутствия подходящего конструктора метода Import(), чтобы&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;                        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; можно было указать только путь к файлу и пароль от PFX&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;                            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$cert&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;Import&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$Certificate&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.FullName, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$password&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;UserKeySet&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)
                        }
                    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;\.P7B|\.SST&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {
                        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$cert&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;New-Object&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;System.Security.Cryptography.X509Certificates.X509Certificate2Collection&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
                        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$cert&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;Import&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;([&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;system.IO.File&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]::&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;ReadAllBytes&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$file&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.FullName))
                        }
                    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;default&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Write-Warning&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Looks like your specified file is not a certificate file&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;}
                    }
                    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; полученный объект или объекты сертификатов пропускаем через метод Build() и вызываем&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;                    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; мини-функцию расшифровки статуса проверки&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;                    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$cert&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;%&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;{
                        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$status&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$chain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;Build&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)
                        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;_getstatus_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$status&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$chain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
                    }
                    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; после каждой итерации очищаем объекты сертификата и цепочки&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;                    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$cert&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;Reset&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;()
                    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$chain&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;Reset&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;()
                }
            }
        }
    }
}&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Данный скрипт может принимать аргументы в виде уже готовых объектов X509Certificate2 или с указанием пути к файлу сертификата, например:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;dir&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; cert:\&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;currentuser\my&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;Test-Certificate&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;Test-Certificate&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; .\&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;mycert.cer&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Ну и при желании можно поуказывать там разные параметры и флаги проверки.&lt;/P&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=b14ea574-ca90-4f1b-9845-35b6ce273fb2"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,b14ea574-ca90-4f1b-9845-35b6ce273fb2.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / Certificates</category>
      <category>Security / PKI / Chaining Engine</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=63f4fa92-f82b-4b01-a710-6324bae859bb</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,63f4fa92-f82b-4b01-a710-6324bae859bb.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,63f4fa92-f82b-4b01-a710-6324bae859bb.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=63f4fa92-f82b-4b01-a710-6324bae859bb</wfw:commentRss>
      <slash:comments>5</slash:comments>
      <title>Certificate Chaining Engine — как это работает</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,63f4fa92-f82b-4b01-a710-6324bae859bb.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,63f4fa92-f82b-4b01-a710-6324bae859bb.aspx</link>
      <pubDate>Wed, 16 Sep 2009 20:39:21 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;&lt;FONT color=#ff0000&gt;&lt;STRONG&gt;Примечание:&lt;/STRONG&gt;&lt;/FONT&gt; данный материал публикуется как обязательный для знания IT-специалистами, которые занимаются или только собираются заниматься темой &lt;STRONG&gt;PKI&lt;/STRONG&gt; (&lt;EM&gt;Public Key Infrastructure&lt;/EM&gt;).&lt;/P&gt;
&lt;H4 align=center&gt;Введение&lt;/H4&gt;
&lt;P&gt;На самом деле эта тема тесно переплетается с фундаментальными основами PKI, как доверие сертификатов, защита от подделки цифровых подписей сертификатов, отзыв сертификатов и т.д. Иными словами, сама модель PKI лежит на &lt;STRONG&gt;Certificate Chaining Engine&lt;/STRONG&gt; (&lt;EM&gt;механизм построения цепочек сертификатов&lt;/EM&gt;). Миллионы людей в мире видят результат работы этого механизма ежедневно, но не знают, как он работает. Им это, в принципе, и не надо, а вот IT-специалистам по PKI это знать просто необходимо.&lt;/P&gt;
&lt;P&gt;Одной из основ PKI является модель доверия центрам сертификации (&lt;STRONG&gt;Certification Authority&lt;/STRONG&gt; или просто &lt;STRONG&gt;CA&lt;/STRONG&gt;). Прежде чем мы начнём доверять сертификату мы должны явно доверять корневому сертификату CA и так же явно или косвенно (по правилу одностороннего транзитивного доверия) доверять всем промежуточным CA в цепочке. Корневые сертификаты устанавливаются в систему вручную путём добавляения сертификата CA в секцию &lt;STRONG&gt;Trusted Root CAs&lt;/STRONG&gt;. Если корневой сертификат CA есть в этом списке, то мы доверяем всем сертификатам, которые выдал этот CA и любые подчинённые CA (&lt;STRONG&gt;Intermediate CA&lt;/STRONG&gt;).&lt;/P&gt;
&lt;P&gt;В качестве наиболее доступного и понятного примера можно рассмотреть SSL веб-сайт. Если мы зайдём на &lt;A href="https://www.dreamspark.com"&gt;https://www.dreamspark.com&lt;/A&gt;, то мы увидим что с SSL сертификатом этого сайта всё в порядке. Если же мы зайдём на &lt;A href="https://cert.startcom.org"&gt;https://cert.startcom.org&lt;/A&gt;, то мы наоборот увидим грозное предупреждение, что с SSL сертификатом этого сайта что-то не так. Это как раз и есть результат работы &lt;STRONG&gt;Chaining Engine&lt;/STRONG&gt;. А вот что он сделал на самом деле — вот об этом мы сейчас и поговорим.&lt;/P&gt;
&lt;H4 align=center&gt;Постройка цепочки сертификатов&lt;/H4&gt;
&lt;P&gt;Давайте сначала посмотрим на путь сертификатов (цепочки сертификатов) обоих веб-сайтов:&lt;/P&gt;
&lt;DIV align=center&gt; &lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="Valid certification path" border=0 alt="Valid certification path" src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/CertificateChainingEngine_11803/validroot.png" width=413 height=515&gt;   &lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="Invalid certification path with untrusted root" border=0 alt="Invalid certification path with untrusted root" src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/CertificateChainingEngine_11803/invalidroot_1.png" width=413 height=515&gt; &lt;/DIV&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;В первом случае цепочка сертификатов заканчивается на сертификате VeriSign, которому мы доверяем явно. Вы можете убедиться в этом нажав кнопку View Certificate, чтобы посмотреть его внутренности и найти этот же сертификат в оснастке &lt;FONT color=#0000ff&gt;certmgr.msc –&gt; Trusted Root CAs&lt;/FONT&gt;. Однако, вы видите, что не корневой CA выдал сертификат сайту, а подчинённый (&lt;STRONG&gt;Intermediate CA&lt;/STRONG&gt;). Это доказывает то, что если мы доверяем корню, то и явно или косвенно доверяем всем сертификатам этого CA или любым его прямым или косвенным промежуточным CA. Если говорить простым языком, то &lt;EM&gt;в сертификатах используется одностороннее транзитивное доверие сертификатам CA&lt;/EM&gt;. Чуть позже будет рассказано как строится эта цепочка. Во втором случае мы видим, что корневой сертификат CA не находится у нас в &lt;STRONG&gt;Trusted Root CAs&lt;/STRONG&gt; и, следовательно, мы не доверяем ни одному сертификату, который издал этот CA или любой другой его подчинённый CA. И, так же как и в первом случае, сертификат самому веб-сайту выдал подчинённый CA. На самом деле этот момент является одной из наиболее частых ошибок системных администраторов, которые организовывают доступ к ресурсам с использованием цифровых сертификатов.&lt;/P&gt;
&lt;P&gt;Но нас теперь интересует другой вопрос — а откуда же взялись все эти сертификаты в цепочке? Chaining engine как правило использует только 3 метода построения цепочки:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;по полю &lt;STRONG&gt;AIA&lt;/STRONG&gt; (&lt;EM&gt;Authority Information Access&lt;/EM&gt;) каждого сертификата 
&lt;LI&gt;с использованием файла цепочки сертификатов в формате &lt;STRONG&gt;pkcs7&lt;/STRONG&gt; 
&lt;LI&gt;поиск подходящих сертификатов в локальном хранилище (с использованием exact, key, name matches, о которых будет рассказно ниже) &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;Примечание:&lt;/FONT&gt;&lt;/STRONG&gt; в сертификате любое поле содержащее слово Authority будет означать какие-то сведения о сертификате вышестоящего CA. Например, &lt;STRONG&gt;Authority Key Identifier&lt;/STRONG&gt; — комбинация серийного номера, поля &lt;STRONG&gt;Subject&lt;/STRONG&gt; или хеша открытого ключа вышестоящего CA. А любое поле содержащее слово Subject — означает то же самое, но применительно к конкретно этому сертификату. &lt;/P&gt;
&lt;P&gt;Давайте посмотрим поле AIA первого сертификата:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;[1]Authority Info Access &lt;BR&gt;     Access Method=Certification Authority Issuer (1.3.6.1.5.5.7.48.2) &lt;BR&gt;     Alternative Name: &lt;BR&gt;          URL=&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;http://www.microsoft.com/pki/mscorp/Microsoft%20Secure%20Server%20Authority(5).crt&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;В этом поле содержится ссылка на сертификат того CA, который непосредственно издал и подписал этот сертификат. Если нажать по этой ссылке, то вы скачаете сертификат центра сертификации Microsoft Secure Server Authority. В этом сертификате тоже будет поле &lt;STRONG&gt;AIA&lt;/STRONG&gt;, по ссылке из которого скачается сертификат вышестоящего CA — Microsoft Internet Authority. И так проверка проводится далее до тех пор, пока цепочка не оборвётся или не закончится каким-либо корневым CA (корневой CA характеризуется самоподписанным сертификатом, т.е. сертификат выдан самому себе). Если вы посмотрите сертификат Microsoft Internet Authority, то вы в нём не обнаружите поля AIA. И вот здесь мы сталкиваемся со вторым методом добычи сертификатов в цепочке – файл сертификатов формата &lt;STRONG&gt;pkcs7&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;Бывают случаи, когда цепочка сертификатов не может быть построена и она обрывается на пути. Типичный пример такого обрыва (когда цепочка не может быть построена до корня с использованием любого вышеуказанного метода) можно посмотреть на сайте &lt;STRONG&gt;БиЛайна&lt;/STRONG&gt;: &lt;A href="https://trust.beeline.ru"&gt;https://trust.beeline.ru&lt;/A&gt;&lt;/P&gt;
&lt;P&gt; &lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: block; FLOAT: none; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN-LEFT: auto; BORDER-LEFT-WIDTH: 0px; MARGIN-RIGHT: auto" title="Invalid certificate chain. Root certificate s unreachable" border=0 alt="Invalid certificate chain. Root certificate s unreachable" src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/CertificateChainingEngine_11803/unreachableroot_1.png" width=413 height=515&gt; &lt;/P&gt;
&lt;P&gt;если посмотреть поле AIA этого сертификата, то мы увидим там 2 пути до CA, который издал этот сертификат. Но оба эти пути нерабочие совсем (кстати говоря, пути в CDP там тоже нерабочие. Причём, во всех сертификатах! Вот такой он БиЛайн &lt;img alt=":)" src="/smilies/happy.gif"&gt; ). Но цепочка сертификатов в этом случае всё равно построилась за счёт сертификатов в pkcs7 формате. Хотя корневой сертификат в этом pkcs7 просто отсутствует, поэтому мы даже не можем собрать корневой сертификат. Неработающие CDP/AIA — ещё одна из наиболее частых ошибок реализации инфраструктуры PKI, в результате которой по сути PKI является неработоспособной.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#0000ff&gt;Оффтоп:&lt;/FONT&gt;&lt;/STRONG&gt; если на этой странице нажать Продолжить, то на новой странице будет ссылка на корневой сертификат, а так же на CRL. CRL БиЛайна доставил очень сильно. Вы посмотрите срок годности этого CRL &lt;img alt=":)" src="/smilies/happy.gif"&gt;&lt;/P&gt;
&lt;H4 align=center&gt;Проверка соответствия сертификатов внутри построенной цепочки&lt;/H4&gt;
&lt;P&gt;Однако, это только половина дела. Мы просто построили цепочку сертификатов, но не более того. Поскольку сертификаты могут быть скачаны в pkcs7 формате, а по ссылкам AIA просто подменить сертификаты, chaining engine делает полнуюю проверку доверия каждого сертификата в цепочке, чтобы исключить возможность подмены сертификатов, а так же достраивает цепочку (если этого не удалось сделать с помощью AIA и pkcs7 используя локальное хранилище сертификатов). Соответствие сертификатов внутри цепочки может происходить по нескольким правилам (в порядке приоритета):&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Exact Match &lt;/STRONG&gt;
&lt;LI&gt;&lt;STRONG&gt;Key Match &lt;/STRONG&gt;
&lt;LI&gt;&lt;STRONG&gt;Name MAtch&lt;/STRONG&gt; &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Для этого chaining engine использует следующие поля сертификатов:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Authority Key Identfier&lt;/STRONG&gt; (&lt;EM&gt;AKI&lt;/EM&gt;) — может содержать комбинацию поля &lt;STRONG&gt;Subject&lt;/STRONG&gt; и &lt;STRONG&gt;Serial Number&lt;/STRONG&gt; сертификата вышестоящего CA или хеш открытого ключа вышестоящего CA (но бывает, что это поле совсем отсутствует). 
&lt;LI&gt;&lt;STRONG&gt;Issuer&lt;/STRONG&gt; – данное поле используется только если AKI отсутствует в сертификате и это поле должно быть эквивалентно полю &lt;STRONG&gt;Subject&lt;/STRONG&gt; вышестоящего CA. По этому полю определяется имя CA, котороый издал этот сертификат. 
&lt;LI&gt;&lt;STRONG&gt;Subject&lt;/STRONG&gt; в сертификате вышестоящего CA. Данное поле должно быть эквивалентно полю &lt;STRONG&gt;Issuer&lt;/STRONG&gt; в издаваемых сертификатах. 
&lt;LI&gt;&lt;STRONG&gt;Serial Number&lt;/STRONG&gt; сертификата вышестоящего CA. 
&lt;LI&gt;&lt;STRONG&gt;Subject Key Identifier&lt;/STRONG&gt; (&lt;EM&gt;SKI&lt;/EM&gt;) — может содержать комбинацию поля &lt;STRONG&gt;Subject&lt;/STRONG&gt; и &lt;STRONG&gt;Serial Number&lt;/STRONG&gt; текущего сертификата или хеш открытого ключа текущего сертификата. &lt;/LI&gt;&lt;/UL&gt;
&lt;H4 align=center&gt;Exact match&lt;/H4&gt;
&lt;P&gt;Данный метод определения правильности построения цепочки является наиболее точным и такая цепочка почти никогда не будет заканчиваться более чем одним корневым сертификатом, поскольку требует совпадения 2-х полей вышестоящего сертификата – Subject и серийного номера с полем AKI проверяемого сертификата. Давайте посмотрим пример такой проверки в сертификате сайта &lt;A href="https://cert.startcom.org"&gt;https://cert.startcom.org&lt;/A&gt;. Поле AKI содержит следующую информацию:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;KeyID=a1 e1 9e 45 25 79 4d 06 d9 02 17 92 82 d5 30 89 72 25 14 a0 &lt;BR&gt;Certificate Issuer: &lt;BR&gt;     Directory Address: &lt;BR&gt;          CN=StartCom Certification Authority &lt;BR&gt;          OU=Secure Digital Certificate Signing &lt;BR&gt;          O=StartCom Ltd. &lt;BR&gt;          C=IL &lt;BR&gt;Certificate SerialNumber=17&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Поле &lt;STRONG&gt;KeyID&lt;/STRONG&gt; не используется. Здесь мы видим сведения о поле Subject и серийный номер вышестоящего CA. Если посмотреть сертификат этого CA, то его серийный номер и поле Subject будут идентичными тем, которые записаны в поле AKI издаваемых ими сертификатов. Используя эти данные chaining engine может найти нужный сертификат в локальном хранилище (если такой сертификат там есть), для восполнения недостающих звеньев цепочки. Если же будет обнаружено хоть одно несоответствие между этими полями, то цепочка мгновенно обрывается и любому сертификату в этой цепочке (начиная от сертификата с несоответствующими полями и вниз до конечного сертификата выданного потребителю) будет отказано в доверии.&lt;/P&gt;
&lt;H4 align=center&gt;Key Match&lt;/H4&gt;
&lt;P&gt;Это наиболее распространённый тип проверки цепочки, т.к. зачастую поле AKI у сертификатов содержит только KeyID, который является лишь хешом открытого ключа вышестоящего CA. Например сертификат с &lt;A href="https://www.dreamspark.com"&gt;https://www.dreamspark.com&lt;/A&gt;:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;KeyID=14 55 c4 39 e0 3d 2e d1 55 2e 48 96 b0 d8 7e 14 22 06 93 bc&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Этот хеш должен быть идентичным хешу, который записан в поле Subject Key Identifier вышестоящего CA. В этом вы можете убедиться просмотрев сертификат CA, который выдал сертификат для dreamspark.com. В случае несоответствия этого поля, любому сертификату вниз по цепочке будет отказано. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#0000ff&gt;Заметка:&lt;/FONT&gt;&lt;/STRONG&gt; при этом, возможна достаточно интересная ситуация, когда цепочка может заканчиваться несколькими корнями. Это может происходить если корневой сертификат CA был обновлён с использованием текущей пары открытого и закрытого ключа. Поскольку KeyID — всего лишь хеш открытого ключа, то при смене корневого сертификата CA, хеш не изменится и, следовательно, chaining engine может рандомно строить цепочку до старого или до нового корневого сертификата CA.&lt;/P&gt;
&lt;H4 align=center&gt;Name match&lt;/H4&gt;
&lt;P&gt;Но поле AKI не обязательно должно присутствовать в сертификате. Его может не быть совсем и тогда остаётся только один способ проверки целостности цепочки — сравнение поля &lt;STRONG&gt;Issuer&lt;/STRONG&gt; текущего сертификата и поля &lt;STRONG&gt;Subject&lt;/STRONG&gt; вышестоящего сертификата. Это самый крайний и наименее надёжный (хотя это достаточно относительно) метод проверки цепочки. Так же, как и предыдущий пример, данный метод может заканчиваться несколькими корневыми сертификатами, если сертификат CA был обновлён с использованием текущей пары открытого и закрытого ключей. Но этого не произойдёт, если при обновлении сертификата CA будут использоваться новая пара ключей. Хоть хеши и серийные номера издающих CA не проверяются, то подделка сертификатов в вашем случае закончится провалом. А об этом читайте заключительный раздел.&lt;/P&gt;
&lt;H4 align=center&gt;Не забываем про подписи&lt;/H4&gt;
&lt;P&gt;На самом деле может показаться, что обмануть chaining engine достаточно легко — надо лишь подсунуть нужные поддельные сертификаты. Но в действительности это не так. Помимо всего прочего следует помнить, что каждый сертификат подписан цифровой подписью издающего CA. Если вы ещё не знаете, что такое цифровая подпись, то пора бы и узнать. Когда CA составляет сертификат, то он высчитывает конечный хеш (с использованием алгоритма указанного в поле Signature algorithm) этого сертификата и шифрует его своим закрытым ключом и пристыковывает подпись к сертификату. При проверке сертификата chaining engine удаляет цифровую подпись из сертификата и подсчитывает сам хеш файла сертификата. Далее берёт открытый ключ у издающего CA и сравнивает полученный хеш с тем, что содержится в подписи. Следовательно, если вам удастся обмануть все 3 метода проверки цепочки путём подмены сертификатов, то вы сломаетесь на проверке цифровой подписи, т.к. здесь уже задействуется закрытый ключ легального CA. Вот как это может выглядеть:&lt;/P&gt;
&lt;DIV align=center&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="Altered certificate certification path" border=0 alt="Altered certificate certification path" src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/CertificateChainingEngine_11803/altcert1.png" width=423 height=525&gt; &lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="Altered certificate General tab" border=0 alt="Altered certificate General tab" src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/CertificateChainingEngine_11803/altcert2.png" width=423 height=525&gt; &lt;/DIV&gt;
&lt;P&gt;На картинке слева вы видите, что chaining engine построил цепочку до доверенного корня, поскольку мой сертификат содержал нужные поля для работы метода Name match. Но сертификат был выдан не тем CA, который виден в цепочке, а поддельным CA. Хоть мой поддельный CA внешне не отличим от легитимного CA, но у него нету самого важного — правильного закрытого ключа, чтобы подписать сертификат. Ведь при проверке подписи используется открытый ключ легитимного CA и, следовательно, подпись не может быть проверена.&lt;/P&gt;
&lt;P&gt;Написал очень много страшных букв даже без надежды, что кто-то с первого раза поймёт о чём тут шёл разговор. Но поверьте, это достаточно полезное знание, чтобы уметь отыскивать и разрешать проблемы с построением цепочек сертификатов.&lt;/P&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=63f4fa92-f82b-4b01-a710-6324bae859bb"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,63f4fa92-f82b-4b01-a710-6324bae859bb.aspx</comments>
      <category>Security</category>
      <category>Security / PKI</category>
      <category>Security / PKI / Chaining Engine</category>
    </item>
  </channel>
</rss>