为每个 Django 视图动态提供 TLS 证书,而不是通过 nginx/gunicorn

Serve TLS certificate dynamically per Django view instead of via nginx/gunicorn

我在视图代码中使用 Django 的 request.get_host() 来区分动态数量的域。

例如,如果请求来自 www.domaina.com,则在 table 中查找该域并返回与其相关的内容。

我 运行 certbot 以编程方式生成 LetsEncrypt 证书(包括通过 Django 进行的 acme 挑战)。我将证书文件作为 base64 字符串存储在 PostgreSQL 中。

工作得很好,但我不知道如何'apply' 动态每个域的证书。

我知道这通常是使用 TLS 终止、nginx 甚至在 gunicorn 中完成的。但这对于我的用例来说不够动态。

通配符或 SAN 证书也是如此(不够动态)

所以问题是:

如果我有有效的 LetsEncrypt 证书,我可以使用它们在运行时保护 Django 视图吗?

Django 用作 wsgi 服务器。 Django 收到一个 http 请求并自己做一些工作。然后它将它交给中间件,然后交给您的意见。 我相当确定 django 在开始时所做的通用工作,它已经需要一个常规的 http 请求,而不是“不可读的加密内容的二进制 blob”。 也许 gunicorn 可以处理 https 终止,但我不确定。

一般使用nginx或者haproxy。也因为它是需要真正安全的东西。

我现在正在使用 haproxy,它有一个方便的功能,您只需将它指向一个充满 *.pem 个证书文件的目录,它就会读取并使用它们。因此,如果您可以将证书写入这样的目录并确保每次更改证书时都重新加载 haproxy,那么您可能非常接近动态工作方式。