<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Копытов Иван: заметки с тегом pin-sha256б</title>
<link>https://kini24.ru/tags/pin-sha256b/</link>
<description>Блог ленивого сисадмина</description>
<author></author>
<language>ru</language>
<generator>Aegea 11.3 (v4134)</generator>

<itunes:subtitle>Блог ленивого сисадмина</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit></itunes:explicit>

<item>
<title>Защита сайта при помощи HTTP Public Key Pinning (HPKP)</title>
<guid isPermaLink="false">5</guid>
<link>https://kini24.ru/all/zaschita-sayta-pri-pomoschi-http-public-key-pinning-hpkp/</link>
<pubDate>Tue, 16 Aug 2016 22:24:24 +0700</pubDate>
<author></author>
<comments>https://kini24.ru/all/zaschita-sayta-pri-pomoschi-http-public-key-pinning-hpkp/</comments>
<description>
&lt;p&gt;Данная технология призвана защитить посетителя вашего сайта от атаки типа MITM (Man in the middle, человек посередине). Иными словами посетитель может быть уверен, что данные, которые он получает, исходят с вашего сайта, а не с какого-то другого.&lt;/p&gt;
&lt;p&gt;Суть технологии состоит в создании публичного ключа на основе сертификата, который установлен на вашем сайте. Соответственно, чтобы она работала, требуется валидный сертификат. Впрочем, она будет работать и на самоподписанных (self-signed) сертификатах. Полученный на основе вашего сертификата ключ добавляется в заголовок ответа вашего сервера, после чего браузер сравнивает полученный ключ с тем, который он вычисляет после получения данных о вашем сертификате.&lt;/p&gt;
&lt;p&gt;Итак, что нам требуется:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Какой-либо установленный для сайта сертификат.&lt;/li&gt;
&lt;li&gt;Консоль для получения публичного ключа.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Кстати, не так давно для нормального функционирования этой технологии требовался всего лишь один ключ, сейчас же нужно указывать два или более ключей. На мой взгляд двух будет достаточно, от этого и будем отталкиваться. Второй ключ является «резервным», этот момент я не совсем понимаю, но не будем отступать от требований.&lt;/p&gt;
&lt;p&gt;Действовал я по следующей схеме:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;— получаем сертификат на сайте &lt;a href="https://letsencrypt.org/"&gt;Let’s Encrypt&lt;/a&gt; для двух сайтов: example.com и www.example.com;&lt;/li&gt;
&lt;li&gt;— так как я использую вариант без www, то ключ, полученный на базе первого будет основным, на базе второго — резервным;&lt;/li&gt;
&lt;li&gt;— генерируем ключи для обоих сертификатов;&lt;/li&gt;
&lt;li&gt;— добавляем нужные инструкции в файл /&lt;i&gt;etc/httpd2/conf/sites-available/default-http.conf&lt;/i&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;О получении сертификата рассказывать не буду, достаточно почитать главную страницу сайта. Допустим, вы его получили и установили на свой сайт. Теперь требуется создать ключи при помощи следующей команды:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;openssl x509 -noout -in certificate.pem -pubkey | openssl rsa -pubin -outform der | \&lt;/code&gt;&lt;/pre&gt;&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;openssl dgst -sha256 -binary | base64&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;где &lt;i&gt;certificate.pem&lt;/i&gt; — полный путь к сертфикату.&lt;/p&gt;
&lt;p&gt;После выполнения команды вы получите нечто подобное:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;i&gt;LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Это и есть нужный вам ключ. Повторяем команду для второго сертификата и добавляем данные в файл конфигурации сайта:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;Header set Public-Key-Pins &amp;quot;pin-sha256=\&amp;quot;pin1\&amp;quot;; pin-sha256=\&amp;quot;pin2\&amp;quot;; max-age=time&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;где:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;i&gt;pin1&lt;/i&gt; — основной ключ для данного сайта. В моем случае example.com;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;pin2&lt;/i&gt; — резервный ключ для сайта. То есть www.example.com;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;time&lt;/i&gt; — время действия ключа в секундах.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Опциональный параметр &lt;i&gt;includeSubDomains&lt;/i&gt; указывает на то, что ключи действительны также для поддоменов.
Еще один необязательный параметр report-uri указывает на адрес, куда должны отправляться отчеты об ошибках в формате JSON. Его я, возможно, добавлю на сайт, но пока что считаю его ненужным для себя.&lt;/p&gt;
&lt;p&gt;Какие тут есть нюансы? Если вы неправильно настроите HPKP, ваш сайт станет недоступен. Можно также настроить отправку отчетов в случае каких-либо ошибок. Для этого немного меняем заголовок (или просто добавляем еще одной строкой):&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;Header set Public-Key-Pins-Report-Only &amp;quot;pin-sha256=\&amp;quot;pin1\&amp;quot;; pin-sha256=\&amp;quot;pin2\&amp;quot;; max-age=time&amp;quot;&lt;/code&gt;&lt;/pre&gt;</description>
</item>


</channel>
</rss>