Создание бесплатного SSL сертификата


Let’s Encrypt — центр сертификации запущенный компаниями Electronic Frontier Foundation, Mozilla Foundation, Akamai, Cisco Systems. Центр начал работу в бета-режиме с 3 декабря 2015 года и предоставляет бесплатные криптографические сертификаты X.509 для TLS шифрования (HTTPS). Сертификат можно получать как автоматически, так и в ручной режиме. Для получения сертификата на CentOS необходимо установить репозиторий epel (Fedora).
yum install epel-release -y

Скачать установщик и дать права на его запуск
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto

После этого запустить сам установщик. Он проверит систему и скачает недостающие пакеты.
./certbot-auto

В CentOS 7 certbot устанавливается через yum
yum install epel-release certbot -y

Далее приступаем к генерации сертификата
./certbot-auto certonly --webroot --agree-tos --email moya@pochta.ru -w /papka/moego/sayta -d moy-sayt.ru -d www.moy-sayt.ru

В CentOS 7 вместо команды ./certbot-auto используется certbot

Скрипт проверит вам ли принадлежит этот домен, для этого попросит освободить порт 80, в нашем случае данный порт занимает Nginx, поэтому его останавливаем.
service nginx stop
После проверки произойдёт генерация сертификата, который будет помещён в папку /etc/letsencrypt/live/moy-sayt.ru

Запускаем сервер Nginx
service nginx start

В Centos 7 Nginx останавливать и заново запускать не нужно, так как cerbot создаёт специальный проверочный файл к корневой директории сайта и совершая запрос на проверочный файл определяет домен вам принадлежит или нет.

Чтоб максимально сократить время, в течение которого сервер будет недоступен, используем следующую команду:
service nginx stop && ./certbot-auto certonly --webroot --agree-tos --email moya@pochta.ru -w /papka/moego/sayta -d moy-sayt.ru -d www.moy-sayt.ru && service nginx start

—webroot — с nginx используем этот ключ;
—agree-tos — автоматическое принятие лицензионного соглашения;
—email — адрес нашей почты. Пригодится для восстановления аккаунта;
-w — папка сайта;
-d — наш домен, можно указывать несколько, соответственно перед каждым доменом ставим -d.

Добавляем в конфигурационный файл нашего сайта в Nginx следующие строки:
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/moy-sayt.ru/cert.pem;
ssl_certificate_key /etc/letsencrypt/live/moy-sayt.ru/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ALL:!ADH:!EXPORT56:-RC4+RSA:+HIGH:+MEDIUM:-EXP;
ssl_session_timeout 10m;
ssl_trusted_certificate /etc/letsencrypt/live/moy-sayt.ru/fullchain.pem;

А в /etc/nginx/nginx.conf следующие строки
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 5m;
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;

Таким образом стэплинг будет переведён на наш север.
Проверяем конфигурацию Nginx
nginx -t

Безопасный перезапуск сервера
nginx -s reload

Если с такой конфигурацией только андроид ругается на сертификат (у меня был такой случай), то необходимо настройки изменить.
ssl_certificate /etc/letsencrypt/live/moy-sayt.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/moy-sayt.ru/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ALL:!ADH:!EXPORT56:-RC4+RSA:+HIGH:+MEDIUM:-EXP;
ssl_session_timeout 10m;
ssl_trusted_certificate /etc/letsencrypt/live/moy-sayt.ru/chain.pem;

Срок генерации сертификата составляет 90 дней. Но можно через cron каждые 90 дней запускать команду для обновления сертификата и ключа шифрования. Всё делается полностью автоматически и nginx перенастраивать уже не нужно.

Предварительно проверяем работает ли автоматическое обновление.

./certbot-auto renew --dry-run

Если всё исправно работает, то мы будем запускать перегенерацию каждые 2 месяца, так как если запускать каждые 3 месяца, то из-за месяцев длящихся 31 день, наш сертификат просрочится и нужно будет 2 дня ждать, пока он продлится. Для этого помещаем команду ./certbot-auto renew —quiet в файл /var/spool/cron/root

0 3 1 */2 * cd /путь-до-нашего-скрипта && ./certbot-auto renew --quiet && nginx -s reload

Эта команда означает, что первого числа, каждого чётного месяца в 0 минут 3 часа ночи будет запускаться скрипт, который будет обновлять сертификат и ключ шифрования, а после безопасно перегружать Nginx