{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Skurudo Blog(post): заметки с тегом GitHub",
    "_rss_description": "GitHub — крупнейший веб-сервис для хостинга IT-проектов и их совместной разработки",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/www.skurudo.ru\/tags\/github\/",
    "feed_url": "https:\/\/www.skurudo.ru\/tags\/github\/json\/",
    "icon": "https:\/\/www.skurudo.ru\/pictures\/userpic\/userpic@2x.jpg?1691593083",
    "authors": [
        {
            "name": "Pavel Galkin",
            "url": "https:\/\/www.skurudo.ru\/",
            "avatar": "https:\/\/www.skurudo.ru\/pictures\/userpic\/userpic@2x.jpg?1691593083"
        }
    ],
    "items": [
        {
            "id": "231",
            "url": "https:\/\/www.skurudo.ru\/all\/check-ssl-certificate-s-date\/",
            "title": "Проверка срока годности SSL-сертификат(ов)",
            "content_html": "<p>С приходом Let’s Encrypt сертификаты стали бесплатными, а https массово шагнул в эти ваши интернеты. Выпустить сертификат для домена, почты и сервисов стало просто, но срок действия сертификата в 90 дней не слишком велик, что ведет нас к тому, что периодически его нужно перевыпускать. В свою очередь приходится заниматься и тем, чтобы проверять, не истек ли сертификат, продлился ли он корректно.<\/p>\n<p>Много раз сталкивался с тем, что сертификат не продлялся. Причин этому достаточно — ошибки при проверке, ошибки при конфигурировании сервера, изменения в DNS. Банальнейшая история, когда А запись для домена и WWW прописана на разные адреса и что-то в записях меняется, например при переезде. Бывают также превышения лимита запросов к Let’s Encrypt, на какое время сертификат перевыпустить не получится.<\/p>\n<p>Именно для этого требуется хоть какой-нибудь мониторинг хозяйства из ssl сертификатов. Саму проверку мы по сути можем выполнить одной командой:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">openssl s_client -servername &lt;NAME&gt; -connect &lt;HOST:PORT&gt; 2&gt;\/dev\/null | openssl x509 -noout -dates<\/code><\/pre><p>И смотреть, что у нас получилось в выходе notAfter. Решение для посмотреть по-быстрому, но пользоваться не слишком удобно. Что приводит нас к необходимости усложнить...<\/p>\n<p>Если у нас нет четкого списка доменов или этот список меняется (возможно в будущем), сначала каким-то образом нам нужно получить список доменных имен, которые существуют на сервере и которые придется проверять. Исходя из того, что nginx почти везде, можем взять из него:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">nginx -T | sed -r -e &#039;s\/[ \\t]*$\/\/&#039; -e &#039;s\/^[ \\t]*\/\/&#039; -e &#039;s\/^#.*$\/\/&#039; -e &#039;s\/[ \\t]*#.*$\/\/&#039; -e &#039;\/^$\/d&#039; | \\\r\nsed -e &#039;:a;N;$!ba;s\/\\([^;\\{\\}]\\)\\n\/\\1 \/g&#039; | \\\r\ngrep -P &#039;server_name[ \\t]&#039; | grep -v &#039;\\$&#039; | grep &#039;\\.&#039; | \\\r\nsed -r -e &#039;s\/(\\S)[ \\t]+(\\S)\/\\1\\n\\2\/g&#039; -e &#039;s\/[\\t ]\/\/g&#039; -e &#039;s\/;\/\/&#039; -e &#039;s\/server_name\/\/&#039; | \\\r\nsort | uniq | xargs -L1 &gt; \/path\/to\/sitelist<\/code><\/pre><p>Для тех, кто использует панели управления, вроде ISPManager — плохая новость, изящно список не получить — нужно пользоваться nginx и выборкой оттуда. А вот у VestaCP \/ HestiaCP \/ MyVesta есть аккуратная выборка:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">v-list-users | tail -n +3 | awk &#039;{print &quot;v-list-web-domains &quot;$1&quot; | tail -n +3&quot;}&#039; | bash | awk &#039;{ print ($1)&quot;:443&quot; | &quot;sort -d&quot; }&#039; &gt; \/path\/to\/sitelist<\/code><\/pre><p>Далее можно попробовать что-то свое, а можно взять готовое решение от Джулио @elarraydejota из Мадрида — <a href=\"jota-cert-checker\"><a href=\"https:\/\/github.com\/juliojsb\/jota-cert-checker\">https:\/\/github.com\/juliojsb\/jota-cert-checker<\/a><\/a>. Из многих скриптов этот понравился больше всего. Стабильная работа, понятный код и приятный выбор между отчетами.  Остается только добавить в начало скрипта выборку по доменам или подключать ее в скрипте с помощью source, далее сможем получать отчеты в терминале или по почте.<\/p>\n<p>В терминале это выглядит вот так:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/www.skurudo.ru\/pictures\/ssl-check-terminal.png\" width=\"1121\" height=\"334\" alt=\"\" \/>\n<\/div>\n<p>На почте вот так:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/www.skurudo.ru\/pictures\/ssl-check-mail.png\" width=\"817\" height=\"493\" alt=\"\" \/>\n<\/div>\n<p>Но не все же так хорошо? Да, не все. Удалось подружить скрипт с телеграмом, но вывод как для слаки при большом количестве доменов в виде картинки — очень неудачный вариант, для 1-5 еще ничего. Пока пришлось отказаться от этой затеи.. Также к минусам можно отнести и сложности с кириллическими доменами, даже в punnycode. Проверка их с помощью openssl s_client клиента проходит не всегда.<\/p>\n",
            "date_published": "2021-07-20T16:20:04+03:00",
            "date_modified": "2021-07-20T16:27:00+03:00",
            "tags": [
                "Debian",
                "GitHub",
                "HestiaCP",
                "Let's Encrypt",
                "MyVesta",
                "Ubuntu",
                "VestaCP"
            ],
            "image": "https:\/\/www.skurudo.ru\/pictures\/ssl-check-terminal.png",
            "_date_published_rfc2822": "Tue, 20 Jul 2021 16:20:04 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "231",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/www.skurudo.ru\/pictures\/ssl-check-terminal.png",
                    "https:\/\/www.skurudo.ru\/pictures\/ssl-check-mail.png"
                ]
            }
        }
    ],
    "_e2_version": 4116,
    "_e2_ua_string": "Aegea 11.2 (v4116)"
}