{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Копытов Иван: заметки с тегом pin-sha256б",
    "_rss_description": "Блог ленивого сисадмина",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/kini24.ru\/tags\/pin-sha256b\/",
    "feed_url": "https:\/\/kini24.ru\/tags\/pin-sha256b\/json\/",
    "icon": false,
    "authors": [
        {
            "name": "Копытов Иван",
            "url": "https:\/\/kini24.ru\/",
            "avatar": false
        }
    ],
    "items": [
        {
            "id": "5",
            "url": "https:\/\/kini24.ru\/all\/zaschita-sayta-pri-pomoschi-http-public-key-pinning-hpkp\/",
            "title": "Защита сайта при помощи HTTP Public Key Pinning (HPKP)",
            "content_html": "<p>Данная технология призвана защитить посетителя вашего сайта от атаки типа MITM (Man in the middle, человек посередине). Иными словами посетитель может быть уверен, что данные, которые он получает, исходят с вашего сайта, а не с какого-то другого.<\/p>\n<p>Суть технологии состоит в создании публичного ключа на основе сертификата, который установлен на вашем сайте. Соответственно, чтобы она работала, требуется валидный сертификат. Впрочем, она будет работать и на самоподписанных (self-signed) сертификатах. Полученный на основе вашего сертификата ключ добавляется в заголовок ответа вашего сервера, после чего браузер сравнивает полученный ключ с тем, который он вычисляет после получения данных о вашем сертификате.<\/p>\n<p>Итак, что нам требуется:<\/p>\n<ol start=\"1\">\n<li>Какой-либо установленный для сайта сертификат.<\/li>\n<li>Консоль для получения публичного ключа.<\/li>\n<\/ol>\n<p>Кстати, не так давно для нормального функционирования этой технологии требовался всего лишь один ключ, сейчас же нужно указывать два или более ключей. На мой взгляд двух будет достаточно, от этого и будем отталкиваться. Второй ключ является «резервным», этот момент я не совсем понимаю, но не будем отступать от требований.<\/p>\n<p>Действовал я по следующей схеме:<\/p>\n<ul>\n<li>— получаем сертификат на сайте <a href=\"https:\/\/letsencrypt.org\/\">Let’s Encrypt<\/a> для двух сайтов: example.com и www.example.com;<\/li>\n<li>— так как я использую вариант без www, то ключ, полученный на базе первого будет основным, на базе второго — резервным;<\/li>\n<li>— генерируем ключи для обоих сертификатов;<\/li>\n<li>— добавляем нужные инструкции в файл \/<i>etc\/httpd2\/conf\/sites-available\/default-http.conf<\/i>.<\/li>\n<\/ul>\n<p>О получении сертификата рассказывать не буду, достаточно почитать главную страницу сайта. Допустим, вы его получили и установили на свой сайт. Теперь требуется создать ключи при помощи следующей команды:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">openssl x509 -noout -in certificate.pem -pubkey | openssl rsa -pubin -outform der | \\<\/code><\/pre><pre class=\"e2-text-code\"><code class=\"\">openssl dgst -sha256 -binary | base64<\/code><\/pre><p>где <i>certificate.pem<\/i> — полный путь к сертфикату.<\/p>\n<p>После выполнения команды вы получите нечто подобное:<\/p>\n<p><b><i>LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=<\/i><\/b><\/p>\n<p>Это и есть нужный вам ключ. Повторяем команду для второго сертификата и добавляем данные в файл конфигурации сайта:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">Header set Public-Key-Pins &quot;pin-sha256=\\&quot;pin1\\&quot;; pin-sha256=\\&quot;pin2\\&quot;; max-age=time&quot;<\/code><\/pre><p>где:<\/p>\n<ul>\n<li><i>pin1<\/i> — основной ключ для данного сайта. В моем случае example.com;<\/li>\n<li><i>pin2<\/i> — резервный ключ для сайта. То есть www.example.com;<\/li>\n<li><i>time<\/i> — время действия ключа в секундах.<\/li>\n<\/ul>\n<p>Опциональный параметр <i>includeSubDomains<\/i> указывает на то, что ключи действительны также для поддоменов.\nЕще один необязательный параметр report-uri указывает на адрес, куда должны отправляться отчеты об ошибках в формате JSON. Его я, возможно, добавлю на сайт, но пока что считаю его ненужным для себя.<\/p>\n<p>Какие тут есть нюансы? Если вы неправильно настроите HPKP, ваш сайт станет недоступен. Можно также настроить отправку отчетов в случае каких-либо ошибок. Для этого немного меняем заголовок (или просто добавляем еще одной строкой):<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">Header set Public-Key-Pins-Report-Only &quot;pin-sha256=\\&quot;pin1\\&quot;; pin-sha256=\\&quot;pin2\\&quot;; max-age=time&quot;<\/code><\/pre>",
            "date_published": "2016-08-16T22:24:24+07:00",
            "date_modified": "2016-10-01T13:22:18+07:00",
            "tags": [
                "apache",
                "HPKP",
                "HTTP Public Key Pinning",
                "openssl",
                "pin-sha256б",
                "Public-Key-Pins",
                "внедрение",
                "домен",
                "защита",
                "сайт",
                "установка"
            ],
            "_date_published_rfc2822": "Tue, 16 Aug 2016 22:24:24 +0700",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "5",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": []
            }
        }
    ],
    "_e2_version": 4134,
    "_e2_ua_string": "Aegea 11.3 (v4134)"
}