Let's Encrypt на Azure App Service — автоматизация SSL для веб‑приложений
- Этот материал показывает, как настроить бесплатные SSL‑сертификаты Let’s Encrypt для Azure App Service и автоматизировать их продление с помощью WebJobs и Service Principal.
- Ключевые шаги: создать Storage Account для WebJobs, зарегистрировать Service Principal в Azure AD, установить расширение Let’s Encrypt в App Service и настроить привязки сертификатов.
- Содержит контрольные списки, план действий, тесты приёмки и рекомендации по безопасности.

Быстрые ссылки
Что такое Let’s Encrypt?
Необходимые условия для настройки
Шаг 1: Storage Account для WebJobs
Шаг 2: Автоматизация через Service Principal
Шаг 3: Расширение Let’s Encrypt для App Service
Возможные проблемы и отладка
Что такое Let’s Encrypt?
Let’s Encrypt — это автоматизированный и бесплатный центр сертификации (Certificate Authority), который выдаёт SSL/TLS‑сертификаты, используемые для шифрования трафика HTTPS.
Ключевая особенность: сертификаты действуют 90 дней, поэтому автоматизация продления критична.
Определение: ACME — протокол автоматической выдачи и валидации у доменной зоны; HTTP‑01 — один из методов проверки владения доменом через размещение токена по HTTP.
Важно: короткий срок действия сертификата служит безопасности — он уменьшает риск компрометации ключей и стимулирует автоматическое обновление.
Необходимые условия для настройки
- Аккаунт Azure с правами создавать ресурсы (подписка).
- Веб‑приложение, размещённое в App Service (стек не имеет значения).
- Пользовательский DNS‑запись (CNAME/А) указывает на ваш Web App.
- Доступ по HTTP к корню домена: /.well‑known/acme‑challenge/ должен быть доступен для валидации.
Примечание: App Service и App Service Plan удобнее держать в одном Resource Group, но это не обязательно — в конфигурации можно указать разные группы.
Шаг 1: Storage Account для WebJobs
Создайте Storage Account в той же подписке. Важно: тип BlobStorage не подойдёт для WebJobs, используйте типы “Storage” или “StorageV2”.

После создания добавьте в App Service двe переменные приложения (Application Settings):
- AzureWebJobsDashboard
- AzureWebJobsStorage
Значением каждой переменной должна быть строка подключения к Storage Account. Пример строки:
DefaultEndpointsProtocol=https;AccountName=[youraccount];AccountKey=[yourkey];
Совет: храните строку подключения в секрете — используйте секреты Key Vault или защищённые переменные в CI/CD.
Шаг 2: Автоматизация через Service Principal
Для автоматического создания и привязки сертификатов расширению нужно право управлять ресурсами. Создайте Service Principal в нужной директории Azure AD и выдайте ему роль с правами на Resource Group.
Пошагово:
- В Azure Portal откройте Azure Active Directory → App registrations.
- Создайте новое приложение (регистрацию) и сохраните его Client ID.
- В разделе Certificates & secrets создайте Client secret и скопируйте значение сразу — позже его не показать в явном виде.

- Перейдите в Resource Group, где находятся App Service и/или Service Plan, и назначьте роль “Contributor” (Contributor — Участник) для созданного Service Principal.

