在 Python 的 WSGI/ASGI 框架中如何读取客户端请求的 TLS 指纹?

在 Python WSGI/ASGI 框架中如何读取客户端请求的 TLS 指纹

python 生态系统中,尤其是使用 wsgi/asgi 框架时,读取客户端请求的 tls 指纹是一个常见但相对复杂的问题。许多开发者尝试使用 request.scope.get('ssl') 来获取 tls 相关信息,但经常发现这个方法并不可靠。下面我们将详细探讨如何在 python 的 uvicorn 和 fastapi 环境中以及使用纯 socket 编程的方式获取客户端的 tls 指纹。

使用 Uvicorn 和 FastAPI

首先,让我们来看一下在 uvicorn 和 fastapi 环境中如何尝试获取 TLS 指纹。以下是示例代码:

import uvicornfrom loggers import loggerfrom fastapi import FastAPI, Requestfrom fastapi.middleware.cors import CORSMiddlewarefrom middleware.loggers import RequestLogMiddlewarefrom middleware.correlations import CorrelationIdMiddlewarefrom starlette.middleware.base import BaseHTTPMiddleware

app = FastAPI()

app.add_middleware(CORSMiddleware,allow_origins=[''],allow_credentials=True,allow_methods=[""],allow_headers=["*"],)app.add_middleware(BaseHTTPMiddleware, dispatch=RequestLogMiddleware())app.add_middleware(BaseHTTPMiddleware, dispatch=CorrelationIdMiddleware())

@app.get('/')@logger.catchasync def root(request: Request):ssl_info = request.scope.get('ssl')if ssl_info:

尝试获取 TLS 指纹,不同的 Python 版本和环境可能有所不同

    tls_fingerprint = ssl_info.get('peer_cert_fingerprint')    if tls_fingerprint:        logger.info(f"Client TLS fingerprint: {tls_fingerprint}")    else:        logger.info("Could not get client TLS fingerprint.")else:    logger.info("No SSL information available.")response_body = {    "ip": request.client.host}logger.debug(response_body)return response_body

if name == "main":uvicorn.run(app,host="0.0.0.0",port=8086,workers=1,ssl_keyfile="/Users/ponponon/Downloads/xxxx.cn_nginx/xxxx.cn.key",ssl_certfile="/Users/ponponon/Downloads/xxxx.cn_nginx/xxxx.cn.pem")

如上所述,尝试通过 request.scope.get('ssl') 访问 TLS 信息,但发现该方法在许多情况下返回的是 None。这可能是因为 FastAPI 并不直接暴露 TLS 信息。

使用纯 socket 编程

考虑到在 FastAPI 中获取 TLS 指纹的困难,我们尝试使用纯 socket 编程来直接处理客户端的 TLS 握手过程。以下是示例代码:

立即学习“Python免费学习笔记(深入)”;

import sslimport socketfrom loguru import loggerfrom pyja3 import extract_ja3_from_client_hellofrom threading import Thread

CERT_FILE = "/home/pon/code/me/ssl/xxxx.cn_nginx/xxxx.cn.pem"KEY_FILE = "/home/pon/code/me/ssl/xxxx.cn_nginx/xxxx.cn.key"

def handle_client(client_socket, addr):try:raw_data = client_socket.recv(4096, socket.MSG_PEEK)ja3_str, ja3_hash = extract_ja3_from_client_hello(raw_data)logger.info(f"[{addr}] JA3: {ja3_str}, MD5: {ja3_hash}")except Exception as e:logger.warning(f"[{addr}] Failed to get JA3: {e}")finally:client_socket.close()

def main():context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)

bindsocket = socket.socket()bindsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)bindsocket.bind(("0.0.0.0", 8086))bindsocket.listen(5)logger.info("Server listening on 0.0.0.0:8086")while True:    client_socket, fromaddr = bindsocket.accept()    Thread(target=handle_client, args=(client_socket, fromaddr)).start()

if name == "main":main()

在上述代码中,我们使用 sslsocket 模块来设置 TLS 服务器,并且使用 pyja3 库尝试提取 JA3 指纹。然而,实际操作中,我们可能仍然无法读取到客户端请求中的 TLS 指纹。

解决方案和讨论

在当前的 Python WSGI/ASGI 生态系统中,读取 TLS 指纹并不直接支持。无论是使用 FastAPI 还是纯 socket 编程,都遇到了困难。这主要是因为 TLS 信息通常在底层网络层处理,应用层无法直接访问这些信息。

