0

0

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

心靈之曲

心靈之曲

发布时间:2025-04-25 15:30:15

|

717人浏览过

|

来源于php中文网

原创

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

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

使用 Uvicorn 和 FastAPI

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

import uvicorn
from loggers import logger
from fastapi import FastAPI, Request
from fastapi.middleware.cors import CORSMiddleware
from middleware.loggers import RequestLogMiddleware
from middleware.correlations import CorrelationIdMiddleware
from 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.catch async 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 ssl
import socket
from loguru import logger
from pyja3 import extract_ja3_from_client_hello
from 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 指纹。

Noya
Noya

让线框图变成高保真设计。

下载

解决方案和讨论

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

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

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

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

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

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

715

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

626

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

739

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

617

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1235

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

575

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

699

2023.08.11

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.6万人学习

Django 教程
Django 教程

共28课时 | 2.6万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号