В этой статье опишу небольшую инструкцию для установки сертификата с помощью acme.sh на базе алгоритма ECDSA P-384, этот алгоритм имеет высокий уровень быстродействия и защищенности. Например 256 битный ECDSA соответствует 3072 битному RSA по степени защиты, но при этом скорость работы в несколько раз выше.
Установка acme.sh
curl https://get.acme.sh | sh
Получение сертификата
Метод 1 : использование одной и той же директории для всех acme challenge запросов
Первоначально нам необходимо создать файл acme.conf в директории /etc/nginx/common/ со следующим содержанием:
location /.well-known/acme-challenge/ { alias /var/www/html/.well-known/acme-challenge/; }
После этого установим пользователя www-data (или вашего) владельцем директории /var/www/html :
chown -R www-data:www-data /var/www/html
Последним шагом нам нужно включить acme.conf в вашу конфигурацию виртуального хоста nginx, добавлением следующей строки :
include common/acme.conf;
Перечитываем конфигурацию nginx командой service nginx reload
и уже сейчас вы можете получить свой первый сертификат с помощью acme.sh :
# ECDSA Certificates (384 Bits)
acme.sh --issue -d yourdomain.tld -d www.yourdomain.tld -d blog.yourdomain.tld --keylength ec-384 -w /var/www/html
Метод 2 : используем Cloudflare DNS API
Настраиваем ваши API ключи
export CF_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export CF_Email="you-email@your-domain.com"
# ECDSA Certificates (384 Bits)
acme.sh --issue -d yourdomain.tld -d www.yourdomain.tld -d blog.yourdomain.tld --keylength ec-384 --dns dns_cf
Устанавливаем SSL сертификат в Nginx
НЕ ИСПОЛЬЗУЙТЕ сертификаты в директории ~/.acme.sh/ , они только для служебного использования, структура директории может измениться в будущем.
Создайте директорию для хранения ваших сертификатов в продакшене.
mkdir -p /etc/nginx/acme.sh/yourdomain.tld
После этого используйте команду –install-cert что бы скопировать ваши сертификаты с помощью acme.sh :
# for ECDSA certs
acme.sh --install-cert -d yourdomain.tld --ecc \
--cert-file /etc/nginx/acme.sh/yourdomain.tld/cert.pem \
--key-file /etc/nginx/acme.sh/yourdomain.tld/key.pem \
--fullchain-file /etc/nginx/acme.sh/yourdomain.tld/fullchain.pem \
--reloadcmd "systemctl reload nginx.service"
При каждом обновлении сертификатов, они будут копироваться в эту папку и будет производиться перезапуск nginx.
Сейчас вам осталось лишь добавить сертификаты в вашу конфигурацию nginx.
Создайте два файла, первый для добавления SSL сертификата со следующим содержимым :
# /var/www/yourdomain.tld/conf/nginx/ssl.conf
listen 443 ssl http2;
listen [::]:443 ssl http2;
ssl_certificate /etc/nginx/acme.sh/yourdomain.tld/fullchain.pem;
ssl_certificate_key /etc/nginx/acme.sh/yourdomain.tld/key.pem;
ssl_trusted_certificate /etc/nginx/acme.sh/yourdomain.tld/cert.pem;
И второй для редиректа с http на https :
# /etc/nginx/conf.d/forcessl-yourdomain-tld.conf
server {
listen 80;
listen [::]:80;
server_name www.yourdomain.tld yourdomain.tld;
return 301 https://yourdomain.tld$request_uri;
}
Для получение А+ в тесте ssllabs.com я включаю файл /etc/nginx/ssl.conf в конфигурацию каждого домена
ssl_session_cache shared:SSL:60m;
ssl_session_timeout 1d;
ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH:+AES256:-3DES:RSA+AES:RSA+3DES:!NULL:!RC4';
add_header Strict-Transport-Security "max-age=15768000";
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff" always;
Обновление сертификатов
Все сертификаты будут обновлены автоматически каждые 60 дней. Но вы можете выполнить принудительное обновление командами :
# RSA certs
acme.sh --renew -d example.com --force
# ECDSA certs
acme.sh --renew -d example.com --force --ecc
Ответы на вопросы:
В данной статье описан вариант, когда dhparam не нужен, так как это новый алгоритм работы ssl. Детали есть в документации:
http://nginx.org/ru/docs/http/ngx_http_ssl_module.html#ssl_trusted_certificate
«Задаёт файл с доверенными сертификатами CA в формате PEM, которые используются для проверки клиентских сертификатов и ответов OCSP, если включён ssl_stapling.
В отличие от ssl_client_certificate, список этих сертификатов не будет отправляться клиентам.»
Если у вас остались дополнительные вопросы, пишите в комментариях, попробуем обсудить.
И помните что не один мануал не опишет всё в точности как требуется вам. Применяйте смекалку.