SSL сертификат во FreeBSD + apache virtualhost

Разъяснения такое SSL сертификат и зачем он нужен, а так же как обновлять дерево портов не входят в данную статью.

Получить сертификат можно несколькими способами:

 

первый — создать собственный Центр Сертификации и подписывать им сертификаты для своих ресурсов.
второй — воспользоваться сторонним сервисом.
У каждого их способов есть свои плюсы и минусы. Данная статья показывает на примерах второй путь. Вариант с получением сертификатов подписанных собственным СА будет чуть позже.
Итак исходные данные:
-apache24;
-домен site.com размещенный на виртуальном хосте;
-FreeBSD12;
Хотим что бы при наборе в адресной строке адреса http://site.com приезжала страница вида https://site.com и при этом браузеры не ругались что подключение к сайту не защищено.

1) Ставим официальный клиент из портов
cd /usr/ports/security/py-certbot/
make install clean

или
pkg install security/py-certbot

2) Получаем SSL сертификат
Для первичного запуска certbot и получения сертификата 80 и 443 порт должны быть свободны, посему
тушим apache
/usr/local/sbin/apachectl stop
получаем сертификат
certbot certonly --standalone -d site.com --email user@mail.com
Если все прошло без ошибок сертификаты будут автоматически помещены в /usr/local/etc/letsencrypt/live/site.com/

3) Настраиваем Apache
в файле /usr/local/etc/apache24/httpd.conf
«разремливаем» строчки
LoadModule ssl_module libexec/apache24/mod_ssl.so
добавляем
Listen 80
Listen 443
в файле /usr/local/etc/apache24/extra/httpd-vhosts.conf
добавляем строчки выделенные жирным


<VirtualHost 178.219.xxx.xxx:80>
ServerName site.com
Redirect / https://site.com/
</VirtualHost>

(принудительный редирект с http на https)


<VirtualHost 178.219.xxx.xxx:443>
ServerAdmin admin@site.com
DocumentRoot /usr/local/www/apache24/data/site.com
ServerName site.com
ServerAlias www.site.com
SSLEngine on
SSLCertificateFile /usr/local/www/apache24/data/site.com/ssl/site.com.crt
SSLCertificateKeyFile /usr/local/www/apache24/data/site.com/ssl/site.com.key

ErrorLog /var/log/apache/site.com/error_log
<Directory "/usr/local/www/apache24/data/site.com">
Options FollowSymLinks
AllowOverride All
</Directory>
<files xmlrpc.php>
order allow,deny
deny from all
</files>
</VirtualHost>

делаем симлинк с того места где лежат сертификаты на место куда указали в строчках выше.
перезапускаем apache
заходим на страничку и если все сделали правильно радуемся результату

Все хорошо, за исключением одного НО. Сертификат выдают только на 3 месяца, что не есть хорошо. Поэтому мы сделаем чтобы наш сертификат обновлялся раз в месяц автоматически.
Для этого добавим в cron следующую строчку.

#Обновляем сертификат в 4 утра второго числа каждого месяца
10 4 2 * * /usr/local/sbin/apachectl stop && certbot renew --cert-name site.com && /usr/local/sbin/apachectl start > /dev/null 2>&1

cert-name != Доменное имя
Обратите внимание, что значение, указанное в параметре —cert-name, — это имя сертификата (а не имя домена)

Посмотреть какие сертификаты у вас есть можно командой
certbot certificates

Сертификат обновиться только если до его окончания осталось меньше 30 дней, так что нет смысла ставить его в cron на ежедневное исполнение.