Веб-сервер Angie включает в себя модуль ACME, который позволяет автоматически получать SSL-сертификаты с использованием протокола ACME, а это значит, что можно настроить автоматическое получение бесплатных сертификатов Let's Encrypt.
Здесь описывается настройка через HTTP-проверку, но Angie также поддерживает DNS-проверку и проверку с помощью хуков (подробнее в статье Настройка ACME).
Для начала в модуле http прописываем ACME-клиент (см. сайт Let's Encrypt) и указываем IP-адрес DNS-резолвера (обычно это 127.0.0.53, но в докере используется адрес 127.0.0.11).
acme_client letsencrypt https://acme-v02.api.letsencrypt.org/directory;
resolver 127.0.0.11;Всю работу по получению сертификата Angie сделает автоматически. Полученный сертификат и соответствующий ключ будут доступны в конфигурации через переменные $acme_cert_<имя> и $acme_cert_key_<имя>. В нашем случае это будут:
$acme_cert_letsencrypt$acme_cert_key_letsencryptНа время, пока сертификаты не получены, будем использовать самоподписанные, которые можно сделать, например, такой командой:
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -sha256 -days 3650 -nodes -subj "/C=RU/O=MyCompany/CN=MyProject"В конфигурации создадим новые переменные. Если сертификат уже получен, то используем его, если нет — наши самоподписанные. Обратите внимание, что переменная $acme_cert_key_letsencrypt всегда будет не пустой, так как ключ создаётся на клиенте, поэтому в обоих случаях проверяем переменную $acme_cert_letsencrypt, она будет заполнена только после получения сертификата от Let's Encrypt.
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;
}Осталось только прописать конфигурацию в секции server:
listen 443 ssl;
server_name example.com www.example.com;
acme letsencrypt;
ssl_certificate $cert_letsencrypt;
ssl_certificate_key $cert_key_letsencrypt;Единый сертификат будут получен для всех доменных имён, перечисленных в директиве server_name. Директива acme указывает, какой ACME-клиент должен использоваться.
В итоге получаем вот такую конфигурацию:
http {
acme_client letsencrypt https://acme-v02.api.letsencrypt.org/directory;
resolver 127.0.0.11;
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;
}
server {
listen 443 ssl;
server_name example.com www.example.com;
acme letsencrypt;
ssl_certificate $cert_letsencrypt;
ssl_certificate_key $cert_key_letsencrypt;
}
}При написании статьи использовалось следующее ПО: