本文基于Redis 6.0.9版本,前提至少 Redis 3.0或更高版本。
目录
1.加密(TLS支持)
1.1.入门
1.1.1.Building
1.1.2.Tests
1.2.手动运行
1.3.证书配置
1.4.TLS侦听端口
1.5.客户端证书认证
1.6.复制(Replication)
1.7.Cluster
1.8.哨兵(Sentinel)
1.9.附加配置
1.10.性能考量
1.11.局限性
1.加密(TLS支持)
Redis从版本6开始支持SSL/TLS,这是一项可选功能,需要在编译时启用。
1.1.入门
1.1.1.Building
要使用TLS支持进行构建,你将需要OpenSSL开发库(例如Debian/Ubuntu上的libssl-dev)。
运行make BUILD_TLS=yes
1.1.2.Tests
要使用TLS运行Redis测试套件,你需要为TCL提供TLS支持(即Debian/Ubuntu上的tcl-tls软件包)。
- 运行
./utils/gen-test-certs.sh
生成根CA和服务器证书。 - 运行
./runtest --tls
或./runtest-cluster --tls
,以TLS模式运行Redis和Redis群集测试。
1.2.手动运行
要以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
1.3.证书配置
为了支持TLS,必须为Redis配置X.509证书和私钥。 此外,在验证证书时,必须指定要用作可信根的CA证书捆绑文件或路径。 为了支持基于DH的密码,还可以配置DH params文件。 例如:
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
1.4.TLS侦听端口
tls-port配置伪指令可在指定端口上接受SSL/TLS连接。 除了侦听TCP连接的端口外,因此可以同时使用TLS和non-TLS连接访问不同端口上的Redis。
你可以指定port 0
以完全禁用 non-TLS 端口。 要仅在默认Redis端口上启用TLS,请使用:
port 0
tls-port 6379
1.5.客户端证书认证
默认情况下,Redis使用双向TLS,并要求客户端使用有效证书进行身份验证(根据由ca-cert-file或ca-cert-dir指定的受信任根CA进行身份验证)。
你可以使用tls-auth-clients no禁用客户端身份验证。
1.6.复制(Replication)
Redis主节点以相同的方式处理连接客户端和复制节点,因此上述tls-port和tls-auth-clients指令也适用于复制链接( replication links )。
在复制节点端,必须指定tls-replication yes
才能将TLS用于到主节点的传出连接。
1.7.Cluster
使用Redis群集时,请使用tls-cluster yes
以便为群集总线和跨节点连接启用TLS。
1.8.哨兵(Sentinel)
Sentinel从通用Redis配置继承其网络配置,因此上述所有内容也适用于Sentinel。
连接到主节点时,Sentinel将使用tls-replication
指令来确定是否需要TLS或non-TLS连接。
1.9.附加配置
可以使用其他TLS配置来控制TLS协议版本,密码(ciphers)和密码套件( cipher suites)等的选择。有关更多信息,请查阅自记录的redis.conf。
1.10.性能考量
TLS由于对SSL连接进行读写(writing/reading)操作,加密/解密(encryption/decryption)和完整性检查而给通信堆栈增加了一层开销。 因此,使用TLS会导致每个Redis实例可实现的吞吐量下降(有关更多信息,请参阅此讨论)。
1.11.局限性
TLS当前不支持I/O线程。