背景
传输层安全性协议(英语:Transport Layer Security,缩写作TLS),及其前身安全套接层(Secure Sockets Layer,缩写作SSL)是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。Redis6支持TLS,并且支持SSL。
1.目录设置
redis源码解压目录
/app/cachecloud/redis
测试环境:CENTOS7.3
redis版本:6.2.7
2.编译redis
要测试TLS,要在编译时选择编译TLS,跳转到redis源码解压目录,执行
make BUILD_TLS=yes
编译过程中出现如下错误:
ssl.c:45:25: 致命错误:openssl/ssl.h:没有那个文件或目录
#include <openssl/ssl.h>
这时要中断编译,先安装openssl
yum install openssl-devel
安装好 open-ssl
后再次执行make BUILD_TLS=yes
命令即可编译成功
3.生成测试证书
在源码目录执行生成证书脚本
[root@redis-7-109 ~]# cd /app/cachecloud/redis
[root@redis-7-109 redis]# ./utils/gen-test-certs.sh
Generating RSA private key, 4096 bit long modulus
……
生成后在tests/tls
目录下可以看到生成的证书文件
[root@redis-7-109 tls]# ls -l /app/cachecloud/redis/tests/tls/
总用量 44
-rw-r--r--. 1 root root 1879 7月 11 11:30 ca.crt
-rw-r--r--. 1 root root 3243 7月 11 11:30 ca.key
-rw-r--r--. 1 root root 17 7月 11 11:30 ca.txt
-rw-r--r--. 1 root root 1456 7月 11 11:30 client.crt
-rw-r--r--. 1 root root 1675 7月 11 11:30 client.key
-rw-r--r--. 1 root root 163 7月 11 11:30 openssl.cnf
-rw-r--r--. 1 root root 1399 7月 11 11:30 redis.crt
-rw-r--r--. 1 root root 424 7月 11 11:34 redis.dh
-rw-r--r--. 1 root root 1679 7月 11 11:30 redis.key
-rw-r--r--. 1 root root 1456 7月 11 11:30 server.crt
-rw-r--r--. 1 root root 1679 7月 11 11:30 server.key
4.启动和连接
使用tls模式启动redis服务,如下命令
[root@redis-7-109 tls]# cd /app/cachecloud/redis
[root@redis-7-109 redis]# ./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
--tls-port 6379
指定了tls端口为6379,--port 0
禁用非tls的端口。
连接tls模式redis服务,连接后可以正常执行命令
[root@redis-7-109 ~]# cd /app/cachecloud/redis
[root@redis-7-109 redis]# ./src/redis-cli --tls \
> --cert ./tests/tls/redis.crt \
> --key ./tests/tls/redis.key \
> --cacert ./tests/tls/ca.crt
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello
"world"
如果不使用tls模式直接连接tls模式的redis服务,虽然也可以正常连接,但是无法执行命令。
#客户端表现
[root@redis-7-109 ~]# redis-cli -p 6379
127.0.0.1:6379> get hello
Error: Connection reset by peer
#服务端表现
[root@redis-7-109 redis]# ./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
9591:C 11 Jul 2022 11:51:18.598 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
9591:C 11 Jul 2022 11:51:18.598 # Redis version=6.2.7, bits=64, commit=00000000, modified=0, pid=9591, just started
……省略……
9591:M 11 Jul 2022 11:51:18.612 * Ready to accept connections
9591:M 11 Jul 2022 11:51:43.594 # Error accepting a client connection: error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol (conn: fd=8)
9591:M 11 Jul 2022 11:51:50.771 # Error accepting a client connection: error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol (conn: fd=8)
9591:M 11 Jul 2022 14:02:37.069 # Error accepting a client connection: error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol (conn: fd=8)