Все переходят на SSL. Но порой платить деньги за то, чтобы пощупать не хочется. Очень смешно, но таковы реалии. Люди не могут понять, почему стоимость файлика часто превышает стоимость сервера. Ну да ладно. Приступим лучше к настройке NGINX с сертификатом, который мы получим бесплатно!!!
Есть такой сервис, как letencrypt. Он выдает сертификаты для домена. Пока Wildcard Certificates не выдаются. Но не печаль. В планах на январь 2018 добавить эту возможность. Важное ограничение – выдаются такие сертификаты на 90 дней. После надо либо перезаказать, либо отказаться. Для продления, есть API, как и для заказа. Хотя можно работать и с не валидным. Но тогда зачем напрягаться, ведь можно пользоваться самоподписанным?
Так, вроде бы все обсудили. Ах, нет. Будем все производить на CentOS 6.9. Версия NGINX в данном случае не сильно играет роль, да и вообще, может стоять Apache.
Приступим.
- Для начала, нам нужно взять последнюю версию letencrypt. Идем на гитхаб и клонируем репу.
cd /usr/local git clone https://github.com/letsencrypt/letsencrypt
- Открываем порт на фаерволе. Лучше сразу.
- Останавливаем NGINX/Apache
- Переходим в директорию letsencrypt
cd /usr/local/letsencrypt
- Генерируем сертификаты
./letsencrypt-auto certonly --standalone -d your_domain.ua -d www.your_domain.ua
Или только для одного
./letsencrypt-auto certonly --standalone -d your_domain.ua
При первом запуске установятся необходимые пакеты. Надо будет указать email и ответить на вопрос, желаете ли Вы поделится своими данными. После если все ОК, то будет сформирован сертификат и поздравление:
Performing the following challenges: tls-sni-01 challenge for your_domain.ua Waiting for verification... Cleaning up challenges IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/your_domain.ua/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/your_domain.ua/privkey.pem Your cert will expire on 2018-01-11. To obtain a new or tweaked version of this certificate in the future, simply run letsencrypt-auto again. To non-interactively renew *all* of your certificates, run "letsencrypt-auto renew" - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Тут указаны пути, куда сохранились сертификаты и прочая инфа. Полезно, так что прочитайте.
Если все же выдало ошибку, проверьте, может что-то блокирует 80 порт.
- Что бы получить оценку A+ нужно будет сгенерировать новый DH (Diffie-Hellman cipher) key. Если Вы параноик, а большинство просто делают из принципа – больше, не хуже, то генерируем ключ в 4096 бит.
mkdir /etc/nginx/ssl cd /etc/nginx/ssl openssl dhparam -out dhparams.pem 4096
- Теперь у нас есть все, для работы сайта по https. Добавляем в конфиг NGINX:
listen 443 ssl default_server; ssl_certificate /etc/letsencrypt/live/your_domain.ua/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your_domain.ua/privkey.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH'; ssl_dhparam /etc/nginx/ssl/dhparams.pem; ssl_session_timeout 30m; ssl_session_cache shared:SSL:10m; ssl_buffer_size 8k; add_header Strict-Transport-Security max-age=31536000;
- Запускаем NGINX, заходим на сайт по HTTPS и радуемся. Конечно это еще не все. Я долго не буду рассказывать о том, как перекидывать с http на https. Но покажу свой скрипт обновления сертификата. Он не идеален, но на первое время мне его хватает. А как говорится, нет ничего более постоянного, чем что-то временное.
Обновление происходит этой командой
letsencrypt-auto certonly -a webroot --agree-tos --renew-by-default --webroot-path="web_site_path" -d "domain"
Для тех кто не понял:
—webroot-path – путь к webroot заданный в настройках nginx
-d – имя домена your_domain.ua
Для самого скрипта потребуется bc, которая входит в состав CentOS и является калькулятором. Нужно для того, чтобы не мучать сервис letsencrypt.
#!/bin/bash webpath='/var/www/site_1/' domain=$1 le_path='/usr/local/letsencrypt' le_conf='/etc/letsencrypt' exp_limit=30; if [ -z "$domain" ] ; then echo -e "You must provide the domain name for the certificate renewal.\t[\\033[1;31mERROR\\033[0;39m]" exit 1; fi cert_file="/etc/letsencrypt/live/$domain/fullchain.pem" if [ ! -f $cert_file ]; then echo "[ERROR] certificate file not found for domain $domain." exit 1; fi exp=$(date -d "`openssl x509 -in $cert_file -text -noout|grep "Not After"|cut -c 25-`" +%s) datenow=$(date -d "now" +%s) days_exp=$(echo \( $exp - $datenow \) / 86400 |bc) echo "Checking expiration date for $domain..." if [ "$days_exp" -gt "$exp_limit" ] ; then echo "The certificate is up to date, no need for renewal ($days_exp days left)." exit 0; else echo "The certificate for $domain is about to expire soon. Starting renewal request..." "$le_path"/letsencrypt-auto certonly -a webroot --agree-tos --renew-by-default --webroot-path="$webpath" -d "${domain}" echo "Reloading Nginx..." sudo service nginx reload echo "Renewal process finished for domain $domain" exit 0; fi
После прописываем в крон, на запуск каждую неделю и все.
@weekly /usr/local/bin/lets-cert-renew your_domain.ua >> /var/log/ your_domain.ua 2>&1
Нужна помощь в настройке SSL для домена? Обращайтесь [email protected]