Как получить доступ к сертификации AWS в веб-приложении ASP.NET (Core 2)?

Я пытаюсь развернуть веб-приложение ASP.NET Core 2 в AWS Elastic Beanstalk.

Приложение на самом деле является IdentityServer4, для которого мне нужен доступ к сертификации для подписи и проверки токенов.

Существует руководство по настройке использования сертификатов для веб-приложений Azure ЗДЕСЬ, но я не нашел ничего подобного для AWS.

Что бы я ни искал об AWS и его сертификатах, я всегда находил статьи и документацию о соединениях SSL/TLS для HTTPS. Я знаю, как это сделать, и сделаю это отдельно. У меня уже есть сертификат, доступный в диспетчере сертификатов AWS, и я могу установить его в Elastic Beanstalk для балансировщика нагрузки, но в документации ACM указано, что:

  • ACM не предоставляет сертификаты ни для чего другого, кроме протоколов SSL/TLS.
  • Вы не можете использовать сертификаты ACM для подписи кода или шифрования электронной почты.

Поэтому, если я хочу использовать сертификат в своем коде, похоже, что ACM Cert не предназначен для этого.

Я могу создать самоподписанный сертификат с помощью OpenSSL, но я не знаю, как лучше всего получить к нему доступ из моего веб-приложения ASP.NET Core 2 внутри экземпляра Elastic Beanstalk. Я не могу поместить файл сертификата в свой репозиторий кода, я хочу каким-то образом внедрить его в среду через AWS, но я не знаю, где и как я могу получить к нему доступ в своем приложении?


comment
Вы можете использовать локальное хранилище сертификатов, если хост-компьютер работает под управлением Windows. В противном случае вам пришлось бы написать собственную службу создания токенов. Наследование от этого класса определенно может помочь: github.com/ IdentityServer/IdentityServer4/blob/dev/src/. Кроме того, говоря о лазурном хранилище, это может вам помочь: github.com/IdentityServer/IdentityServer4/issues/1537   -  person cheesemacfly    schedule 15.11.2017
comment
@cheesemacfly Да, я использую экземпляр Windows для своей среды Elastic Beanstalk, поэтому я уже пытался просто передать сертификат с удаленного рабочего стола в локальное хранилище сертификатов экземпляра, и это сработало. Но хотя это легко сделать, это ручная работа, и я хотел бы как-то внедрить ее автоматически, потому что я не уверен, что это правильный и безопасный подход, тем более, что я использую балансировщик нагрузки, и я еще не знаю, если сертификат будет доступен и в добавленных экземплярах.   -  person V. Samma    schedule 16.11.2017
comment
Я понимаю. Я знаю, что в Azure вы можете установить сертификат из хранилища в экземпляр, когда он будет создан, поэтому вам не придется делать это вручную. Я недостаточно знаком с aws, чтобы знать, но, вероятно, есть способ сделать то же самое. Вероятно, это более простое и лучшее решение, чем создание новой службы создания токенов.   -  person cheesemacfly    schedule 16.11.2017
comment
@cheesemacfly Это именно то, что я искал в документах Google, SO, AWS и т. Д. Большую часть прошлой недели. Все, что касается aws и сертификатов, указывает на сертификаты и конфигурацию SSL/TLS и HTTPS или сертификаты и курсы AWS и т. д. Можно импортировать свои собственные сертификаты в диспетчер сертификатов AWS или в IAM, и я думаю, что к ним можно получить доступ через AWS SDK, но я не знаю, правильные ли они. Как я уже упоминал в своем вопросе, сертификаты ACM не предназначены ни для чего, кроме SSL/TLS.   -  person V. Samma    schedule 20.11.2017


Ответы (1)


Я тоже потерял время на поиски.

В итоге я сохранил base64 сертификата и пароль сертификата в диспетчере секретов и прочитал в приложении при запуске с помощью Расширения AWSSecretsManagerConfigurationExtensions Крализека.

private X509Certificate2 CreateSigningCredential()
{
    if (_signingCertificate != null)
        return _signingCertificate;

    var certBytes = Configuration.GetValue<string>("Auth:Certificate");
    if (string.IsNullOrEmpty(certBytes))
    {
        return null;
    }

    var password = Configuration.GetValue<string>("Auth:CertificatePassword");
    if (string.IsNullOrEmpty(password))
    {
        return null;
    }

    var certificate = Convert.FromBase64String(certBytes);
    _signingCertificate = new X509Certificate2(certificate, password);

    return _signingCertificate;
}
person Sérgio Azevedo    schedule 13.03.2020
comment
Хм, это, безусловно, кажется разумным решением, но с момента моего сообщения прошло так много времени, что я не могу его проверить. В то время, я думаю, я просто скопировал сертификат на машину AWS EB вручную, а затем использовал его таким образом. Не лучшее решение, но работало в то время. Конечно, будут проблемы, когда вам нужно запустить новую машину или обновить сертификат, но, к сожалению, я не работал над этим достаточно долго, чтобы решить эти проблемы. - person V. Samma; 17.03.2020