要解决这个问题,可以考虑以下方法:

使用中间件:某些 Web 服务器(如 Nginx)可以作为反向代理,并通过中间件或插件来捕获和记录 TLS 信息。然后,这些信息可以通过 HTTP 头或其他方式传输给应用服务器。使用专用库:某些专门用于 TLS 指纹分析的库可能会提供更直接的方法来提取所需信息。调整服务器配置:在某些情况下,调整服务器的配置文件(例如 Nginx 配置)以记录 TLS 信息可能是一个可行的解决方案。

总之,读取客户端请求的 TLS 指纹在 Python 的 WSGI/ASGI 框架中需要更深入的网络层处理或借助外部工具和配置来实现。

在 Python 的 WSGI/ASGI 框架中如何读取客户端请求的 TLS 指纹?

以上就是在 Python 的 WSGI/ASGI 框架中如何读取客户端请求的 TLS 指纹?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1360768.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月13日 23:57:15
下一篇 2025年12月13日 23:57:38

相关推荐

  • Python中如何更新数据库记录?

    在python中更新数据库记录的方法包括使用sql的update语句和python的数据库连接库。具体步骤如下:1. 连接到数据库,使用sqlite3.connect()方法。2. 执行update语句,使用cursor.execute()方法。3. 提交事务,使用conn.commit()方法。4…

    好文分享 2025年12月13日
    000
  • 在Windows 7上运行高版本Python项目时,如何无需手动安装msu补丁就能让项目正常运行?

    在windows 7上运行高版本python项目时,如何避免手动安装msu补丁并使项目正常运行?本文将探讨一种不需要手动安装msu补丁的解决方案。 在Windows 7上运行高版本Python项目:无需手动安装msu补丁的解决方案 在Windows 7系统上运行高版本Python(如Python 3…

    2025年12月13日
    000
  • Python中如何使用@classmethod装饰器?

    @classmethod装饰器用于定义与类绑定的方法,允许通过类名直接调用。1) 创建替代构造函数,如myclass.from_string(“123”)。2) 实现工厂方法,如logger.debug(),为不同日志级别提供明确的初始化方法。 在Python中,@class…

    2025年12月13日
    000
  • Python中怎样参数化测试?

    在python中,可以通过pytest库使用@pytest.mark.parametrize装饰器来实现参数化测试。1) 安装pytest后,使用@pytest.mark.parametrize装饰器对测试函数进行参数化,如test_add函数。2) 将测试数据存放在yaml或json文件中,提高可…

    2025年12月13日
    000
  • Python中如何使用unittest模块?

    在python中使用unittest模块进行单元测试是确保代码质量和稳定性的重要方法。1. 基础用法:编写测试类并使用断言方法,如assertequal。2. 高级用法:测试异常、捕获输出、使用setup和teardown方法。3. 注意事项:测试方法名以test_开头,确保测试独立性,使用不同as…

    2025年12月13日
    000
  • 怎样用Python创建命令行工具?

    使用python创建命令行工具主要通过argparse库实现。1)使用argparse库解析命令行参数并执行相应函数。2)添加子命令扩展工具功能。3)使用parse_known_args()处理未知参数。4)考虑使用click或typer库优化性能和用户体验。 用Python创建命令行工具是一项有趣…

    2025年12月13日
    000
  • 在Win7上运行高版本Python项目,如何避免手动安装msu补丁?

    如何在Win7上运行高版本Python项目而无需手动安装msu补丁? 在Windows 7系统上运行高版本Python(例如Python 3.10)项目时,通常需要安装三个msu补丁。然而,需求是避免手动安装这些补丁,而是提取补丁中的相关文件(如dll、manifest等),并将这些文件放置在run…

    2025年12月13日
    000
  • Python中怎样使用raise抛出异常?

    在python中使用raise抛出异常的方法和注意事项包括:1. 使用raise关键字主动触发异常,如raise valueerror(“不能除以零”);2. 选择合适的异常类型,如valueerror或typeerror;3. 创建自定义异常类,如class datapro…

    2025年12月13日
    000
  • Python中如何拼接多个字符串?

    python中拼接多个字符串的方法包括:1) 使用+运算符,简单但在大规模操作中性能差;2) 使用join方法,适用于大量字符串,性能优异;3) 使用f-strings,简洁且可读性高,适合格式化;4) 使用format方法,提供灵活的格式化选项;5) 使用io.stringio,适用于大规模文本处…

    2025年12月13日
    000
  • Python中如何加密数据?

    使用python加密数据的方法包括:1. 使用hashlib库生成哈希值,如sha-256;2. 使用cryptography库进行对称加密,如fernet;3. 使用cryptography库进行非对称加密,如rsa。通过这些方法,开发者可以有效保护数据安全。 引言 当我们谈到数据安全时,加密成为…

    2025年12月13日
    000
  • Python中如何实现快速排序?

    python中实现快速排序可以通过以下步骤:1. 选择一个基准元素(pivot)。2. 将数组划分为小于pivot的left,大于pivot的right,和等于pivot的middle。3. 递归地对left和right进行排序,最后合并结果。示例代码为:def quicksort(arr): if…

    2025年12月13日
    000
  • Python中如何实现二分查找?

    在python中实现二分查找的步骤包括:1. 基本实现,使用标准的二分查找算法;2. 优化版本,避免整数溢出;3. 查找第一个匹配索引,处理重复元素;4. 处理唯一元素的优化;5. 自定义比较函数的实现。通过这些步骤,二分查找可以高效地应用于各种场景,提升编程能力。 在Python中实现二分查找是一…

    2025年12月13日
    000
  • 为什么ESP32深度睡眠唤醒后显示rst:0x5 (DEEPSLEEP_RESET)和boot:0x13 (SPI_FAST_FLASH_BOOT)?如何解决这个问题?

    在使用esp32进行深度睡眠模式的编程时,开发者可能会遇到这样的情况:设备进入深度睡眠后,唤醒时控制台显示rst:0x5 (deepsleep_reset)和boot:0x13 (spi_fast_flash_boot)。我们来探讨这意味着什么,以及如何解决这个问题。 以下是相关代码示例: impo…

    2025年12月13日
    000
  • Python中如何生成随机数?

    在python中生成随机数的最常见方法是使用random模块,secrets模块用于需要高安全性的应用。1. random模块提供基本的随机数生成,如random.random()和random.randint()。2. secrets模块适用于加密应用,使用secrets.systemrandom…

    2025年12月13日
    000
  • Python中如何使用类属性?

    类属性在python中是通过在类定义中直接声明来创建的,适用于存储所有实例共享的数据和作为默认值。1.共享数据:适合存储版本号、常量等。2.默认值:可作为实例属性的默认值,但修改会影响所有实例。3.性能考虑:减少内存使用。注意:通过实例修改类属性可能导致意外行为,需谨慎使用。 在Python中,类属…

    2025年12月13日
    000
  • Python中如何定义可比较的类?

    在python中定义可比较的类需要实现特殊方法,如__lt__和__eq__,以允许实例间比较。1)实现__lt__和__eq__方法,使类可进行小于和等于比较。2)为提高清晰度和性能,建议实现__le__、__gt__、__ge__和__ne__方法。3)使用functools.total_ord…

    2025年12月13日
    000
  • 怎样在Python中实现共享内存?

    在python中实现共享内存可以通过multiprocessing.shared_memory模块实现。1) 使用sharedmemory创建共享内存块。2) 通过numpy的ndarray操作内存块。3) 需要注意数据一致性和同步,使用lock避免数据竞争。4) 共享内存提高性能但增加复杂性,需权…

    2025年12月13日
    000
  • Python中如何将整数转换为字符串?

    在python中将整数转换为字符串可以使用以下方法:1. 使用str()函数:str(number),最简单高效。2. 使用f-string(python 3.6+):f”{number}”,适用于复杂格式化。3. 使用format()方法:”{0}”…

    2025年12月13日
    000
  • Python中怎样使用混入类?

    混入类在python中是一种允许扩展类功能的设计模式,不使用多重继承。1.混入类不直接实例化,而是被其他类继承。2.混入类应轻量且聚焦单一功能,不应有构造函数和使用super()。3.混入类在事件处理、日志记录、缓存等方面特别有用,但需谨慎使用以避免复杂性。 混入类在Python中是一个非常酷的概念…

    2025年12月13日
    000
  • Python中如何创建虚拟环境?

    在python中创建虚拟环境使用venv模块,步骤如下:1. 创建虚拟环境:python -m venv myenv;2. 激活虚拟环境:在windows上使用myenvscriptsactivate,在macos和linux上使用source myenv/bin/activate。使用虚拟环境可以…

    2025年12月13日
    000

发表回复

登录后才能评论
关注微信