Пояснение ролей: роль Contributor даёт возможность управлять ресурсами в Resource Group, но не даёт прав над подпиской (подписка остаётся под контролем владельца).
Совет: если вы хотите минимизировать привилегии, назначайте роль только на уровень конкретной Resource Group, а не на подписку.
Шаг 3: Расширение Let’s Encrypt для App Service
- В Azure Portal откройте ваш App Service и найдите в панели Site Extensions раздел “Advanced Tools” (Kudu). Обычно доступно по адресу: https://yourdomain.scm.azurewebsite.net.
- Нажмите “Site Extensions” → установите расширение Azure Let’s Encrypt (автор SJKP или аналог).
- Запустите расширение (Launch). На странице конфигурации заполните поля:
- Tenant: директория Azure AD (Tenant ID).
- ClientID: идентификатор приложения (Client ID).
- ClientSecret: секретный ключ, который вы сгенерировали.
- ResourceGroupName: имя Resource Group, где находится App Service.
- SubscriptionID: идентификатор подписки.
- Update Application Settings: установите True, иначе WebJobs не получат настроек.
- ServicePlanResourceGroupName: имя Resource Group, где размещён Service Plan (если отличается).
После заполнения появится обзор: Certificates, SSL Bindings и Custom Domains. Выберите домены и выполните Get Request для получения сертификатов.
Важно: укажите адрес электронной почты — LetsEncrypt использует его для уведомлений об ошибках и истечении сертификатов.
Возможные проблемы и способы их решения
Доступ к /.well‑known/acme‑challenge/ заблокирован.
- Проверьте web.config, маршрутизацию на уровне приложения и правила URL Rewrite.
- Убедитесь, что правило не перенаправляет HTTP → HTTPS для этой папки во время проверки.
Принудительный HTTPS в App Service.
- Временно отключите “HTTPS Only” в настройках App Service на время валидации или настройте исключение для пути /.well‑known.
Неправильные Application Settings.
- Убедитесь, что AzureWebJobsStorage и AzureWebJobsDashboard содержат корректную строку подключения и доступны для WebJobs.
Недостаточные права Service Principal.
- Проверьте, что Service Principal имеет роль Contributor в нужной Resource Group.
DNS не указывает на App Service.
- Убедитесь, что CNAME/A‑запись указывает на ваш Web App (или используйте IP‑адрес и проверку сопоставления имен).
Контрольный список перед запуском
- DNS‑запись настроена и видна по всему Интернету (проверка через dig/nslookup).
- App Service доступен по HTTP и возвращает 200 для /.well‑known/acme‑challenge/.
- Storage Account создан с типом Storage или StorageV2.
- Переменные AzureWebJobsStorage и AzureWebJobsDashboard добавлены и корректны.
- Service Principal зарегистрирован; ClientID и ClientSecret сохранены.
- Service Principal имеет роль Contributor на целевой Resource Group.
- Расширение Let’s Encrypt установлено и заполнены все поля конфигурации.
Мини‑методика: быстрый план действий
- Создать Storage Account (StorageV2).
- Добавить строки подключения в Application Settings (AzureWebJobsStorage, AzureWebJobsDashboard).
- Зарегистрировать приложение в Azure AD и создать Client Secret.
- Назначить рол на Resource Group (Contributor).
- Установить и настроить расширение Let’s Encrypt в Kudu.
- Запросить сертификат для перечисленных доменов и проверить SSL‑binding.
Ролевые контрольные списки
Для DevOps:
- Подготовить инфраструктуру: Storage Account, Resource Group.
- Проверить работоспособность WebJobs и доступность переменных окружения.
Для разработчика приложения:
- Убедиться, что маршрутизация и web.config не блокируют /.well‑known.
- Тестировать поведение при принудительном HTTPS на локальном окружении.
Для администратора безопасности:
- Контролировать доступ к Client Secret и строкам подключения.
- Настроить аудит действий Service Principal.
Критерии приёмки
- Сертификат выдан для домена и установлен в SSL Bindings.
- HTTPS-запросы к сайту проходят с валидным сертификатом (Brwoser доверяет панелью).
- Автоматическое продление срабатывает в течение цикла (WebJob успешно обновил сертификат при тестовом запуске).
- Логи расширения и WebJobs не содержат ошибок авторизации или доступа.
Тестовые случаи и проверка работоспособности
- Позитивный сценарий: после установки сертификата https://yourdomain/ доступен и выдаёт цепочку сертификатов Let’s Encrypt.
- Сценарий принудительного HTTPS: включить HTTPS Only и проверить, что валидация не ломается (при необходимости временно отключать и тестировать).
- Отказ прав: отозвать роль Service Principal и убедиться, что расширение выдаёт понятную ошибку об отсутствии прав.
- Тест обновления: вручную инициировать процесс продления и проверить, что WebJob успешно обновляет сертификат.
Альтернативные подходы и когда они лучше
- Azure App Service Managed Certificates (бесплатно, но с ограничениями): проще в настройке, но не поддерживает wildcard и не всегда покрывает все сценарии.
- Azure Key Vault + Azure Automation: если требуется централизованное хранение ключей и сложная политика ротации.
- Azure Front Door / Application Gateway: полезно, если вы хотите терминировать TLS на уровне CDN/балансировщика — можно использовать готовые сертификаты или интегрировать Let’s Encrypt на уровне бекенда.
Когда Let’s Encrypt может не подойти:
- Нужны сертификаты с длительным сроком действия и расширенной валидацией (EV) — в этом случае требуется коммерческий CA.
- Политика компании не разрешает автоматизированное хранение ключей или выдачу сертификатов внешним сервисам.
Принципы и эвристики
- “Автоматизируй повторяющееся” — автоматическое продление сертификатов устраняет человеческие ошибки.
- “Минимизируй привилегии” — присваивайте Service Principal только те права, которые нужны.
- “Логируй и оповещай” — настраивайте оповещения по почте/в системе мониторинга о неудачных продлениях.
Факто‑бокс: ключевые числа
- Срок действия сертификата Let’s Encrypt: 90 дней.
- Поддерживаемые ACME‑методы: HTTP‑01, DNS‑01 (в зависимости от инструмента).
- Рекомендованный интервал продления: запускать процесс обновления каждые 30–60 дней для запасного времени.
SOP: пошаговый playbook для восстановления/ручного обновления
- Проверить логи расширения в Kudu (site extensions) и логи WebJobs.
- Проверить, что строки подключения к Storage в Application Settings корректны.
- Убедиться в доступности /.well‑known/acme‑challenge/ по HTTP.
- Если ClientSecret устарел — создать новый секрет в App Registration и обновить значение в расширении.
- Повторно инициировать выдачу сертификата через интерфейс расширения.
Жёсткие требования по безопасности
- Храните ClientSecret и строки подключения в Azure Key Vault или защищённых переменных CI.
- Ограничивайте доступ к Resource Group и аудитируйте назначения ролей.
- Обновляйте расширение и WebJobs, чтобы закрыть известные уязвимости.
Примечания по приватности и соответствию (GDPR)
Let’s Encrypt не собирает контент ваших сайтов, но при регистрации вы можете указывать контактный email — убедитесь, что адрес и уведомления соответствуют вашей политике обработки персональных данных. Логи выдачи сертификатов могут содержать доменные имена — храните эти логи в защищённом хранилище.
Частые ошибки и способы их устранения
- Ошибка: “Challenge failed” — проверьте HTTP‑доступ к /.well‑known, отключите редиректы и правила, которые изменяют путь.
- Ошибка: “Insufficient permissions” — проверьте роль Service Principal и область назначения (Scope).
- Ошибка: “Storage connection failed” — проверьте правильность строки подключения и состояние Storage Account.
Короткая проверочная процедура после настройки
- Откройте https://вашдомен/ и проверьте сертификат в браузере (кто выдал, срок действия).
- Выполните curl -I https://вашдомен/ и проверьте пример ответа и цепочку сертификатов.
- Проверить логи WebJobs после плановой попытки обновления (можно инициировать вручную).
Социальные превью и анонсы
OG title: Let’s Encrypt на Azure App Service — автоматизация SSL
OG description: Быстрая инструкция по установке и автоматизации бесплатных SSL‑сертификатов Let’s Encrypt для Azure App Service.
Короткий анонс (100–200 слов):
Настройка SSL для Azure App Service с помощью Let’s Encrypt — это бесплатный, безопасный и хорошо автоматизируемый способ обеспечить HTTPS для ваших веб‑приложений. В инструкции описаны все шаги: создание Storage Account для WebJobs, регистрация Service Principal в Azure AD, установка расширения Let’s Encrypt и проверочные процедуры. Включены чеклисты, критерии приёмки и подсказки по отладке. После следования этому руководству ваш сайт будет автоматически получать и продлевать сертификаты, а вы — получать уведомления о возможных проблемах.
Итог
Let’s Encrypt даёт надёжный путь к бесплатным сертификатам, но правильно настроенная автоматизация — обязательна из‑за короткого срока действия сертификатов. Используйте описанные шаги, контрольные списки и процедуры отката, чтобы обеспечить бесперебойную работу HTTPS для ваших приложений в Azure.
Важное: перед массовым развёртыванием протестируйте процесс на тестовом домене и убедитесь, что уведомления о неудачных продлениях приходят ответственным лицам.
Похожие материалы
Троян Herodotus: как он работает и как защититься
Включить новое меню «Пуск» в Windows 11
Панель полей сводной таблицы в Excel — руководство
Включить новое меню «Пуск» в Windows 11
Дубликаты Диспетчера задач в Windows 11 — как исправить