Обновление сертификата пользовательского домена Azure CDN из сценария

#azure #azure-powershell #azure-cli #azure-cdn

#azure #azure-powershell #azure-cli #azure-cdn

Вопрос:

Как запустить Azure CDN для чтения последней версии пользовательского сертификата из хранилища ключей без простоев?

Моя настройка CDN работает нормально, но, учитывая Let’s Encrypt, сертификат недолговечен и требует автоматизации для обновлений. az keyvault certificate import В командной строке Azure достаточно просто обновить сертификат в хранилище ключей, но что дальше? Как сообщить Azure CDN начать использовать новую версию сертификата?

Неудачные попытки

  • Ожидание в течение пары часов. Ничего не произошло.
  • Выполняется az cdn custom-domain enable-https в домене, в котором уже включен HTTPS. Результат: внутренняя неправильная настройка и несколько часов простоя, чтобы сначала отключить пользовательский домен, а затем включить его. Однако сертификат был обновлен.

С портала Azure

Во всплывающей подсказке портала Azure для версии сертификата пользовательского домена говорится: «Выберите версию сертификата, который вы хотите использовать. По умолчанию мы будем использовать последнюю версию «. Это верно при создании конечной точки, но как начать использовать последнюю версию? Последняя версия уже выбрана из выпадающего списка, но я выбрал предыдущую версию и выбрал последнюю версию. Выполнение этого позволило «Сохранить».

Сохранение формы привело к обновлению сертификата без простоев. Приятно, но, учитывая автоматизацию и сценарии, это не совсем правильный путь.

Вещи, которые могут помочь, но я еще не тестировал

  • Применение ARM-шаблона CDN-setup
  • В Powershell Az.Cdn есть Start-AzCdnEndpoint / Stop-AzCdnEndpoint cmdlets . Может быть полезно, но 100% гарантия простоя.

Есть ли что-нибудь, что я могу попробовать в следующем цикле обновления?

Комментарии:

1. Существует запрос на функцию, позволяющую Azure CDN автоматически использовать последнюю версию сертификата . Нет сведений о том, будет ли / когда это будет реализовано.

2. Похоже, это было реализовано: docs.microsoft.com/en-us/azure/cdn /… github.com/MicrosoftDocs/azure-docs/commit/… «Для того, чтобы сертификат автоматически обновлялся до последней версии …»

Ответ №1:

Начиная с 2021-04-05, Azure CDN можно указать использовать «последнюю» версию определенного сертификата KeyVault. Я не нашел никаких новостей об этом изменении, но оно было добавлено в документацию с помощью этого коммита.

Для автоматического обновления сертификата до последней версии, когда в вашем хранилище ключей доступна более новая версия сертификата, пожалуйста, установите для версии сертификата / секретной версии значение «Последняя». Если выбрана определенная версия, необходимо повторно выбрать новую версию вручную для ротации сертификата. Для развертывания новой версии сертификата / секрета требуется до 24 часов.

На портале это можно сделать, выбрав опцию «Последняя» в раскрывающемся списке «Сертификат / секретная версия». С помощью командной строки Azure это можно сделать с помощью:

 az cdn custom-domain enable-https 
    --resource-group "$cdnResourceGroupName" 
    --profile-name "$cdnProfileName" 
    --endpoint-name "$cdnEndpointName" 
    --name "$cdnCustomDomainName" 
    --user-cert-subscription-id "$subscriptionId" 
    --user-cert-group-name "$keyVaultResourceGroupName" 
    --user-cert-vault-name "$keyVaultName" 
    --user-cert-secret-name "$secretName" 
    --user-cert-protocol-type 'sni'
 

Обратите внимание, что эта команда не устанавливает --user-cert-secret-version параметр, который позволяет выбрать «последнюю» функциональность.

Для тех, кто хочет сделать это вручную, старый ответ о том, как сделать это вручную, приведен ниже.


Выполняется az cdn custom-domain enable-https в домене, в котором уже включен HTTPS. Результат: внутренняя неправильная настройка и несколько часов простоя, чтобы сначала отключить пользовательский домен, а затем включить его.

Начиная с 2021-04-05, это можно сделать с помощью командной строки Azure с:

 az cdn custom-domain enable-https 
    --resource-group "$cdnResourceGroupName" 
    --profile-name "$cdnProfileName" 
    --endpoint-name "$cdnEndpointName" 
    --name "$cdnCustomDomainName" 
    --user-cert-subscription-id "$subscriptionId" 
    --user-cert-group-name "$keyVaultResourceGroupName" 
    --user-cert-vault-name "$keyVaultName" 
    --user-cert-secret-name "$secretName" 
    --user-cert-secret-version "$secretVersion" 
    --user-cert-protocol-type 'sni'
 

(Когда этот ответ был первоначально написан в мае 2019 года, Azure CLI задокументировал --custom-domain-https-parameters параметр, который подразумевал, что его можно использовать для этой цели. Если параметр не был указан, CLI запустит рабочий процесс сертификации, управляемый CDN (сертификат, выданный DigiCert). Однако никогда не было должным образом задокументировано, как на самом деле использовать этот параметр. По состоянию на март 2021 года этот параметр снова был удален из командной строки. Наконец, по состоянию на апрель 2021 года --user-cert-* параметры были добавлены.)

Аналогичная функция была добавлена в марте 2019 года в .Net SDK,. Таким образом, пакет Nuget должен позволять вам использовать сертификаты, управляемые пользователем.

