如何在 ASP.NET (Core 2) Web 应用程序中访问来自 AWS 的认证?

Posted

技术标签:

【中文标题】如何在 ASP.NET (Core 2) Web 应用程序中访问来自 AWS 的认证?【英文标题】:How to access a certification from AWS in a ASP.NET (Core 2) web application? 【发布时间】:2018-04-28 14:52:50 【问题描述】:

我正在尝试将 ASP.NET Core 2 Web 应用程序部署到 AWS Elastic Beanstalk。

该应用程序实际上是 IdentityServer4,我需要访问一个证书来签署和验证令牌。

有一个教程如何为 Azure Web 应用程序HERE 配置证书的使用,但我还没有找到任何类似的 AWS。

无论我搜索有关 AWS 及其证书的任何内容,我总能找到有关 HTTPS 的 SSL/TLS 连接的文章和文档。我知道如何执行此操作并将单独执行此操作,我已经在 AWS Certificate Manager 中提供了一个证书,我可以在 Elastic Beanstalk 中为负载均衡器设置它,但 ACM 文档指出:

ACM 不提供 SSL/TLS 协议以外的任何证书。 您不能将 ACM 证书用于代码签名或电子邮件加密。

所以如果我想在我的代码中使用证书,似乎 ACM Cert 不适合。

我可以使用 OpenSSL 创建自签名证书,但我不知道从 Elastic Beanstalk 实例中的 ASP.NET Core 2 Web 应用程序访问它的最佳方式是什么。我无法将证书文件放在我的代码存储库中,我想以某种方式通过 AWS 将其注入到环境中,但我不知道在我的应用程序中的何处或如何访问它?

【问题讨论】:

如果主机运行 Windows,您可以使用本地证书存储。否则,您必须编写自定义令牌创建服务。从这个类继承绝对有帮助:github.com/IdentityServer/IdentityServer4/blob/dev/src/…。另外,在谈论 azure vault 时,这可以帮助你:github.com/IdentityServer/IdentityServer4/issues/1537 @cheesemacfly 是的,我在我的 Elastic Beanstalk 环境中使用了一个 Windows 实例,所以我已经尝试将带有远程桌面的证书传输到实例的本地证书存储中并且它工作正常。但是虽然它很容易做到,但它是手动工作,我想以某种方式自动注入它,因为我不确定这是否是正确和安全的方法,特别是当我使用负载平衡器时,我还不知道是否该证书也将在添加的实例中可用。 我明白了。我知道在天蓝色中,您可以在创建实例时将证书从保险库安装到实例中,这样您就不必手动执行此操作。我对aws不够熟悉,但可能有办法做到这一点。这可能是比创建新的令牌创建服务更简单、更好的解决方案。 @cheesemacfly 这正是我上周大部分时间从 Google、SO、AWS 文档等搜索的内容。关于“aws”和“certs”的所有内容都指向 SSL/TLS 和 HTTPS 证书和配置或 AWS 认证和课程等。可以将您自己的证书导入 AWS Certificate Manager 或 IAM,我认为这些可以通过 AWS 访问SDK,但我不知道它们是否正确。正如我在问题中提到的,ACM 证书不适用于 SSL/TLS 以外的任何东西。 【参考方案1】:

我也浪费了一些时间来寻找它。

我最终做的是将证书的 base64 和证书密码存储在 Secrets Manager 中,并在使用 Kralizek's 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;

【讨论】:

嗯,这当然看起来是一个聪明的解决方案,但是距离我的帖子已经很久了,所以我无法验证它。当时,我想,我只是手动将证书复制到 AWS EB 机器上,然后以这种方式使用它。不是最好的解决方案,但当时有效。当然,当您需要启动新机器或更新证书时会出现问题,但不幸的是我没有足够长的时间来解决这些问题。

以上是关于如何在 ASP.NET (Core 2) Web 应用程序中访问来自 AWS 的认证?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual Studio 2017 Web Proj ASP.NET Core 2.0 中禁用 Https

在 ASP.NET Core 2.1 Web API 中实现分页

如何将 AzureAD 和 AzureADBearer 添加到 asp.net core 2.2 web api

如何测试返回 Ok(object) 的 ASP.NET Core 2.2 Web API GET IActionResult?

如何使用 fetch 将 FormData 从 javascript 发送到 ASP.NET Core 2.1 Web API

如何从 ASP.NET MVC 到 ASP.NET Core Web API 的 PUT?