
KeyDB TLS 支持完全指南构建、测试、部署与连接抽象原理【免费下载链接】KeyDBA Multithreaded Fork of Redis项目地址: https://gitcode.com/GitHub_Trending/ke/KeyDBKeyDB 是一个以多线程、高吞吐为特色的 Redis 高性能分支其 TLSTransport Layer Security支持默认随构建开启并完整覆盖客户端连接、主从复制链路与集群总线。本文以仓库根目录下的 TLS.md 为主线结合 src/Makefile、src/config.cpp、src/tls.cpp、keydb.conf 与 utils/gen-test-certs.sh 等源码与配置系统讲解如何编译带 TLS 的 KeyDB、生成测试证书、手动启动 TLS 服务端与客户端、配置复制与集群场景下的 TLS并深入剖析背后的连接抽象层与多线程 TLS 特性。一、默认开启的 TLS 构建1.1 默认构建行为TLS 支持在 KeyDB 的默认构建中是开启的。从 src/Makefile 可以看到export BUILD_TLS ? yes即不显式指定BUILD_TLS时取默认值yes。当BUILD_TLSyes时src/Makefile 会向编译与链接阶段追加 OpenSSL 相关配置ifeq ($(BUILD_TLS),yes) FINAL_CFLAGS-DUSE_OPENSSL $(OPENSSL_CFLAGS) FINAL_CXXFLAGS-DUSE_OPENSSL $(OPENSSL_CXXFLAGS) FINAL_LDFLAGS$(OPENSSL_LDFLAGS) ... FINAL_LIBS ../deps/hiredis/libhiredis_ssl.a $(LIBSSL_LIBS) $(LIBCRYPTO_LIBS) endif因此默认构建依赖 OpenSSL 开发库Debian/Ubuntu 下为libssl-devREADME 的依赖安装命令中也包含libssl-dev。整个仓库的发行链路默认同样开启 TLSpkg/deb/debian/rules 与 pkg/deb/debian_dh9/rules 导出BUILD_TLSyespkg/docker/Dockerfile 与 pkg/docker/Dockerfile_Alpine 使用make BUILD_TLSyes ENABLE_FLASHyes。1.2 禁用 TLS 的构建如果希望构建不带 TLS 的版本只需在根目录执行make BUILD_TLSno此时 src/Makefile 的USE_OPENSSL分支不会生效src/tls.cpp 中会编译一组空实现tlsInit、tlsConfigure、connCreateTLS等均为 no-op 或返回NULL保证未开启 TLS 时相关调用安全降级。二、TLS 测试证书生成与测试套件2.1 先决条件TCL 的 TLS 支持要运行 KeyDB 的 TLS 测试套件需要 TCL 具备 TLS 支持即 Debian/Ubuntu 下的tcl-tls包sudo apt install tcl-tls2.2 生成测试证书运行仓库提供的证书生成脚本./utils/gen-test-certs.sh该脚本会在tests/tls/目录下生成一套完整的测试证书体系见 utils/gen-test-certs.sh文件用途tests/tls/ca.crt/ca.key自签名的根 CA 证书与私钥有效期 3650 天tests/tls/keydb.crt/keydb.key无 key usage/policy 限制的通用证书用于服务端与 CLI 通用场景tests/tls/client.crt/client.key仅限 SSL 客户端用途的证书tests/tls/server.crt/server.key仅限 SSL 服务端用途的证书tests/tls/keydb.dh2048 位 DH 参数文件脚本的生成逻辑包括根 CA使用openssl req -x509 -new -nodes -sha256生成主题为OKeyDB Test/CNCertificate Authority各业务证书openssl genrsa生成 4096 位私钥再通过openssl reqopenssl x509用 CA 签名有效期 365 天证书扩展通过脚本动态写出的tests/tls/openssl.cnf控制其中定义了subjectAltName包含san1.keydb.dev等 DNS、192.168.0.1等 IP、邮箱与 URI以及server_cert、client_cert两个扩展段分别设置nsCertType server与nsCertType client并附带keyUsage digitalSignature, keyEncipherment。生成client、client2两个客户端证书以及server、keydb证书其中keydb证书为通用证书仅追加req_ext扩展无用途限制这正是文档中“服务端与客户端共用同一份证书”场景的来源。2.3 运行 TLS 测试证书生成完毕后即可运行 TLS 模式的测试./runtest --tls # 运行 KeyDB 主测试套件TLS 模式 ./runtest-cluster --tls # 运行 KeyDB Cluster 测试TLS 模式runtest会以 TLS 模式拉起 keydb-server并让所有测试客户端通过 TLS 连接服务器从而验证协议兼容性、认证、复制等在加密链路下的行为。三、手动启动 TLS 服务端与客户端3.1 启动仅 TLS 的服务端在运行过gen-test-certs.sh之后可以手动启动一个仅监听 TLS 端口的 keydb-server./src/keydb-server --tls-port 6379 --port 0 \ --tls-cert-file ./tests/tls/client.crt \ --tls-key-file ./tests/tls/client.key \ --tls-ca-cert-file ./tests/tls/ca.crt参数含义--tls-port 6379在 6379 端口上开启 TLS 监听--port 0禁用普通 TCP 端口即上例中服务端只提供 TLS 服务--tls-cert-file/--tls-key-file服务端用于向对端证明身份的 X.509 证书与私钥PEM 格式--tls-ca-cert-file用于验证客户端证书的 CA 证书。3.2 用 keydb-cli 建立 TLS 连接./src/keydb-cli --tls \ --cert ./tests/tls/keydb.crt \ --key ./tests/tls/keydb.key \ --cacert ./tests/tls/ca.crt说明keydb-cli使用通用证书keydb.crt/keydb.key作为客户端证书并用ca.crt校验服务端证书链。这里的--cert、--key、--cacert等选项在 src/redis-cli.c 中被解析帮助文本列出如下src/redis-cli.c--tls Establish a secure TLS connection. --cacert file CA Certificate file to verify with. --cacertdir dir Directory where trusted CA certificates are stored. --cert file Client certificate to authenticate with. --key file Private key file to authenticate with. --tls-ciphers list Sets the list of prefered ciphers (TLSv1.2 and below) --tls-ciphersuites list Sets the list of prefered ciphersuites (TLSv1.3)3.3 TCP 与 TLS 并存上述命令通过--port 0禁用了 TCP。KeyDB 同样支持TCP 与 TLS 同时监听但二者必须使用不同的端口。例如./src/keydb-server --port 6379 --tls-port 16379 \ --tls-cert-file ./tests/tls/keydb.crt \ --tls-key-file ./tests/tls/keydb.key \ --tls-ca-cert-file ./tests/tls/ca.crt这样普通客户端连接 6379TLS 客户端连接 16379两套连接并行提供。对应地keydb.conf 也给出示例# port 0 # tls-port 6379即通过port 0tls-port 6379的组合把默认端口从 TCP 切换为 TLS。3.4 复制与集群场景的 TLS复制链路让 Replica 以 TLS 连接 Master使用--tls-replication yes集群总线让 KeyDB Cluster 节点之间通过 TLS 通信使用--tls-cluster yes。这两项都可以写进配置文件或作为命令行参数。当启用它们时服务端需要配置 CA 证书用于验证对端身份详见下文 4.1 的强制校验逻辑。四、TLS 配置参数全景来自 keydb.conf仓库自带的 keydb.conf 对 TLS/SSL 配置有非常完整的注释说明与 src/config.cpp 中的配置注册一一对应。以下按用途归类整理4.1 证书与密钥配置项默认值说明tls-cert-file空服务端 X.509 证书PEM用于向客户端、Master 或集群对端证明身份tls-key-file空与证书对应的私钥tls-key-file-pass空私钥文件的加密口令tls-client-cert-file/tls-client-key-file空用于出站连接复制、集群总线的独立客户端证书/私钥。默认 KeyDB 对服务端与客户端功能使用同一份证书仅当证书带 client-only / server-only 属性时才需要拆分tls-client-key-file-pass空客户端私钥口令tls-dh-params-file空DH 参数文件用于旧版 OpenSSL3.0的 DH 密钥交换新版 OpenSSL 不强制也不建议配置tls-ca-cert-file空验证 TLS 客户端与对端的 CA 证书 bundletls-ca-cert-dir空存放受信 CA 证书的目录强制校验逻辑从 src/tls.cpp 的实现看tlsConfigure在以下情况会直接失败并打日志未配置tls-cert-file报No tls-cert-file configured!未配置tls-key-file报No tls-key-file configured!当tls-auth-clients非no、或启用了tls-cluster/tls-replication时若tls-ca-cert-file与tls-ca-cert-dir均为空则报Either tls-ca-cert-file or tls-ca-cert-dir must be specified when tls-cluster, tls-replication or tls-auth-clients are enabled!。也就是说 KeyDB不会隐式使用系统级 CA 配置必须显式指定 CA 文件或目录见 keydb.conf。4.2 客户端认证配置项默认值说明tls-auth-clientsyes控制 TLS 端口上的客户端是否必须持有有效客户端证书yes默认必须且校验、no不要求也不接受、optional提供则必须有效但不强制4.3 协议与加密套件配置项默认值说明tls-protocolsTLSv1.2 TLSv1.3允许的 TLS 版本白名单如TLSv1.2 TLSv1.3。源码中协议位定义与安全默认值见 src/tls.cpp支持 TLSv1 / TLSv1.1 / TLSv1.2 / TLSv1.3默认开启 TLSv1.2 与 TLSv1.3tls-ciphersOpenSSL 默认仅对 TLSv1.2 及以下生效的密码套件列表语法见ciphers(1ssl)手册例如DEFAULT:!MEDIUMtls-ciphersuitesOpenSSL 默认TLSv1.3 的 ciphersuites例如TLS_CHACHA20_POLY1305_SHA256tls-prefer-server-ciphersno选密码时优先服务端偏好而非客户端偏好4.4 会话缓存与证书轮换配置项默认值说明tls-session-cachingyes是否启用 TLS 会话缓存以加速客户端重连。源码在 src/tls.cpp 中根据该开关设置SSL_SESS_CACHE_SERVER或SSL_SESS_CACHE_OFFtls-session-cache-size20480缓存的最大会话数0表示不限大小。注册默认值见 src/config.cpptls-session-cache-timeout300缓存会话的超时秒数见 src/config.cpptls-rotationno是否监视磁盘上的证书文件发生变化时自动轮换证书tls-allowlist空允许连接的 CN/SAN 白名单支持 IPv4、DNS、RFC822、URI 类型且支持 glob 通配如*.com。未指定则不启用白名单接受所有证书4.5 集群相关配置项说明cluster-announce-tls-port集群节点对外公布的 TLS 端口src/config.cpp仅在tls-cluster为 yes 时生效五、连接抽象层与多线程 TLS5.1 连接抽象层正如 TLS.md 的 “Connections” 一节所述所有 socket 操作现在都经过一个连接抽象层它向调用方屏蔽了 I/O 与读写事件处理的差异。无论底层是普通 TCP 还是 TLS上层网络读写、事件回调、复制、集群等都使用同一套连接接口。该抽象层的主要实现位于 src/tls.cppTLS 连接封装了 OpenSSL 的SSL*对象通过tlsHandleEvent如 src/tls.cpp 中批量处理可读事件将 OpenSSL 的加解密状态机桥接到 KeyDB 的事件循环之上connTLSGetPeerCertsrc/tls.cpp可从连接中取出对端 PEM 格式证书供认证与审计使用。事件循环、内存分配与协议解析完全复用既有基础设施TLS 只是作为底层传输的一种实现。5.2 与 Redis 的关键差异TLS 连接的多线程支持文档中特别强调了一个关键差异Note that unlike Redis, KeyDB fully supports multithreading of TLS connections.即与 Redis 不同KeyDB 完整支持 TLS 连接的多线程处理。KeyDB 的多线程架构会把每个 accept 进来的连接分配到某个 server 线程网络 I/O 与查询解析在各线程上并发执行。TLS 加解密天然是每连接独立状态SSL*属于单个连接因此 TLS 连接同样可以被安全地分发到不同线程并行处理不会因为引入 TLS 而退化为单线程瓶颈。5.3 未启用 OpenSSL 时的降级实现当以BUILD_TLSno构建时src/tls.cpp 提供一组空实现tlsInit、tlsCleanup、tlsConfigure返回C_OK、connCreateTLS返回NULL等并且 src/config.cpp 中所有 TLS 配置项都包裹在#ifdef USE_OPENSSL之内——未编译 TLS 时这些配置项根本不会注册。因此无需 TLS 的最小构建不会引入 OpenSSL 依赖行为保持干净。六、待办清单与多端口考量6.1 当前已知限制To-Do ListTLS.md 明确列出了 TLS 支持的两项待办keydb-benchmark 的 TLS 支持当前keydb-benchmark实现是 hiredis 解析与基本网络建连的混合体大部分动作直接操作 socket尚未接入 TLS。文档建议的最佳改造路径是迁移到 hiredis async 模式以复用其 TLS 能力keydb-cli 的--slave与--rdb支持这两个子命令场景尚未覆盖 TLS。这两项说明 TLS 支持在 CLI 工具侧仍有收敛空间服务端 TLS 能力本身是完整可用的。6.2 多端口Multi-port设计考量TLS.md 的 “Multi-port” 一节提出允许把 TLS 配置在独立端口、让 KeyDB 同时监听多个端口需要考虑以下联动点启动横幅Startup banner的端口提示需要正确展示 TCP 与 TLS 两个监听端口进程标题Proctitle进程标题应反映多端口状态便于运维识别Replica 如何对外宣告自己announce主从复制中节点向 Master/其他节点宣告的地址端口需区分 TCP 与 TLS集群总线端口计算Cluster bus port calculation集群总线端口通常由监听端口推导而来多端口场景下需保证总线端口与 TLS 端口的映射正确。从配置侧看keydb.conf 中cluster-announce-tls-port的注释也印证了这一点集群场景下对外公布的 TLS 端口需要单独配置普通cluster-announce-port只覆盖 TCP 场景。七、从零到一的完整实践流程综合以上内容一次完整的 TLS 落地可以按如下顺序执行# 1. 准备依赖Debian/Ubuntu sudo apt install build-essential nasm autotools-dev autoconf libjemalloc-dev \ tcl tcl-dev uuid-dev libcurl4-openssl-dev libbz2-dev libzstd-dev \ liblz4-dev libsnappy-dev libssl-dev tcl-tls # 2. 默认构建已含 TLS如需禁用则 make BUILD_TLSno make # 3. 生成测试证书 ./utils/gen-test-certs.sh # 4. 运行 TLS 测试套件 ./runtest --tls ./runtest-cluster --tls # 5. 手动启动仅 TLS 的服务端 ./src/keydb-server --tls-port 6379 --port 0 \ --tls-cert-file ./tests/tls/keydb.crt \ --tls-key-file ./tests/tls/keydb.key \ --tls-ca-cert-file ./tests/tls/ca.crt # 6. 用 TLS 客户端连接 ./src/keydb-cli --tls \ --cert ./tests/tls/keydb.crt \ --key ./tests/tls/keydb.key \ --cacert ./tests/tls/ca.crt生产环境建议使用自己的 CA 与证书替换tests/tls/下的测试证书并显式配置tls-protocols、tls-ciphers/tls-ciphersuites与tls-allowlist以收紧安全策略主从与集群场景分别开启tls-replication yes与tls-cluster yes并确保 CA 文件路径配置正确。参考资源仓库内TLS.md本文的主题文档TLS 支持的总览说明keydb.conf完整的 TLS/SSL 配置示例与逐项注释src/config.cppTLS 配置项注册与默认值定义src/tls.cppTLS 连接抽象层的核心实现OpenSSL 上下文创建、证书加载、事件处理、Peer 证书获取src/MakefileBUILD_TLS构建开关与 OpenSSL 链接逻辑utils/gen-test-certs.sh测试 CA 与证书生成脚本src/redis-cli.ckeydb-cli 的 TLS 命令行参数解析与帮助文本。【免费下载链接】KeyDBA Multithreaded Fork of Redis项目地址: https://gitcode.com/GitHub_Trending/ke/KeyDB创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考