Удаление / повторная привязка SSL-сертификата из функции Azure с помощью Azure SDK

Я пытаюсь автоматизировать процесс получения сертификата SSL на моем лазурном портале. Для этого я написал функцию Azure, которая загружает новый сертификат, а затем загружает / связывает его с моим веб-приложением. Код выглядит так:

        app.Update()
            .DefineSslBinding()
                .ForHostname("*.my.domain")
                .WithPfxCertificateToUpload(Path.Combine(executionContext.FunctionDirectory, "cert.pfx"), "pwd")
                .WithSniBasedSsl()
                .Attach()
            .Apply();

который должен загрузить новый сертификат и создать новую привязку. Он работает должным образом в веб-приложении без существующих сертификатов / привязок, но если я снова запустил функцию, у меня возникнут проблемы:

  1. Новый сертификат не отображается на лазурном портале
  2. Обвязка остается прежней
  3. Если я вручную удалю привязку и снова запущу свой код, он создаст такую ​​же привязку с самым первым сертификатом, который у меня был, т.е. снова станет таким же
  4. Забавно: я не получаю отказов

После некоторого исследования я выяснил, что если я перечисляю свои сертификаты в Azure cli с az webapp config ssl list, список на портале обновляется, то есть все сертификаты присутствуют. Но это мало помогает.

Мой общий вопрос: есть ли другой способ перепривязать сертификат?

Или, как очевидный обходной путь, было бы удалить существующую привязку и сертификат заранее: как я могу удалить сертификат SSL в функции Azure с помощью .NET SDK?


person Andrey Stukalin    schedule 27.08.2018    source источник


Ответы (1)


Нашел способ. Это нужно сделать в 2 шага: сначала загрузить сертификат с

        var certificate = await azure.AppServices.AppServiceCertificates
                .Define($"some-name")
                .WithRegion(app.Region)
                .WithExistingResourceGroup(app.ResourceGroupName)
                .WithPfxByteArray(pfxBytes)
                .WithPfxPassword("test")
                .CreateAsync();

а затем с помощью WithExistingCertificate:

        await app.Update()
            .DefineSslBinding()
                .ForHostname("*.my.domain")
                .WithExistingCertificate(certificate.Thumbprint)
                .WithSniBasedSsl()
                .Attach()
            .ApplyAsync();

Существует ожидающий запрос на перенос, чтобы сделать это за один вызов https://github.com/Azure/azure-libraries-for-net/pull/208

UPD: PR был объединен, поэтому вместо двух вызовов вы можете просто использовать один:

var certBytes = certificateService.RetreiveCertificate();
webapp
    .Update()
    .DefineSslBinding()
    .ForHostname("my.hostname")
    .WithPfxByteArrayToUpload(certBytes, "password")
    .WithSniBasedSsl()
    .Attach()
    .Apply();
person Andrey Stukalin    schedule 03.09.2018