【问题标题】:Where to store SSL certificates for a 12-factor app在哪里存储 12 因素应用程序的 SSL 证书
【发布时间】:2015-11-09 08:51:45
【问题描述】:

Twelve factor app 应为 store configuration in the environment

这是否旨在包含 SSL 证书和密钥文件,这些文件可能“很大”(至少是 kb 的倍数),并且(取决于格式)通常包含不可打印的字符(至少是换行符)。

或者环境是否只是指向证书/密钥文件名? (例如,在尝试通过 Docker 部署时,这似乎并不理想——我们真的不想将私钥存储在 docker 映像中,对吗?但也许这是一个单独的问题。)

【问题讨论】:

  • 我对 12-factor 应用程序的体验为 0(虽然这个名字很有趣,但我最初将其读作 12-factor auth)。无论如何,就您的观点而言,我使用了一些第三方插件,这些插件支持在其配置中引用实际服务器资源。具体来说,可能是 SSL 证书序列号或指纹。这些是唯一标识符,您可以轻松地将其放入环境变量中,只要您的应用程序或服务可以将其与所引用的存储中的实际 SSL 证书相关联。如果您不/不能使用 HSM,密钥管理当然总是一个挑战:D

标签: ssl-certificate 12factor


【解决方案1】:

SSL 证书(严格来说)不是配置,而是资产文件。

您提供此资产的方式取决于您的托管方式。但这里有一些选择:

一个简单的方法是集成letsencrypt并使用certbot,它可以安全地自动处理证书的下载。 letsencrypt 对某些语言进行了一些集成(例如,go 有多个可以集成到应用程序中的客户端)。

您可以使用负载平衡器并在负载平衡器处终止 ssl。在这种情况下,您的应用不需要了解有关证书的任何信息。

Kubernetes 提供了可以安全存储证书并在部署时将这些文件复制到 pod 的秘密(简化:pod 是一个包,它对包含您的应用程序的 docker 容器进行了薄包装)。

Kubernetes 还可以将 Ingress 用作终止 ssl 的 LoadBalancer。

另一个选择是使用 hashcorp 的 Vault。这是一项管理和分发机密的服务。

当然,还有更多选择,这些只是提示。但是 ssl 证书的安全存储和分发并非易事。我希望我已经给出了一些好的提示。

【讨论】:

    【解决方案2】:

    我不是 12 要素应用最佳实践方面的专家;但是,从有关 12 因素应用程序配置的链接文章中,听起来规定的做法是使用 环境变量 来识别程序的可配置方面。

    也许SSL_CERT_FILESSL_KEY_FILE 环境变量可以被读取为相应文件的路径,以便在文件可能位于不同位置的不同环境中轻松覆盖它们。

    我个人喜欢无需额外配置即可“正常运行”的软件,因此您也可以考虑将证书和密钥文件嵌入可执行文件本身(如果可行的话),以便程序“开箱即用” " 但如果环境或特定应用程序需要,程序的用户也可以指定备用证书/密钥文件位置。

    【讨论】:

      【解决方案3】:

      有不同种类的配置元素。 12 要素应用程序在环境中存储配置的动机是为了一个特定的目标:使其易于在新环境中的其他地方重新部署。因此,只有那些配置元素才有资格进入有助于实现这一目标的环境。其他领域或应用程序特定的配置元素可以与应用程序的本地或技术特定配置方法选择保持捆绑。

      对于 SSL 证书,似乎这些证书不会因环境而异,因此您不必将它们保存在环境变量中,IMO。

      【讨论】:

      • 如果您的 SSL 证书在环境之间没有变化,那么我会说,您使用的 SSL 证书不正确。
      • 正确。我并没有关注如何正确使用证书,而只是指出 12 因素应用程序中的配置不一定必须始终在环境中,但只有这么多对环境变化敏感。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-27
      • 2016-04-24
      • 2023-04-09
      • 1970-01-01
      • 2013-02-10
      • 2018-04-15
      • 1970-01-01
      相关资源
      最近更新 更多