This commit is contained in:
薇薇安 2026-01-18 10:24:15 +08:00
parent be8b24575b
commit 39bd335ee7

View File

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