django - 如何使用 Django 测试 https 连接,就像使用 'runserver' 测试非 https 连接一样容易?

标签 django ssl https

我有一个使用“安全”cookie 的应用程序,我想测试它的功能,而无需设置复杂的启用 SSL 的开发服务器。有什么方法可以像我使用 ./manage.py runserver 测试非加密请求一样简单吗?

最佳答案

它不像内置开发服务器那样简单,但是使用 stunnel 作为浏览器和开发服务器之间的 SSL 化中间人来接近一些东西并不难。 Stunnel 允许您在您的计算机上设置一个轻量级服务器,该服务器接受配置端口上的连接,使用 SSL 包装它们,并将它们传递给其他服务器。我们将使用它来打开一个 stunnel 端口 (8443),并将它接收到的任何流量传递给 Django runserver 实例。

首先你需要一个可以是downloaded here的stunnel或者可能由您平台的包系统提供(例如:apt-get install stunnel)。我将使用第 4 版的 stunnel(例如:Ubuntu 上的 /usr/bin/stunnel4),第 3 版也可以使用,但具有不同的配置选项。

首先在你的 Django 项目中创建一个目录来保存必要的配置文件和 SSLish 的东西。

mkdir stunnel
cd stunnel

接下来我们需要创建一个本地证书和 key 以用于 SSL 通信。为此,我们求助于 openssl。

创建 key :

openssl genrsa 2048 > stunnel.key

创建使用此 key 的证书(这将询问您一系列信息,这些信息将包含在证书中 - 只需回答您觉得合适的内容即可):

openssl req -new -x509 -nodes -sha1 -days 365 -key stunnel.key > stunnel.cert

现在将这些组合到一个文件中,stunnel 将用于其 SSL 通信:

cat stunnel.key stunnel.cert > stunnel.pem

为名为 dev_https 的 Stunnel 创建一个配置文件,内容如下:

pid=

cert = stunnel/stunnel.pem
sslVersion = SSLv3
foreground = yes
output = stunnel.log

[https]
accept=8443
connect=8001
TIMEOUTclose=1

此文件告诉 stunnel 它需要知道的内容。具体来说,你告诉它不要使用 pid 文件,证书文件在哪里,使用什么版本的 SSL,它应该在前台运行,它应该在哪里记录它的输出,它应该接受端口上的连接8443 并将它们穿梭到端口 8001。最后一个参数 (TIMEOUTclose) 告诉它在 1 秒无事件后自动关闭连接。

现在回到你的 Django 项目目录(里面有 manage.py 的目录):

cd ..

在这里我们将创建一个名为 runserver 的脚本,它将运行 stunnel 和两个 django 开发服务器(一个用于普通连接,一个用于 SSL 连接):

stunnel4 stunnel/dev_https &
python manage.py runserver&
HTTPS=1 python manage.py runserver 8001

让我们逐行分解:

  • 第 1 行:启动 stunnel 并将其指向我们刚刚创建的配置文件。这在端口 8443 上有 stunnel 监听,将它接收到的任何连接包装在 SSL 中,并将它们传递到端口 8001
  • 第 2 行:启动一个普通的 Django runserver 实例(在端口 8000 上)
  • 第 3 行:启动另一个 Django runserver 实例(在端口 8001 上)并将其配置为将所有传入连接视为使用 HTTPS 执行。

使我们刚刚创建的运行脚本文件可执行:

chmod a+x runserver

现在,当您想要运行您的开发服务器时,只需从您的项目目录执行 ./runserver。要试用它,只需将浏览器指向 http://localhost:8000 以获取正常的 HTTP 流量,将浏览器指向 https://localhost:8443 以获取 HTTPS 流量。请注意,您的浏览器几乎肯定会提示使用的证书并要求您添加异常(exception)或以其他方式明确指示浏览器继续浏览。这是因为您创建了自己的证书,并且浏览器不相信它会说出关于它是谁的真相。这对开发来说很好,但显然不会减少生产。

不幸的是,在我的机器上,当我按下 Ctrl-C 时,这个 runserver 脚本并没有很好地退出。我必须手动终止进程 - 有人有解决这个问题的建议吗?

感谢 Michael Gile 的 post和 django-weave 的 wiki entry供引用。

关于django - 如何使用 Django 测试 https 连接,就像使用 'runserver' 测试非 https 连接一样容易?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8023126/

相关文章:

apache - 仅针对 www 子域的 HTTPS 请求问题

python - 用于企业 Web 应用程序的 Django

django - 在django上禁止管理员电子邮件ALLOWED_HOSTS异常

django - 功能测试=集成测试?在django中

javascript - 从后端代码发送数据到 bootstrap-notify

ssl - Kubernetes:为什么我的最大挑战是 EOF/没有响应?

ssl - 在 Firefox 中,curl 不验证带有 --cacert 传递的导出站点证书的证书

ssl - 为什么 listen `443 default_server ssl` 对 nginx 中的多个服务器名称起作用?

java - JaxRsClient (OkHttpClient) 比 Feign (HttpURLConnection) 或 cURL 慢很多

ios - HTTPS 服务不工作