По состоянию на апрель 2021 года командлет Azure PowerShell Enable-AzCdnCustomDomainHttps по-прежнему не поддерживает сертификаты, управляемые пользователями, а только сертификаты, управляемые CDN.

Или вы можете использовать REST API напрямую, как описано здесь .Создайте POST запрос https://management.azure.com/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Cdn/profiles/$cdnProfileName/endpoints/$cdnEndpointName/customDomains/$cdnCustomDomainName/enableCustomHttps?api-version=2018-04-02 с application/json телом, которое выглядит как

 {
    "certificateSource": "AzureKeyVault",
    "certificateSourceParameters": {
        "@odata.type": "#Microsoft.Azure.Cdn.Models.KeyVaultCertificateSourceParameters",
        "deleteRule": "NoAction",
        "resourceGroupName": "$resourceGroupName",
        "secretName": "$secretName",
        "secretVersion": "$secretVersion",
        "subscriptionId": "$subscriptionId",
        "updateRule": "NoAction",
        "vaultName": "$keyVaultName"
    },
    "protocolType": "ServerNameIndication"
}
 

$resourceGroupName и $keyVaultName определите ошибку ключа. $secretName и $secretVersion определите сертификат. (Пусть вас не смущает, если портал не показывает никаких секретов в вашем KeyVau< сертификат KeyVault с закрытым ключом неявно является секретом KeyVault с тем же именем и версией.)

Эта конечная точка API соответствует стандартной семантике REST, поскольку она возвращает HTTP 202 Accepted , поскольку это длительная асинхронная операция. Он установит Location заголовок в ответе, и вы должны GET повторно использовать этот URL-адрес, пока он не будет преобразован в код состояния успеха или сбоя.

Обратите внимание, что портал также использует REST API, поэтому вы всегда можете получить это, просто выполнив шаги в пользовательском интерфейсе портала и проверив сетевые запросы в инструментах разработчика вашего браузера. Однако вам нужно будет получить свой собственный токен oauth2 (создав SP).


В сторону: чтобы сэкономить людям время, которое мне потребовалось, чтобы обнаружить это при попытке сделать это для моего собственного домена, не обманывайтесь документацией или примером в репозитории спецификаций Azure Rest API. Они подразумевают 2017-10-12 поддержку версии API customHttpsParameters , но на самом деле 2018-04-02 ее поддерживают только и более новые версии. Если вы используете 2017-10-12 then, параметр автоматически игнорируется, и он попытается использовать рабочий процесс автоматического подтверждения Digicert.

Комментарии:

1. Я использовал версию api 2017-10-12, и она отлично работает! Это та же версия, которая используется порталом

2. @DiegoMendes 2017-10-12 не будет работать, если вы не хотите использовать сертификаты, предоставленные DigiCert, как я написал в ответе. И нет, портал не использует 2017-10-12. На данный момент он использует 2019-04-15

3. В настоящее время я использую using 2017-10-12, и я могу гарантировать, что это работает! Когда я проверял портал, он также использовал ту же версию

4. @DiegoMendes Опять же, вопрос заключается в использовании вашего собственного сертификата, а не в автоматическом рабочем процессе Digicert. Пользовательский сертификат не работает с 2017-10-12. И снова портал использует 2019-04-15. Вот доказательство: i.imgur.com/XpB3kP2.png

5. Я использую свой собственный сертификат, хотите верьте, хотите нет, он работает! Домен, который вы показали, предназначен для получения пользовательского домена, а не для настройки сертификатов https, правильная конечная точка: POST $subscriptionId/resourcegroups/$resourceGroupName/providers/Microsoft.Cdn/profiles/$cdnProfileName/endpoints/$cdnEndpointName/customdomains/$cdnCustomDomainName/enableCustomHttps?api-version=2017-10-12"

Ответ №2:

Как было предложено @Arnavion, вызов REST API пользовательского домена Azure CDN можно использовать для запуска обновления сертификата, используемого существующим пользовательским доменом в Azure CDN. Предлагаемые документы API находятся по адресу https://docs.microsoft.com/en-us/rest/api/cdn/customdomains/enablecustomhttps . При объединении приведенного выше примера со справочной информацией API можно создать подходящий запрос с помощью PowerShell 6 Invoke-RestMethod . В случае успеха CDN начнет обновление сертификата из хранилища ключей до конечных точек через несколько минут.

В операции нет никаких хитростей. Все, что необходимо, это собрать все необходимые пять параметров для UserManagedHttpsParameters, требуемых API, чтобы указать точный пользовательский домен в CDN и точно указать сертификат X.509 в хранилище ключей. Также необходимо объединить параметры с допустимым токеном предъявителя, а затем выполнить упомянутый вызов API, чтобы сообщить CDN о получении нового сертификата из хранилища ключей и его развертывании на всех конечных точках CDN.

Мой скрипт, выполняющий все это, доступен по адресу https://gist.github.com/HQJaTu/c5695626ba51c6194845fa60913e911b

Как вы получаете новый сертификат в хранилище ключей — это еще одно обсуждение, и мой сценарий не будет касаться этого. Однако загрузить новую версию сертификата намного проще, чем запускать обновление CDN.

Ответ №3:

На данный момент документация для Azure CLI по-прежнему не дает ответа, как это сделать. Я написал некоторый скрипт на Python, чтобы сделать это как часть acme.sh обновить-крюк. В основном это работает для пользовательского домена apex, но вы можете использовать его с поддоменами. Вы можете найти его на github -> https://github.com/przemika/azure-byoc-for-custom-domain