Веб-сервер 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;
}
}
При написании статьи использовалось следующее ПО: