Свой сервер: подготовка веб-сервера и сертификатов

Ниже приводится список команд, необходимых для настройки веб-сервера и получения сертификатов для своего jabber-сервера на примере Debian 12.

Первым делом ставим необходимые пакеты. Тут и далее команды выполняются от пользователя root.

apt-get install apache2 certbot
a2enmod headers

Вторая команда включает поддержку установки header'ов для отдаваемого контента - это пригодится в дальнейшем для настройки XEP-0156. Создаем конфиг-файл для веб-сервера. Здесь и далее вместо указанных IP-адресов используем адрес своего сервера, а вместо EXAMPLE.COM - свой домен.

Конфиг-файл /etc/apache2/sites-available/jabber_service_domain_EXAMPLE.COM.conf
<VirtualHost 185.161.208.130:80 [2a07:c801:0:1e::]:80>
        ServerAdmin     webmaster@EXAMPLE.COM
        DocumentRoot    /var/www/html/EXAMPLE.COM/htdocs
        ServerName      EXAMPLE.COM

        <Location ~ "/\.well-known/host-meta(\.json)?">
            Header set Access-Control-Allow-Origin "*"
        </Location>

</VirtualHost>

<VirtualHost 185.161.208.130:80 [2a07:c801:0:1e::]:80>
        ServerAdmin     webmaster@upload.EXAMPLE.COM
        DocumentRoot    /var/www/html/upload.EXAMPLE.COM/htdocs
        ServerName      upload.EXAMPLE.COM
</VirtualHost>

<VirtualHost 185.161.208.130:80 [2a07:c801:0:1e::]:80>
        ServerAdmin     webmaster@pubsub.EXAMPLE.COM
        DocumentRoot    /var/www/html/pubsub.EXAMPLE.COM/htdocs
        ServerName      pubsub.EXAMPLE.COM
</VirtualHost>

<VirtualHost 185.161.208.130:80 [2a07:c801:0:1e::]:80>
        ServerAdmin     webmaster@conference.EXAMPLE.COM
        DocumentRoot    /var/www/html/conference.EXAMPLE.COM/htdocs
        ServerName      conference.EXAMPLE.COM
</VirtualHost>

<VirtualHost 185.161.208.130:80 [2a07:c801:0:1e::]:80>
        ServerAdmin     webmaster@proxy.EXAMPLE.COM
        DocumentRoot    /var/www/html/proxy.EXAMPLE.COM/htdocs
        ServerName      proxy.EXAMPLE.COM
</VirtualHost>

<VirtualHost 185.161.208.130:80 [2a07:c801:0:1e::]:80>
        ServerAdmin     webmaster@proxy.EXAMPLE.COM
        DocumentRoot    /var/www/html/xmpp.EXAMPLE.COM/htdocs
        ServerName      proxy.EXAMPLE.COM
</VirtualHost>

Создаем каталоги:

mkdir -p $(awk '/DocumentRoot/{print $2}' /etc/apache2/sites-available/jabber_service_domain_EXAMPLE.COM.conf)
chown www-data:www-data -R /var/www/html/

Включаем наши сайты и удаляем дефолтный:

a2ensite jabber_service_domain_EXAMPLE.COM.conf
a2dissite 000-default.conf
mv /var/www/html/index.html /var/www/html/EXAMPLE.COM/htdocs/

Перезапускаем веб-сервер:

systemctl restart apache2

Теперь можно создать все необходимые сертификаты. Для этого воспользуйтесь следующими командами:

certbot certonly --webroot --webroot-path /var/www/EXAMPLE.COM/htdocs/ -d EXAMPLE.COM --rsa-key-size 4096
certbot certonly --webroot --webroot-path /var/www/conference.EXAMPLE.COM/htdocs/ -d conference.EXAMPLE.COM --rsa-key-size 4096
certbot certonly --webroot --webroot-path /var/www/upload.EXAMPLE.COM/htdocs/ -d upload.EXAMPLE.COM --rsa-key-size 4096
certbot certonly --webroot --webroot-path /var/www/pubsub.EXAMPLE.COM/htdocs/ -d pubsub.EXAMPLE.COM --rsa-key-size 4096
certbot certonly --webroot --webroot-path /var/www/proxy.EXAMPLE.COM/htdocs/ -d proxy.EXAMPLE.COM --rsa-key-size 4096

