Predvoditelev.RU
Заметки

Настройка SSL-сертификатов Let's Encrypt в Angie

Веб-сервер 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;
    }
}

При написании статьи использовалось следующее ПО:

  • Angie 1.8.0
  • Docker 27.4.1
@sergei_predvoditelev — Авторский канал в Telegram: заметки о веб-разработке, PHP, открытом ПО, развитии и немного о жизни.