Найти в Дзене
Типичный Админ

Установка доверенного SSL сертификата для WEB-доступа 1С

Недавно я описывал настройку сервера 1С под ОС CentOS 9. И в той статье я писал, что установку SSL сертификата для WEB-доступа к 1С я рассмотрю отдельно. Вот эта статья:

https://typical-admin.ru/item/91-1c-8-3-centos9

Пришло время описать установку SSL сертификата. Его я буду получать в бесплатном центре сертификации Let’s Encrypt. И для получения сертификата мне понадобится установить ACME-клиент под названием Certbot. Перехожу на оф.сайт:

https://certbot.eff.org/

Там надо найти вот такую менюшку:

В ней нужно выбрать программный продукт, для которого планирую получить сертификат и указать, на какой ОС этот продукт работает. Значит у меня WEB-доступ к 1С предоставлен через Apache, и всё это работает под CentOS 9. Однако для CentOS 9 пока не предоставлено выбора, поэтому я выбираю CentOS 8, установка будет идентичной:

-2

Ну и после этого выбора меня перебрасывает на страницу с инструкцией:

https://certbot.eff.org/instructions?ws=apache&os=centosrhel8

где сначала предлагается установить Snapd. Что это такое, можно подробнее почитать тут:

http://compizomania.blogspot.com/2018/08/snap.html

Становлюсь в системе рутом и устанавливаю Snapd:

dnf -y install snapd
systemctl enable --now snapd.socket
ln -s /var/lib/snapd/snap /snap

Далее, надо убедиться, что версия Snapd обновлена. По-прежнему, из-под рута делаю:

snap install core
snap refresh core

Теперь ставлю Certbot через Snapd:

snap install --classic certbot

Подготавливаю Certbot к запуску:

ln -s /snap/bin/certbot /usr/bin/certbot

Теперь пробую получить сертификат. Запускаю команду:

certbot --apache

И получаю ошибку:

Error in checking parameter list:
The apache plugin is not working; there may be problems with your existing configuration.
The error was: MisconfigurationError('Apache is unable to check whether or not the module is loaded because Apache is misconfigured.')

Немного погуглив, нашёл это:

https://community.letsencrypt.org/t/the-apache-plugin-is-not-working/102520/37

Если коротко, то надо явно указать путь до Apachectl. Apachectl - утилита управления web-сервером Apache.

Что ж, значит пробую указать явно:

certbot --apache-ctl=/usr/sbin/apachectl

И снова получаю ошибку:

Certbot doesn't know how to automatically configure the web server on this system. However, it can still get a certificate for you. Please run "certbot certonly" to do so. You'll need to manually configure your web server to use the resulting certificate.

Хорошо, пробую запустить, как он говорит:

certbot certonly --apache-ctl=/usr/sbin/apachectl

Ну вроде пошло дело.

How would you like to authenticate with the ACME CA?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Apache Web Server plugin (apache) [Misconfigured]
2: Spin up a temporary webserver (standalone)
3: Place files in webroot directory (webroot)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-3] then [enter] (press 'c' to cancel):

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

1. через плагин Apache Web Server, который он пометил, как [Неправильная конфигурация]
2. временный веб-сервер, когда Certbot сам создаёт простейший веб-сервер и подключается сам к себе.
3. и можно указать webroot-каталог Апача, в который Certbot временно положит специальный файл для идентификации.

Я выберу третий вариант. И на шлюзе/роутере, через который сервер 1С выходит в интернет, надо пробросить порт 80 до сервера 1С. Кроме этого, Certbot’ту надо, чтобы в глобальной сети была А-запись, ведущая на белый IP-адрес шлюза/роутера. Именно поэтому мой домен AD является субдоменом моего сайта typical-admin.ru. Если же домен AD назывался как-нибудь typical-admin.local, то было бы уже сложнее. Там уже пришлось бы разруливать с помощью локального DNS-сервера путём создания на нём своей зоны typical-admin.ru. Суть в том, что в центре сертификации Let’s Encrypt можно получить доверенный сертификат только на существующий домен в глобальной сети.

Возвращаюсь обратно к Certbot. На следующем шаге он просит указать мой e-mail.

How would you like to authenticate with the ACME CA?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Apache Web Server plugin (apache) [Misconfigured]
2: Spin up a temporary webserver (standalone)
3: Place files in webroot directory (webroot)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-3] then [enter] (press 'c' to cancel): 3
Enter email address (used for urgent renewal and security notices)
(Enter 'c' to cancel):

Указываю какой-нибудь реальный почтовый адрес и двигаюсь далее. Следующим шагом будет принятие лицензионного соглашения. Принимаю и продолжаю двигаться дальше, где будет запрос согласия для регулярных почтовых рассылок. И вот тут отказываюсь!

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: n

Дошёл до шага, где через пробел надо ввести все домены, для которых будет использоваться получаемый сертификат. У меня только один домен:

