5 1 1 1 1 1 Rating 5.00 (1 Vote)

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

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