diff --git a/trading_system/redis_cache.py b/trading_system/redis_cache.py index 3299151..545d3d5 100644 --- a/trading_system/redis_cache.py +++ b/trading_system/redis_cache.py @@ -4,7 +4,6 @@ Redis 缓存管理器 - 支持 TLS 连接 import json import logging from typing import Optional, Any, Dict, List -import ssl try: # 使用 redis-py 4.2+ 的异步客户端(替代 aioredis) @@ -98,28 +97,28 @@ class RedisCache: # 构建连接参数 connection_kwargs = {} - # 如果使用 TLS + # 如果使用 TLS(redis-py的异步客户端使用特定的SSL参数,而不是ssl上下文) if self.use_tls or self.redis_url.startswith('rediss://'): - # 配置 SSL 上下文 - ssl_context = ssl.create_default_context() + # redis-py的异步客户端不支持直接传递ssl上下文 + # 而是使用ssl_cert_reqs、ssl_ca_certs等参数 + # 当URL是rediss://时,redis-py会自动启用SSL - # 设置证书验证要求 - if self.ssl_cert_reqs == 'none': - ssl_context.check_hostname = False - ssl_context.verify_mode = ssl.CERT_NONE - elif self.ssl_cert_reqs == 'optional': - ssl_context.check_hostname = False - ssl_context.verify_mode = ssl.CERT_OPTIONAL - else: # required - ssl_context.check_hostname = True - ssl_context.verify_mode = ssl.CERT_REQUIRED + # 设置证书验证要求(字符串格式:'required', 'optional', 'none') + connection_kwargs['ssl_cert_reqs'] = self.ssl_cert_reqs # 如果提供了 CA 证书路径 if self.ssl_ca_certs: - ssl_context.load_verify_locations(self.ssl_ca_certs) + connection_kwargs['ssl_ca_certs'] = self.ssl_ca_certs - connection_kwargs['ssl'] = ssl_context - logger.info(f"使用 TLS 连接 Redis: {self.redis_url}") + # 设置主机名验证(根据ssl_cert_reqs自动设置,但可以显式指定) + if self.ssl_cert_reqs == 'none': + connection_kwargs['ssl_check_hostname'] = False + elif self.ssl_cert_reqs == 'required': + connection_kwargs['ssl_check_hostname'] = True + else: # optional + connection_kwargs['ssl_check_hostname'] = False + + logger.info(f"使用 TLS 连接 Redis: {self.redis_url} (ssl_cert_reqs={self.ssl_cert_reqs})") # 如果 URL 中不包含用户名和密码,且提供了独立的用户名和密码参数,则添加到连接参数中 # 注意:如果 URL 中已经包含认证信息(如 redis://user:pass@host:port),则优先使用 URL 中的