Задача: Нужно обновить сертификат для сайтов, но вот сервер на котором они крутятся — это 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.