В параметрах после --webroot-path указывается каталог веб-сервера для данного домена, а после -d - сам домен.

После успешного выполнения команд будет выдана информация о созданном сертификате, в том числе 2 файла - цепочка ключей и приватный ключ - сохраните эти пути для дальнейшего использования, они нам еще пригодятся. Всего получится 10 файлов. certbot обновляет сертификаты автоматически, если срок их истечения составляет менее 30 дней - т.е., обновление происходит раз в 2 месяца.

В дальнейшем, для использования созданных на веб-сервере доменов - например, для размещения сайта, посвященного jabber-серверу, или размещения чат-логов конференций - можно включить в Apache2 поддержку SSL. Делается это следующим образом:

a2enmod ssl

Создаем конфиг-файл:

Конфиг-файл /etc/apache2/sites-available/ssl.jabber_service_domain_EXAMPLE.COM.conf
<VirtualHost 185.161.208.130:443 [2a07:c801:0:1e::]:443>
        ServerAdmin     webmaster@EXAMPLE.COM
        DocumentRoot    /var/www/html/EXAMPLE.COM/htdocs
        ServerName      EXAMPLE.COM

        SSLEngine on
        SSLCertificateFile /etc/letsencrypt/live/EXAMPLE.COM/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/EXAMPLE.COM/privkey.pem

        <Location ~ "/\.well-known/host-meta(\.json)?">
            Header set Access-Control-Allow-Origin "*"
        </Location>

</VirtualHost>

<VirtualHost 185.161.208.130:443 [2a07:c801:0:1e::]:443>
        ServerAdmin     webmaster@upload.EXAMPLE.COM
        DocumentRoot    /var/www/html/upload.EXAMPLE.COM/htdocs
        ServerName      upload.EXAMPLE.COM

        SSLEngine on
        SSLCertificateFile /etc/letsencrypt/live/upload.EXAMPLE.COM/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/upload.EXAMPLE.COM/privkey.pem
</VirtualHost>

<VirtualHost 185.161.208.130:443 [2a07:c801:0:1e::]:443>
        ServerAdmin     webmaster@pubsub.EXAMPLE.COM
        DocumentRoot    /var/www/html/pubsub.EXAMPLE.COM/htdocs
        ServerName      pubsub.EXAMPLE.COM

        SSLEngine on
        SSLCertificateFile /etc/letsencrypt/live/pubsub.EXAMPLE.COM/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/pubsub.EXAMPLE.COM/privkey.pem
</VirtualHost>

<VirtualHost 185.161.208.130:443 [2a07:c801:0:1e::]:443>
        ServerAdmin     webmaster@conference.EXAMPLE.COM
        DocumentRoot    /var/www/html/conference.EXAMPLE.COM/htdocs
        ServerName      conference.EXAMPLE.COM

        SSLEngine on
        SSLCertificateFile /etc/letsencrypt/live/conference.EXAMPLE.COM/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/conference.EXAMPLE.COM/privkey.pem
</VirtualHost>

<VirtualHost 185.161.208.130:443 [2a07:c801:0:1e::]:443>
        ServerAdmin     webmaster@proxy.EXAMPLE.COM
        DocumentRoot    /var/www/html/proxy.EXAMPLE.COM/htdocs
        ServerName      proxy.EXAMPLE.COM

        SSLEngine on
        SSLCertificateFile /etc/letsencrypt/live/proxy.EXAMPLE.COM/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/proxy.EXAMPLE.COM/privkey.pem
</VirtualHost>

И включаем его:

a2ensite ssl.jabber_service_domain_EXAMPLE.COM.conf
systemctl restart apache2