Любой современный уважающий себя сайт просто обязан работать по протоколу https. Когда я вижу очередной http-сайт, то сразу понимаю, что его владельцам на него мягко говоря начхать, так что его содержимое как минимум не заслуживает доверия. Тем более что уже давно полноценный подписанный сертификат можно получить абсолютно бесплатно.
Эта статья является продолжением урока быстрого поднятия сайта на Javascript. В прошлый раз мы установили необходимое окружение и подняли сайт на связке Nginx+NodeJS, используя очень удобную утилиту Mechanic. Но точно также сертификат получается и для связки Nginx+Apache или чистом Nginx.
Итак, у нас развернутый сервер на Ubuntu 20.04 и сайт demosite.com, пока работающий по http.
Устанавливаем необходимое ПО для создания сертификата и запрашиваем его:
sudo apt install certbot python3-certbot-nginx
certbot --nginx -d demosite.com -d www.demosite.com
Ответьте на вопросы, которые появятся в процессе установки, и уже через минуту вы получите новенький сертификат в директории /etc/letsencrypt/live/demosite.com/
Если ваш сайт содержит поддомены - нужно перечислить в этой команде каждый из них.
Поскольку для настройки Nginx мы использовали утилиту mechanic, подключим сертификат также через нее. Для этого достаточно залинковать их в директорию certs в папке /etc/nginx/:
sudo mkdir /etc/nginx/certs
ln -s /etc/letsencrypt/live/demosite.com/privkey.pem /etc/nginx/certs/demosite.key
ln -s /etc/letsencrypt/live/demosite.com/fullchain.pem /etc/nginx/certs/demosite.cer
mechanic update demosite --https=true --redirect-to-https=true
Готово! Mechanic прописал необходимую конфигурацию самостоятельно.
Если вы не пользуетесь этой утилитой, то в конфигурации nginx (/etc/nginx/sites-available/) пропишите настройки самостоятельно:
# Принудительный редирект на https
server {
listen *:80;
server_name demosite.com www.demosite.com;
location / {
rewrite ^(.*)$ https://demosite.com$1;
}
}
server {
listen *:443 ssl;
server_name demosite.com www.demosite.com;
ssl_protocols TLSv1.1 TLSv1.2;
ssl_certificate /etc/letsencrypt/live/demosite.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/demosite.com/privkey.pem;
# Далее идет остальная часть конфигурации Nginx
При ручной настройке нужно перезагрузить Nginx самостоятельно:
service nginx restart
Теперь добавим автоматическое продление сертификата в CRON:
sudo crontab -u root -e
Впишите в конец строку:
0 5 * * * /usr/bin/certbot renew --quiet --pre-hook "service nginx stop" --post-hook "service nginx start"
Если у вас нет собственного выделенного сервера, а сайт находится на виртуальном хостинге - не беда. Конечно, большинство виртуальных хостингов намеренно не дает автоматически создавать сертификат Let's encrypt (им же надо продавать платные сертификаты), но никто не мешает сформировать его вам вручную и загрузить на хостинг как купленный сертификат. Но это уже совсем другая история. Если будут пожелания - вынесу это в отдельную статью.
Также есть вариант использовать бесплатные онлайн-сервисы для генерации Let's encrypt сертификата, например https://zerossl.com/. Но тут есть определенный риск, т.к. такие сервисы становятся посредниками, и теоретически могут скомпрометировать сертификат.
Важный нюанс, в особенности касающийся ApostropheCMS и прочих CMF-фреймворков NodeJS, базирующихся на expressjs.
Чтобы в expressjs корректно срабатывало определение https-протокола (в ApostropheCMS от этого зависит правильность формирования ссылок), необходимо прописать настройку "trust proxy" в файле /lib/modules/apostrophe-express/index.js:
module.exports = {
session: {
secret: 'секретныйключ'
},
afterConstruct: function (self) {
self.apos.app.set('trust proxy', true);
}
};