Моя конечная цель - автоматизировать этот процесс в скрипте Python, поэтому я сначала ознакомлюсь с необходимым рабочим процессом на портале Azure.
Шаг 1 - создать сертификат службы приложений. В коде мой звонок:
https://management.azure.com/subscriptions/aaaa-bbbb-cccc-dddd/resourceGroups/my-rg/providers/Microsoft.CertificateRegistration/certificateOrders/my-cert-order?api-version=2015-08-01
с полезной нагрузкой:
{
"location": "global",
"properties": {
"productType": "StandardDomainValidatedSsl",
"autoRenew": true,
"distinguishedName":"CN=mydomain.com"
}
}
Шаг 2 - связать его с определенным набором ключей. Опять же, в коде вызов:
https://management.azure.com/subscriptions/aaaa-bbbb-cccc-dddd/resourceGroups/my-rg/providers/Microsoft.CertificateRegistration/certificateOrders/my-cert-order/certificates/my-cert?api-version=2015-08-01
с полезной нагрузкой
{
"location":"global",
"properties": {
"keyVaultId":"/subscriptions/aaaa-bbbb-cccc-dddd/resourceGroups/my-rg/providers/Microsoft.KeyVault/vaults/my-keyvault",
"keyVaultSecretName":"my-secret-name"
}
}
Шаг 3 - проверить домен, связанный с только что созданным сертификатом. В инструкциях на портале говорится о создании записи TXT в корне моего домена с использованием предоставленного токена подтверждения домена. Я сделал это, но Azure что-то не нравится, так как он никогда не сообщает о проверке сертификата, даже через несколько часов. Я попытался выполнить ручной поиск созданной записи TXT, и теперь она определенно доступна, поэтому я не думаю, что это то, на что жалуется Azure.
Я знаю, что вызов REST, используемый порталом, является владельцем домена-проверки, как описано здесь:
https://docs.microsoft.com/en-us/rest/api/appservice/appservicecertificateorders/verifydomainownership
Я попытался сделать этот вызов явно в коде, и я вижу, что он возвращает ошибку 400, а также следующий BLSON-объект JSON:
{
"Code": "CertificateResellerWebService_NOT_FOUND_TOKEN",
"Message": "All remaining domain control tokens were not found",
"Target": null,
"Details": [
{
"Message": "All remaining domain control tokens were not found"
},
{
"Code": "CertificateResellerWebService_NOT_FOUND_TOKEN"
},
{
"ErrorEntity": null
}
],
"Innererror": null
}
Является ли токен управления доменом, на который он жалуется, таким же, как токен подтверждения домена? В любом случае, вызов постоянно терпит неудачу с этой же ошибкой. Мне неясно, что является причиной этой проблемы. Любые предложения будут оценены.
Обновление: это основной алгоритм, который я использую для процесса:
token = get_auth_token()
# First, put in a certificate request
cert_order = create_cert_order(token, CERT_NAME)
while cert_order.status_code == 201:
cert_order = get_cert_order(token, CERT_NAME)
cert_order = cert_order.json()
# Then assign it to a specific key vault
cert = update_cert(token, CERT_NAME, KEY_VAULT_ID, KEY_VAULT_SECRET_NAME)
while cert.status_code == 201:
cert = get_cert(token, CERT_NAME)
# Next, create a TXT entry in the root domain matching the
# domain verification token and wait for that record to be
# discoverable by nslookup.
domain_verification_token = cert_order["properties"]["domainVerificationToken"]
create_txt_record(domain_verification_token)
waitfor_txt_record(domain_verification_token)
# Finally, ask to have to domain ownersip verified.
response = verify_domain_ownership(token, CERT_NAME)
if response.status_code != 204:
print("Domain ownership verification failed")
Функции create_cert_order, update_cert и verify_domain_ownership, на которые здесь ссылаются, представляют вызовы REST, о которых я упоминал выше. Я почти уверен, что этот рабочий процесс корректен, но я не знаю, почему последний вызов не удался.