TLS
Redis TLS 支持
从版本6开始,Redis支持SSL/TLS作为一个可选功能,需要在编译时启用。
入门指南
构建
要构建支持TLS的版本,您需要OpenSSL开发库(例如在Debian/Ubuntu上是libssl-dev
)。
使用以下命令构建Redis:
make BUILD_TLS=yes
测试
要使用TLS运行Redis测试套件,您需要TCL的TLS支持(即在Debian/Ubuntu上的tcl-tls
包)。
-
运行
./utils/gen-test-certs.sh
以生成根CA和服务器证书。 -
运行
./runtest --tls
或./runtest-cluster --tls
以在 TLS 模式下运行 Redis 和 Redis 集群测试。
手动运行
要手动以TLS模式运行Redis服务器(假设已调用gen-test-certs.sh
以便样本证书/密钥可用):
./src/redis-server --tls-port 6379 --port 0 \
--tls-cert-file ./tests/tls/redis.crt \
--tls-key-file ./tests/tls/redis.key \
--tls-ca-cert-file ./tests/tls/ca.crt
要使用redis-cli
连接到这个Redis服务器:
./src/redis-cli --tls \
--cert ./tests/tls/redis.crt \
--key ./tests/tls/redis.key \
--cacert ./tests/tls/ca.crt
证书配置
为了支持TLS,Redis必须配置一个X.509证书和一个私钥。此外,还需要指定一个CA证书包文件或路径,用于在验证证书时作为受信任的根。为了支持基于DH的加密算法,还可以配置一个DH参数文件。例如:
tls-cert-file /path/to/redis.crt
tls-key-file /path/to/redis.key
tls-ca-cert-file /path/to/ca.crt
tls-dh-params-file /path/to/redis.dh
TLS 监听端口
tls-port
配置指令允许在指定端口上接受 SSL/TLS 连接。这是除了在 port
上监听 TCP 连接之外的,因此可以同时使用 TLS 和非 TLS 连接在不同的端口上访问 Redis。
您可以指定port 0
以完全禁用非TLS端口。要仅在默认的Redis端口上启用TLS,请使用:
port 0
tls-port 6379
客户端证书认证
默认情况下,Redis使用相互TLS并要求客户端使用有效的证书进行身份验证(针对由ca-cert-file
或ca-cert-dir
指定的受信任根CA进行验证)。
您可以使用tls-auth-clients no
来禁用客户端认证。
复制
Redis主服务器以相同的方式处理连接的客户端和副本服务器,因此上述tls-port
和tls-auth-clients
指令也适用于复制链接。
在副本服务器端,需要指定tls-replication yes
以使用TLS与主服务器建立出站连接。
集群
当使用Redis集群时,使用tls-cluster yes
以启用集群总线和跨节点连接的TLS。
哨兵
Sentinel 继承了其网络配置来自常见的 Redis 配置,因此上述所有内容同样适用于 Sentinel。
当连接到主服务器时,Sentinel 将使用 tls-replication
指令来确定是否需要 TLS 或非 TLS 连接。
此外,相同的tls-replication
指令将决定Sentinel的端口(接受来自其他Sentinel的连接)是否也支持TLS。也就是说,只有在启用tls-replication
时,Sentinel才会配置tls-port
。
额外配置
额外的TLS配置可用于控制TLS协议版本、密码和密码套件等的选择。请查阅自文档化的redis.conf
以获取更多信息。
性能考虑
TLS 在通信栈中增加了一层,由于从/向 SSL 连接进行读写、加密/解密和完整性检查,会产生开销。因此,使用 TLS 会导致每个 Redis 实例可实现的吞吐量下降(更多信息请参阅此讨论)。
限制
目前不支持使用TLS的I/O线程。