Please enter the domain name(s) you would like on your certificate (comma and/or
space separated) (Enter 'c' to cancel): 1c-serv.local.typical-admin.ru

Затем будет запрошено расположение webroot-каталога Апача. Ввожу путь /var/www/html:

Please enter the domain name(s) you would like on your certificate (comma and/or
space separated) (Enter 'c' to cancel): 1c-serv.local.typical-admin.ru
Requesting a certificate for 1c-serv.local.typical-admin.ru
Input the webroot for 1c-serv.local.typical-admin.ru: (Enter 'c' to cancel): /var/www/html

После этого, если все условия были выполнены верно, будет сообщение об успешном получении сертификата:

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/1c-serv.local.typical-admin.ru/fullchain.pem
Key is saved at: /etc/letsencrypt/live/1c-serv.local.typical-admin.ru/privkey.pem
This certificate expires on 2022-05-07.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Сертификат получил. Теперь надо проверить команду обновления сертификата:

certbot renew --dry-run

Ругань никакая не вылезла, команда отработала:

# certbot renew --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/1c-serv.local.typical-admin.ru.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Account registered.
Simulating renewal of an existing certificate for 1c-serv.local.typical-admin.ru

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all simulated renewals succeeded:
/etc/letsencrypt/live/1c-serv.local.typical-admin.ru/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Создам где-нибудь скрипт для периодического автоматического обновления сертификатов. Например тут:

nano /home/distrib/certbotrenew

Содержимое у него будет такое:

#!/bin/bash

PATH=/sbin:/usr/sbin:/bin:/usr/bin

certbot renew --dry-run

Не забываю дать права на исполнение этому файлу:

chmod +x /home/distrib/certbotrenew

И в файл /etc/crontab добавляю строчку:

0 3 1 */2 * root /home/distrib/certbotrenew

Это означает, что скрипт будет запускаться раз в два месяца, первого числа, в 3:00 ночи. Сертификат действует 3 месяца, так что обновить его за месяц до окончания будет нормально. Хотя… Тут ещё надо правильно рассчитать. После получения сертификата сгенерировался конфиг /etc/letsencrypt/renewal/1c-serv.local.typical-admin.ru.conf. И в нём в самом верху закомментирована строчка:

# renew_before_expiry = 30 days

Похоже, это означает, что если сертификату осталось жить меньше 30 дней, то скрипт его обновит. В противном случае обновлять не будет. И скрипт у меня запускается в первый день каждого второго месяца. А месяц может быть и 30, и 31 и 28 дней… Поменяю-ка я это значение вот так:

renew_before_expiry = 34 days

Ну или расписание крона менять. Здесь уж кому как удобно.

С сертификатом разобрался, теперь мне надо сертификат прикрутить к Апачу. Сначала ставлю SSL-mod для него:

dnf -y install mod_ssl

Затем нахожу основной конфиг Апача /etc/httpd/conf/httpd.conf, а внутри него нахожу вот эту конструкцию:

# 1c publication
Alias "/mytest" "/var/www/testbase/"
<Directory "/var/www/testbase/">
AllowOverride All
Options None
Require all granted
SetHandler 1c-application
ManagedApplicationDescriptor "/var/www/testbase/default.vrd"
</Directory>

Её создал 1С-овский скрипт публикации базы в вэб-доступ. Эту конструкцию мне надо скопировать и вставить в дополнительный конфиг апача /etc/httpd/conf.d/ssl.conf. Вставлю конструкцию в самый низ конфига над закрывающим тэгом:

</VirtualHost>

Также нахожу в этом файле параметры:

SSLCertificateFile
SSLCertificateKeyFile

И прописываю в них пути до полученного сертификата и его ключа:

SSLCertificateFile /etc/letsencrypt/live/1c-serv.local.typical-admin.ru/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/1c-serv.local.typical-admin.ru/privkey.pem

Затем перехожу в каталог, где располагается файл web-интерфейса 1С (файл default.vrd), у меня это /var/www/testbase. И там создаю файл .htaccess вот с таким содержимым:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
Options +FollowSymLinks
Allow from All

Это будет означать, что трафик с http будет перенаправляться на https. Также этот файл можно создать вот такого типа:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{REMOTE_ADDR} !^192.168.*
RewriteCond %{REMOTE_ADDR} !^172.16.*
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
Options +FollowSymLinks
Allow from All

Это будет означать, что трафик с http будет перенаправляться на https для всех пользователей, кроме тех, кто заходит из сетей 192.168.0.0/16 и 172.16.0.0/16.

Всё, перезагружаю Апач, проверяю всё ли работает.

Да, и не забыть добавить правило на фаерволе:

-3

Ну и на этом всё, HTTPS работает, сертификат доверенный.

-4

Донаты принимаются на кошельки:

Yoomoney:
4100118091867315

Карта Т-Банк (бывший Тиньков):
2200 7017 2612 2077

Карта Альфа-Банк:
2200 1539 1357 2013

#1C #Apache #LetsEncrypt #установка #настройка #certbot

-5