如何使用 mod_wsgi 从 django 访问 mod_ssl 环境变量?

Posted

技术标签:

【中文标题】如何使用 mod_wsgi 从 django 访问 mod_ssl 环境变量?【英文标题】:How to access mod_ssl environment variables from django using mod_wsgi? 【发布时间】:2011-11-23 10:24:06 【问题描述】:

我正在尝试获取客户端的证书并使用它签署一个 xml 文件。 我已将以下内容添加到我的虚拟主机中:

SSLVerifyClient optional
SSLVerifyDepth 1
SSLOptions +stdEnvVars

这应该允许 mod_ssl 获取用户的证书。但我不知道如何将它传递给我的 django 应用程序。任何帮助表示赞赏。谢谢。

【问题讨论】:

【参考方案1】:

你应该使用

SSLOptions +StdEnvVars
SSLOptions +ExportCertData

在 apache 配置中具有 SSL_CLIENT_CERT 在环境中。

使用烧瓶,它将在request.environ['SSL_CLIENT_CERT']

根据其他答案的讨论,django 可能是request.META['SSL_CLIENT_CERT']

【讨论】:

【参考方案2】:

SSLOptions +StdEnvVars +ExportCertData

SSL_CLIENT_CERT 将包含 PEM 编码的证书。

SSL_CLIENT_CERT_CHAIN_n(其中 n 是一个数字)和 SSL_SERVER_CERT 也包括在内,但可能没什么意思。

很遗憾,无法准确配置要添加到环境中的项目。只有需要的东西会更苗条(对我来说是通用名称并且验证成功 - 尽管这可能暗示需要验证,而对您来说是客户端证书 PEM)。

【讨论】:

【参考方案3】:

那些 Apache 配置指令意味着 mod_ssl environment variables 现在应该在 Django 继承的环境中可用。因此,您可以在 Django 视图中使用 os.environ 对象访问它们:

import os
client_cert = os.environ['SSL_CLIENT_CERT']

SSL_CLIENT_CERT 变量包含 PEM 编码的客户端证书。

【讨论】:

如果使用 mod_wsgi,虽然它可能适用于 mod_python,但这将不起作用,但这只是因为 Django 对 mod_python 适配器做了坏事,并在每个请求时将每个请求的环境变量推送到 os.environ 中。您应该只从 request.META(从内存)访问它们,这是每个请求 WSGI 环境变量可用的地方。 @Graham,谢谢。我刚刚完成了使用 ssl 配置 apache 并注意到 os.environ 不包含“SSL_CLIENT_CERT”变量。我会试试你的解决方案。 @Graham,使用 request.META 我看到很多与客户端相关的东西,但是如何获取 .pem 文件以便我可以使用它签署 XML 文件?谢谢。 您是否在 request.META 目录中看到任何 SSL 变量?我不熟悉 mod_ssl 设置的 SSL_CLIENT_CERT 以及您要执行的操作。只能帮你定位变量应该在哪里。 是的,我看到很多以 SSL 开头的变量,例如 SSL_SERVER_blah 和 SSL_CLIENT_blah。我不知道我正在寻找的 .pem 文件是否可用于 django。不过还是谢谢。

以上是关于如何使用 mod_wsgi 从 django 访问 mod_ssl 环境变量?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Apache 和 mod_wsgi 在 Centos 上设置 Django

Django + mod_wsgi。从 Apache 的 SetEnv 设置操作系统环境变量

如何仅在一个进程中使用 mod_wsgi 和 django 运行 Apache?

如何使用 Django/Apache/mod_wsgi/MySQL 最大化 EC2 的性能?

在windows下,使用apache部署django,访问接口一直pending

使用make安装时如何卸载mod_wsgi?