Версия для печати
Понедельник, 07 Февраль 2022 07:12

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

Автор
Оцените материал
(6 голосов)

Недавно я описывал настройку сервера 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, установка будет идентичной:

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

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

BTC:
bc1qzw9vam8mv6derwscxl0vrnd6m9t2rpjg273mna

ETH / BNB BSC / Polygon MATIC:
0x5cc07FF76490350ac6112fbFdA1B545Bc794602F

Tron:
TJUz8sJr9XYMjVqzmFNnCzzRWfPa57X2RV

USDT/USDC в сетях ETH/BSC/Polygon:
0x5cc07FF76490350ac6112fbFdA1B545Bc794602F

USDT в сети TRX (Tron):
TJUz8sJr9XYMjVqzmFNnCzzRWfPa57X2RV

LTC:
LRMZaFCSyCT6FUF62WEX1BokWV7v2dh2zo

Doge:
DTEnGLZRps9XaWNtAhchJWSeD4uTNDRxg7

XMR:
4A6uP1WxEc7HktToZFyiJuK6YmjdL8bSn2aY653qPwABhT4Y56iFuedgHcmpvLwWE55u8qkjGc715ZJs761FqedA8gkgznr

TON:
UQAdSPiWIDx2Q1VIeezkUV3s4sNlZM90w2ohSO6bD2-okwgY

Прочитано 1757 раз Последнее изменение Воскресенье, 15 Январь 2023 00:12
Николай