【问题标题】:Detecting / checking TLS version of a request检测/检查请求的 TLS 版本
【发布时间】:2020-11-03 23:34:17
【问题描述】:

我们收到了 Heroku 的以下电子邮件。我们在 heroku 中有一个 django 后端,有很多来自浏览器和其他系统的请求。

正如 Heroku 所说,我们认为浏览器不会有任何问题,因为即使是旧浏览器也与 TLS 1.2 兼容:https://caniuse.com/tls1-2

但是,我们不知道其他系统是否正在使用 TLS 1.0 或 TLS 1.1 与我们的系统连接。

我们可以从我们的代码中检测到它吗?像这样?

if request.getProtocolTLS() in ["TLS1.0", "TLS1.1"]:
    send_admin_mail('Alert old protocol of TLS', request.user, request.get_full_path())

更新我们应用的真实数据:

  1. 云:Heroku

  2. 框架:Django 1.11.11

  3. Python 版本:3.6

  4. WSGI HTTP 服务器:gunicorn

  5. 过程文件:

    web: python manage.py collectstatic --noinput ; gunicorn joinupback.wsgi --log-file - --max-requests 6700 --max-requests-jitter 20

尊敬的 Heroku 客户,

在 Salesforce,我们的首要任务是为您提供值得信赖的 Heroku 平台,今天我们开始迁移旧的、安全性较低的 TLS 版本,并计划在明年 7 月之后完全阻止 TLS v1.0/v1.1 2021 年 3 月 31 日。虽然此限制对于 Web 浏览器客户端通常不是问题,但一些旧的非浏览器客户端可能会受到影响。此通知给您一整年的时间来进行必要的更改,以确保所有客户端都使用 TLS v1.2 或更高版本 (v1.2+)。

Heroku 目前在所有应用程序上都支持 TLS v1.0/v1.1,以及最新、更安全的 TLS v1.2+ 协议。 2016 年 4 月,PCI 委员会发布了其数据安全标准 (DSS) 的 3.1 版。在众多更改和建议中,不能再使用 SSL 和 TLS v1.0。今天的建议是使用 TLS v1.2+,不仅是为了符合 PCI 标准,而且是对互联网上传输的数据进行加密的一般最佳实践。

今天,Heroku 开始实施这些建议,将所有应用转换到 TLS v1.2+,以便我们可以在明年终止 TLS v1.0/v1.1。

我需要做什么? 您无需执行任何操作即可使此更改生效。一切都会自动发生,无需您采取任何行动。但是,如果有客户端使用 TLS v1.0/1.1 访问您的应用,则需要在 2021 年 7 月 31 日之前对其进行更新。

我需要知道什么? 我们最近更改了私有空间中部署的所有新 Heroku 应用程序使用的密码,以仅支持 TLS v1.2+。已在私有空间中运行的现有应用程序保持不变,使用以前的默认密码套件。

今年晚些时候,我们将对所有新 Heroku 应用的默认密码进行类似的更改。

如果您在私有空间中运行您的应用,您可能希望仅将其密码套件更改为 TLS v1.2+,以便在我们阻止 TLS v1.0/v1.1 流量时它们不会受到影响。有关如何执行此操作的详细信息,请参阅私有空间开发中心的路由文章(“SSL 安全”部分)。

当我们更改 Common Runtime 应用程序(即不在私人空间中的应用程序)的默认密码套件时,我们还将为您提供更改这些现有应用程序的密码套件的说明。

从 2021 年 6 月 1 日开始,我们将开始将所有应用迁移到新的密码套件,并阻止 TLS v1.0/v1.1 在 2021 年 7 月 31 日之前完成此迁移。

2021 年 7 月 31 日之后,使用 TLS v1.0/v1.0 访问 Heroku 应用的客户端将被阻止。请务必在此之前采取必要的步骤,以确保所有客户都可以访问您的应用。

真诚地, 赫罗库

【问题讨论】:

  • 使用ssllabs.com/ssltest 并享受。
  • 查看SSLSocket.cipher() in docs.python.org/3.8/library/ssl.html 以获取信息或查看get_cipher_version() in pyopenssl.org/en/stable/api/ssl.html,具体取决于您使用的库。但是在这个阶段 1)没有必要引用所有的电子邮件和 2)你没有提供任何关于你的应用程序和执行 TLS 握手的代码部分的真实数据,因此如何更改它以达到你的检测目标TLS 版本。
  • @KlausD。谢谢!但是我们不想要 SSL 服务器测试。我们想知道每个请求的 TLS 版本。目前 heroku 适用于 TLS 1.0、1.1 和 1.2 版本,但每个版本都有什么请求?通过这种方式,我们将知道我们是否有问题。例如。另一个服务器的另一个客户端可能使用 TLS 1.0,如果我们知道的话,我们可以向该服务器维护人员提醒这个问题。
  • @PatrickMevzek 1) 请少给我一些信息。 2)请给我更多信息! :-P。我已经更新了我们应用程序的真实数据。这段代码执行 TLS 握手:我们不知道这是 heroku、gunicorn 还是 Django :-( 这是个问题!
  • @Goin 因为 Django 框架只处理应用层,我非常怀疑我们是否可以获取 TLS 版本/协议的信息。仅从 django.http.request 对象的官方文档中查看,没有一个对象具有 TLS 版本/协议详细信息的任何属性docs.djangoproject.com/en/3.0/ref/request-response 如果您想在 django 中实现它,您可能需要做一些猴子补丁-框架这是为“请求”库完成的链接stackoverflow.com/questions/55431014/…

标签: python django ssl heroku tls1.2


【解决方案1】:

由于您不是在 https 模式下启动 gunicorn,我们可以排除 reverse proxy <-> gunicorn。所以 - 你没有问题,你的反向代理有,这意味着 Heroku 有。

如果你start gunicorn with ssl那么你可以select the ssl version使用。

不过,这封信是要通知您访问您网站的人们的设备如果真的很古老,就应该升级。您将无法检测到这一点,因为the WSGI specification 不需要将 SSL 协议从反向代理传送到 WSGI 服务器。但是可以这样做,但我不知道一个人对 Heroku 的控制量。

比如用uWSGI,nginx的uwsgi模块和ssl模块,就可以搞定:

  • nginx ssl 模块定义$ssl_protocol
  • uwsgi_param 指令定义要传递给 WSGI 环境的变量
  • Django 会通过django.core.handlers.wsgi.WsgiRequest 阅读这些内容并将它们提供给request.META

【讨论】:

  • 非常感谢!我对你的回答投了赞成票……但这不是我问题的解决方案……我不能给你奖励:-)
猜你喜欢
  • 2021-09-15
  • 2013-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-04
  • 2021-08-17
  • 2021-04-17
相关资源
最近更新 更多