feat: aether-proxy TLS 双栈支持与自签名证书自动生成

- aether-proxy 新增 TLS 模块:自签名证书生成、TLS acceptor 构建、证书 SHA-256 指纹计算
- 代理服务器支持 HTTP+TLS 双栈模式,通过 peek 首字节区分 TLS ClientHello 与普通 HTTP
- 注册与心跳上报 tls_enabled 和 tls_cert_fingerprint 字段
- Python 侧 httpx 代理适配:TLS 代理使用 httpx.Proxy + CERT_NONE ssl_context
- ProxyNode 模型新增 tls_enabled/tls_cert_fingerprint 字段及对应迁移
This commit is contained in:
fawney19
2026-02-07 23:18:58 +08:00
parent 10bd14c223
commit 5384ffd403
17 changed files with 588 additions and 79 deletions

View File

@@ -5,6 +5,8 @@ SSL 工具函数
import ssl
from loguru import logger
try:
import certifi
@@ -12,6 +14,8 @@ try:
except ImportError:
_SSL_CONTEXT = ssl.create_default_context()
_PROXY_SSL_CONTEXT: ssl.SSLContext | None = None
def get_ssl_context() -> ssl.SSLContext:
"""
@@ -24,3 +28,30 @@ def get_ssl_context() -> ssl.SSLContext:
ssl.SSLContext: SSL 上下文
"""
return _SSL_CONTEXT
def get_proxy_ssl_context(expected_fingerprint: str | None = None) -> ssl.SSLContext:
"""
获取用于代理连接的 SSL 上下文(连接 aether-proxy TLS 端口)
当前使用 CERT_NONE不验证证书因为 aether-proxy 使用自签名证书。
expected_fingerprint 参数预留供未来实现指纹校验。
Args:
expected_fingerprint: 预期的证书 SHA-256 指纹hex预留参数
Returns:
ssl.SSLContext: 代理专用 SSL 上下文
"""
global _PROXY_SSL_CONTEXT
if expected_fingerprint:
logger.warning("TLS 证书指纹校验尚未实现, fingerprint={} 被忽略", expected_fingerprint)
if _PROXY_SSL_CONTEXT is None:
ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
_PROXY_SSL_CONTEXT = ctx
# TODO: 实现基于 expected_fingerprint 的证书指纹校验
return _PROXY_SSL_CONTEXT