Задача: Нужно обновить сертификат для сайтов, но вот сервер на котором они крутятся — это FreeBSD 12 и предыдущим системным администратором применена нестандартная конфигурация настройки Web-сервиса, а это накладывает ограничение не привычное использование утилиты certbot. Т.е. если у меня на Ubuntu 18.04/CentOS 7 используется и продлевается автоматически, то тут не так — а только через DNS. А как это?, это же ручной способ.

На данном сервере крутятся важные порталы базирующиеся на CMS платформе Bitrix и сертификаты не купленные, а используемые на бесплатной основе сроком на 90 дней от Let's Encrypt.

Необходимые требования:

  • Утилита Certbot
  • Доступ к DNS-записям вашего доменного имени. (к примеру у меня это nic.ru)

Ниже шпаргалка, как я решил задачу в своих условиях:

Шаг №1: Подключаюсь к системе через ключ SSH:

$ sudo su -
root@ekzorchik.ru [/root] #
root@ekzorchik.ru [/root] #uname -a
FreeBSD ekzorchik.ru 12.0-RELEASE-p7 FreeBSD 12.0-RELEASE-p7 GENERIC amd64
root@ekzorchik.ru [/root] #

Шаг №2: Утилита certbot уже установлена

root@ekzorchik.ru [/root] #pkg info --all | grep certbot
py36-certbot-0.39.0,1 Let's Encrypt client
root@ekzorchik.ru [/root] #
root@ekzorchik.ru [/root] #whereis certbot
certbot: /usr/local/bin/certbot
root@ekzorchik.ru [/root] #md5 /usr/local/bin/certbot
MD5 (/usr/local/bin/certbot) = ed10505bd3fba00e22d3b60676241fc3
root@ekzorchik.ru [/root] #file /usr/local/bin/certbot
/usr/local/bin/certbot: symbolic link to certbot-3.6
root@ekzorchik.ru [/root] #

Шаг №3: Создаю сертификат через проверку DNS записей, что я владелец данного доменного имени:

root@ekzorchik.ru [/root] #certbot certonly --manual --preferred-challenges dns
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Please enter in your domain name(s) (comma and/or space separated) (Enter 'c'
to cancel): shop.ekzorchik.ru
Obtaining a new certificate
Performing the following challenges:
dns-01 challenge for shop.ekzorchik.ru
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running certbot in manual mode on a machine that is not
your server, please ensure you're okay with that.
Are you OK with your IP being logged?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name
_acme-challenge.shop.ekzorchik.ru with the following value:

Создаю на nic.ru запись вида:

_acme-challenge.shop = dg4dyePH_9vfo8MipV7gfbllHJ64nUf7mO6upn5y1Q8

dg4dyePH_9vfo8MipV7gfbllHJ64nUf7mO6upn5y1Q8

Before continuing, verify the record is deployed.
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
На заметку: Это самое важное — ожидаем минут 20 и только после нажимаем Enter

Press Enter to Continue
Waiting for verification...
Cleaning up challenges -< вот это хороший знак

IMPORTANT NOTES:

- Congratulations! Your certificate and chain have been saved at:
/usr/local/etc/letsencrypt/live/shop.ekzorchik.ru/fullchain.pem
Your key file has been saved at:
/usr/local/etc/letsencrypt/live/shop.ekzorchik.ru/privkey.pem
Your cert will expire on 2020-06-25. To obtain a new or tweaked
version of this certificate in the future, simply run certbot
again. To non-interactively renew *all* of your certificates, run
"certbot renew"
- If you like Certbot, please consider supporting our work by:

Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
root@ekzorchik.ru [/root]

Шаг №3: Смотрю конфигурацию сайта nginx для данного доменного имени:

