2

调试在 TLS/SSL 之上运行的 Django 应用程序的最佳方法是什么?

背景:

我有一个使用 X.509 客户端证书进行身份验证的 Django Web 应用程序。在 Apache 下运行时,我的应用程序只能通过 HTTPS 访问。连接到应用程序的客户端提供客户端证书,Apache 验证该证书,然后在环境变量中转发到应用程序。该应用程序解析证书并提供访问控制内容。

到目前为止,我只能使用“./manage.py runserver”在常规 HTTP 下调试应用程序。我已经通过在调试模式下使用自定义视图处理程序中间件来模拟 HTTPS 连接。视图处理程序将信息添加到请求中,类似于在 HTTPS 下运行时从实际客户端证书中解析出的信息。

如果我可以使用客户端在通过 HTTPS 连接时提供的实际客户端证书进行调试,这将使调试变得更加容易。

4

2 回答 2

4

我们在 Django 前面使用 nginx,带有客户端证书检查。NGINX 执行 SSL 终止、客户端证书验证和检查吊销列表。客户端证书字段在标头变量中传递到 django 应用程序。

那么我们的 django 应用程序没有收到证书,它只是查看头变量。我认为同样的机制也适用于 Apache。

对于访问开发服务器的客户端(例如'./manage.py runserver'),我们只是在客户端有一个特殊情况。python客户端示例:

  if (proto == "https"):
    conn = http.client.HTTPSConnection( "cert."+webhost+":"+port,
                                        key_file = certfile, cert_file = certfile)
    headers = {}
  else:
    # fake client for local connections.  pass cert info in headers, as it would come
    # out of nginx
    conn = http.client.HTTPConnection( webhost+":"+port)
    headers = { 'X_SSL_CLIENT_S_DN':'/C=US/ST=California/O=yyyy/CN=zzzz',
                'X_SSL_CLIENT_I_DN':'/C=US/ST=California/O=xxxx/CN=wwww',
                'X_SSL_CLIENT_SERIAL':hex(serialnum),
                'USER_AGENT':"test client user agent",}

对于单元测试,我们使用 Django 测试客户端做同样的事情:

  from django.test.client import Client
  self.client = Client()
  response = self.client.get(url, data,
                **{
                'HTTP_X_SSL_CLIENT_S_DN':'/C=US/ST=California/O=yyyy/CN=zzzz',
                'HTTP_X_SSL_CLIENT_I_DN':'/C=US/ST=California/O=xxxx/CN=wwww',
                'HTTP_X_SSL_CLIENT_SERIAL':hex(serialnum),
                'HTTP_USER_AGENT':"test client user agent",
                })
于 2012-07-15T17:13:39.160 回答
0

我想出了一个对我来说效果很好的解决方法。我仍然使用 HTTP 进行调试,但我通过 HTTP 标头传递客户端证书。因此,当我使用 HTTP 调试 Web 应用程序时,我让客户端将客户端证书复制到 HTTP 标头中。在进入视图之前,Web 应用程序将证书从标头复制到常规位置,当使用 HTTPS 时,Apache 将在该位置传递证书。

客户端证书是 PEM 格式的,因此,为了能够在 HTTP 标头中传递它们,唯一需要做的就是删除客户端上的换行符并将它们重新插入服务器上。

如果使用这种方法,请注意 Apache 对单个 HTTP 标头字段大小的默认限制是 8190 字节,使用该LimitRequestFieldSize指令进行配置。对于大于该值的证书,必须更改配置或必须拆分证书并在多个标头中传递。

于 2012-07-15T14:05:28.090 回答