В этой статье опишу небольшую инструкцию для установки сертификата с помощью acme.sh на базе алгоритма ECDSA P-384, этот алгоритм имеет высокий уровень быстродействия и защищенности. Например 256 битный ECDSA соответствует 3072 битному RSA по степени защиты, но при этом скорость работы в несколько раз выше.

Установка acme.sh

1
curl https://get.acme.sh | sh

Получение сертификата

Метод 1 : использование одной и той же директории для всех acme challenge запросов

Первоначально нам необходимо создать файл acme.conf в директории /etc/nginx/common/ со следующим содержанием:

1
location /.well-known/acme-challenge/ { alias /var/www/html/.well-known/acme-challenge/; }

После этого установим пользователя www-data (или вашего) владельцем директории /var/www/html :

1
chown -R www-data:www-data /var/www/html

Последним шагом нам нужно включить acme.conf в вашу конфигурацию виртуального хоста nginx, добавлением следующей строки :

1
include common/acme.conf;

Перечитываем конфигурацию nginx командой service nginx reload и уже сейчас вы можете получить свой первый сертификат с помощью acme.sh:

ECDSA Certificates (384 Bits)

1
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 ключи

1
2
export CF_Key="sdfsdfsdfljlbjkljlkjsdfoiwje" 
export CF_Email="you-email@your-domain.com"

ECDSA Certificates (384 Bits)

1
acme.sh --issue -d yourdomain.tld -d www.yourdomain.tld -d blog.yourdomain.tld --keylength ec-384 --dns  dns_cf

Устанавливаем SSL сертификат в Nginx

НЕ ИСПОЛЬЗУЙТЕ сертификаты в директории ~/.acme.sh/, они только для служебного использования, структура директории может измениться в будущем. Создайте директорию для хранения ваших сертификатов в продакшене.

1
mkdir -p /etc/nginx/acme.sh/yourdomain.tld

После этого используйте команду –install-cert что бы скопировать ваши сертификаты с помощью acme.sh :

for ECDSA certs

1
2
3
4
5
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

1
2
3
4
5
6
    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

1
2
3
4
5
6
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 в конфигурацию каждого домена

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
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

1
acme.sh --renew -d example.com --force

ECDSA certs

1
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, список этих сертификатов не будет отправляться клиентам.»

Если у вас остались дополнительные вопросы, пишите в комментариях, попробуем обсудить.И помните что не один мануал не опишет всё в точности как требуется вам. Применяйте смекалку.