Недавно я описывал настройку сервера 1С под ОС CentOS 9. И в той статье я писал, что установку SSL сертификата для WEB-доступа к 1С я рассмотрю отдельно. Вот эта статья:
https://typical-admin.ru/item/91-1c-8-3-centos9
Пришло время описать установку SSL сертификата. Его я буду получать в бесплатном центре сертификации Let’s Encrypt. И для получения сертификата мне понадобится установить ACME-клиент под названием Certbot. Перехожу на оф.сайт:
Там надо найти вот такую менюшку:
В ней нужно выбрать программный продукт, для которого планирую получить сертификат и указать, на какой ОС этот продукт работает. Значит у меня WEB-доступ к 1С предоставлен через Apache, и всё это работает под CentOS 9. Однако для CentOS 9 пока не предоставлено выбора, поэтому я выбираю CentOS 8, установка будет идентичной:
Ну и после этого выбора меня перебрасывает на страницу с инструкцией:
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.
Всё, перезагружаю Апач, проверяю всё ли работает.
Да, и не забыть добавить правило на фаерволе:
Ну и на этом всё, HTTPS работает, сертификат доверенный.
Донаты принимаются на кошельки:
Yoomoney:
4100118091867315
Карта Т-Банк (бывший Тиньков):
2200 7017 2612 2077
Карта Альфа-Банк:
2200 1539 1357 2013