root@ekzorchik.ru [/root] #cat /usr/local/etc/nginx/vhosts/shop.ekzorchik.ru.enabled                                             
#ekzorchik.ru
server {
        listen                  80;
        server_name             shop.ekzorchik.ru;
        return                  301 https://$server_name$request_uri;
        # Coz of there are IP filter to / location
        location /.well-known {
                root            /usr/local/www/shop.ekzorchik.ru/public_html;
        }
}
server {
        listen                  443 ssl http2;
        server_name             shop.ekzorchik.ru;
        #include                        /usr/local/etc/nginx/ssl.conf;
        include                 /usr/local/etc/nginx/add_header.conf;

        access_log              /var/log/nginx/shop.ekzorchik.ru-access.log main_ext;
        error_log               /var/log/nginx/shop.ekzorchik.ru-error.log warn;
        # ACME challenge
        location /.well-known {
                root            /usr/local/www/shop.ekzorchik.ru/public_html;
        }
        location ~ \.zip$ {
                max_ranges 0;
                proxy_pass      https://127.0.0.1:8443;
                include         /usr/local/etc/nginx/proxy.conf;
        }
        location / {
                proxy_pass      https://127.0.0.1:8443;
                include         /usr/local/etc/nginx/proxy.conf;
        }
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
                root            /usr/local/www/nginx-dist;
        }
}
root@ekzorchik.ru [/root] #

root@ekzorchik.ru [/root] #cat /usr/local/etc/nginx/proxy.conf
client_max_body_size 200m;
client_body_buffer_size 2m;

proxy_connect_timeout 6000;
proxy_send_timeout 12000;
proxy_read_timeout 12000;
proxy_send_lowat 8191;

proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Request-Scheme $scheme;

# fix apache ddos
proxy_set_header Range-Request "";

# fix IOS Safari confusion
proxy_hide_header Upgrade;

proxy_buffer_size 16k;
proxy_buffers 8 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;

proxy_temp_path /tmp/nginx;

Шаг №4: Копирую ssl.conf как sslshop.conf

root@ekzorchik.ru [/root] #cp /usr/local/etc/nginx/ssl.conf /usr/local/etc/nginx/sslshop.conf

Шаг №5: Редактирую sslshop.conf где изменения путь до

  • «Ключ SSL-сертификата» — privkey.pem
  • «Цепочка SSL-сертификатов» — fullchain.pem

эти файлы были сгенерированные проверкой из «Шаг №3»

root@ekzorchik.ru [/root] #nano /usr/local/etc/nginx/sslshop.conf                                                          
#ssl                            on;
#вот два пути
ssl_certificate                 /usr/local/etc/letsencrypt/live/shop.ekzorchik.ru/fullchain.pem;
ssl_certificate_key             /usr/local/etc/letsencrypt/live/shop.ekzorchik.ru/privkey.pem;
# Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
ssl_dhparam                     /usr/local/etc/nginx/ssl/dhparam.pem;
# intermediate configuration. tweak to your needs.
ssl_protocols                   TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers
'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers       on;
ssl_session_timeout             1d;
ssl_session_cache               shared:SSL:50m;
ssl_session_tickets             off;
# HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
add_header                      Strict-Transport-Security max-age=63072000;
# OCSP Stapling ---
# fetch OCSP records from URL in ssl_certificate and cache them
ssl_stapling                    off;
ssl_stapling_verify             off;
resolver                        77.88.8.8 valid=300s;
resolver_timeout                5s;

Шаг №6: Проверяю конфигурацию на ошибки и если все хорошо перезапускаю Webсервис nginx:

root@ekzorchik.ru [/root] #nginx -t
root@ekzorchik.ru [/root] #service nginx restart

Шаг №7: Проверяю, что сертификат у домена по части времени окончания успешно обновлен:

root@ekzorchik.ru [/root] #openssl s_client -connect shop.ekzorchik.ru:443 -servername shop.ekzorchik.ru -tlsextdebug 2>/dev/null | openssl x509 -noout -dates 2>/dev/null
notBefore=Mar 27 17:13:28 2020 GMT
notAfter=Jun 25 17:13:28 2020 GMT <= сертификат успешно обновлен от текущей даты сроком на 90 дней.
^C
root@ekzorchik.ru [/root] #

спустя некого количества времени запрос завершается, хотя может показать, что он чего-то ожидает и его нужно прервать по сочетанию клавиш Ctrl + C

Шаг №8: По аналогии сделал и для ekzorchik.ru.

Итого я для себя проработал шаги посредством которых я задачу обновления сертификата буду выполнять в ручную каждые три месяца, т.к. данный способ через DNS не поддерживает какую-либо автоматизацию. Но и не нужно, у меня есть заметка которая за меня будет мне напоминать, что нужно вернуть к этой заметке: «Мониторим дату окончания домена и сертификата https через Zabbix Server 4.4»

На этом у меня все, с уважением автор блога Олло Александр aka ekzorchik.