Настройка ACME для получения сертификатов в Angie (+Maddy)

Angie

Этот мануал написан на основе другого мануала.
Только я Docker’ом не пользуюсь, только bare-metal, только хардкор.

Для тех кто в танке - Angie это форк nginx. Историю появления ищите сами.

Што ш, начнём.

Для начала, в конфиге Angie в конце блока http добавляем следующие строчки:

    acme_client letsencrypt https://acme-v02.api.letsencrypt.org/directory;  
    resolver 192.168.50.185;
    
    map $acme_cert_letsencrypt $cert_letsencrypt {  
        ''       /etc/angie/ssl-self-signed/cert.pem;  
        default  $acme_cert_letsencrypt;  
    }  
    
    map $acme_cert_letsencrypt $cert_key_letsencrypt {  
        ''       /etc/angie/ssl-self-signed/key.pem;  
        default  $acme_cert_key_letsencrypt;  
    }

Где 192.168.50.185 это DNS сервер. Вы ставьте свой, например Quad9, 9.9.9.9.
То есть, по итогу у нас должно получиться вот так:

http {

    # здесь будут другие параметры 

    acme_client letsencrypt https://acme-v02.api.letsencrypt.org/directory;  
    resolver 192.168.50.185;
    
    map $acme_cert_letsencrypt $cert_letsencrypt {  
        ''       /etc/angie/ssl-self-signed/cert.pem;  
        default  $acme_cert_letsencrypt;  
    }  
    
    map $acme_cert_letsencrypt $cert_key_letsencrypt {  
        ''       /etc/angie/ssl-self-signed/key.pem;  
        default  $acme_cert_key_letsencrypt;  
    }
}

Теперь делаем самоподписанный ключ для того, чтобы он потом заменился на полученный сертификат:

Для этого делаем папку /etc/angie/ssl-self-signed, см. блок выше и создаём ключ:

mkdir /etc/angie/ssl-self-signed
cd /etc/angie/ssl-self-signed
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -sha256 -days 3650 -nodes -subj "/C=RU/O=MyCompany/CN=MyProject"

Вместо того, чтобы каждый раз в новых конфигах не прописывать необходимые строки для получения сертификата, я сделал мини-конфиг, который я добавляю одной строчкой.

Сам конфиг должен располагаться в /etc/angie/includes, я его назвал ssl.conf

listen 443 ssl;
acme letsencrypt;
ssl_certificate $acme_cert_letsencrypt;
ssl_certificate_key $acme_cert_key_letsencrypt;

Помимо этого я сделал ещё один мини-конфиг, чтобы Angie принудительно HTTP запросы переводил в HTTPS, назвал 301.conf

return 301 https://$host$request_uri;

И эти мини-конфиги я добавляю в конфиг сайта строчкой

include includes/ssl.conf # ну или другое имя после includes/

Среднестатистический конфиг Angie для сайта будет выглядеть приблизительно так:
(как пример взял конфиг от Elk)

server {
	server_name elk.sadium.cyou;

	gzip            on;
    gzip_types      text/plain application/xml text/css application/javascript;
    gzip_min_length 1000;

	location / {
		proxy_pass http://localhost:5050;

        proxy_redirect              off;
        proxy_read_timeout          1m;
        proxy_connect_timeout       1m;
		
        include includes/headers.conf;
        
    }
	
	include includes/errors.conf;
	include includes/ssl.conf;

}

server {

	include includes/301.conf;
	server_name elk.sadium.cyou;

}

Проверяем, что всё ок командой

angie -t

А если не ок, то чиним, пока не избавимся от ошибок 🙃

angie: the configuration file /etc/angie/angie.conf syntax is ok
angie: configuration file /etc/angie/angie.conf test is successful

Пару раз поперезагружайте страничку, сначала будет ругаться, но через полминуты где-то сертификат таки получит.

Сертификаты будут лежать по пути /var/lib/angie/acme/letsencrypt.

Maddy

Поскольку у меня есть почтовый сервер на базе Maddy, в его конфиге нужно заменить строчку

tls file /etc/letsencrypt/live/$(primary_domain)/fullchain.pem /etc/letsencrypt/live/$(primary_domain)/privkey.pem

на

tls file /var/lib/angie/acme/letsencrypt/certificate.pem /var/lib/angie/acme/letsencrypt/private.key

и дать Maddy доступ к сертификатам

sudo setfacl -m u:maddy:rX /var/lib/angie/acme/letsencrypt/certificate.pem

и

sudo setfacl -m u:maddy:rX /var/lib/angie/acme/letsencrypt/private.key

и всё должно заработать.

!ВАЖНО! Обновление сертификатов ещё не происходило. Не знаю чо будет 🙃, но если всё упадёт, будет смищно.
Уберу эти строки через несколько месяцев, если всё пройдёт хорошо.