springboot通过ssl连接redis
1:先确认工程使用的是否是spring提供的RedisTemplate,该文章是基于org.springframework.data.redis.core.RedisTemplate来讲解的
2:把redis升级为通过ssl连接
> 参考:https://blog.csdn.net/Exception_sir/article/details/122047071
>
> #解压
> tar -zxvf redis-6.2.6.tar.gz -C /opt
>
> #进入/opt/redis-6.2.6/目录下进行编译安装
> cd /opt/redis-6.2.6/
>
> #要建立TLS通信,则必须要使用TLS支持进行构建,需要OpenSSL开发库
> make MALLOC=libc BUILD_TLS=yes
>
> #如果make报错,则需要先安装
> yum install openssl-devel
> yum -y install gcc gcc-c++ kernel-devel
>
> #make时还可能会报如下错误:
> cc: error: ../deps/hiredis/libhiredis.a: No such file or directory
> cc: error: ../deps/lua/src/liblua.a: No such file or directory
> cc: error: ../deps/jemalloc/lib/libjemalloc.a: No such file or directory
> make: *** [redis-server] Error 1
> 分别进入redis下的deps下的hiredis、lua 运行make
> 注意:jemalloc下可能要先运行./configure,然后make
> 回到src目录运行 make
> 还不行就把redis的解压包删了,重新解压再make
>
> #构建编译执行完成后,进行指定目录安装,将启动bin目录指定安装到/opt/redis 目录
> make PREFIX=/opt/redis install
>
> #添加环境变量
> echo 'PATH=/opt/redis/bin:$PATH' >> /etc/profile
> source /etc/profile
>
> #添加配置redis文件
> mkdir -p /opt/redis/conf
>
> #将自定义的配置文件上传到 /opt/redis/conf目录下,下方可参考个人使用的配置文件
> #为防止redis启动存在警告添加系统配置参数
> echo vm.overcommit_memory = 1 >> /etc/sysctl.conf;
> sysctl -p
>
> #分别创建日志存放目录及数据目录
> mkdir -p /opt/redis/logs
> mkdir -p /opt/redis/data
>
> #创建证书存放目录
> mkdir -p /opt/redis/ssl
>
> #分别生成CA证书及客户端证书,key等文件(openssl命令详解https://www.junmajinlong.com/linux/index/#blogopenssl)
> #生成4096位没有密码的RSA私有密钥
> openssl genrsa -out ca.key 4096
> #-x509:生成一个自签证书 -nodes:禁止对私钥进行加密 -sha256:使用sha256算法 -key:指定私钥的输入文件 -days:证书有效日期 -subj:替换或自定义证书请求时需要输入的信息,并输出修改后的请求信息 -out:证书请求或自签署证书的输出文件
> openssl req -x509 -new -nodes -sha256 -key ca.key -days 3650 -subj '/O=Redis Test/CN=Certificate Authority' -out ca.crt
> #生成2048位没有密码的RSA私有密钥
> openssl genrsa -out redis.key 2048
> #先生成一个使用sha256算法加密的自签证书,将其作为redis.crt的输入 openssl x509:主要用于输出证书信息,也能够签署证书请求文件、自签署、转换证书格式等 -days:证书有效期 -CA:指定签署时所使用的CA证书。该选项一般和"-req"选项一起使用,用于为证书请求文件签署 -CAkey:设置CA签署时使用的私钥文件 -CAserial:设置CA使用的序列号文件 -CAcreateserial:当使用该选项时,如果CA使用的序列号文件不存在将自动创建
> openssl req -new -sha256 -key redis.key -subj '/O=Redis Test/CN=Server' | openssl x509 -req -sha256 -CA ca.crt -CAkey ca.key -CAserial ca.txt -CAcreateserial -days 365 -out redis.crt
> #生成长度为2048的交换协议文件 openssl dhparam:用于生成和管理dh文件。dh(Diffie-Hellman)是著名的密钥交换协议,或称为密钥协商协议,它可以保证通信双方安全地交换密钥
> openssl dhparam -out redis.dh 2048
>
> #启动服务
> cd /opt/redis/
> ./bin/redis-server ./conf/redis.conf
>
> #测试通过ssl连接redis
> redis-cli --tls --cert /opt/redis/ssl/redis.crt --key /opt/redis/ssl/redis.key --cacert /opt/redis/ssl/ca.crt -p 6379
>
>
>
> docker集群部署ssl的redis,配置文件可以共用上面二进制安装的
> docker service create --name redis -p 6380:6379 --no-resolve-image --network testnet --mount type=bind,src=/opt/redis/,dst=/opt/redis/ harbor/redis:6 redis-server /opt/redis/conf/redis.conf --requirepass password@2021; \
>
3:代码适配
(1)引入maven依赖
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk15on</artifactId>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
</dependency>
(2)编写SSL工厂类
import javax.net.ssl.SSLSocketFactory;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.openssl.PEMDecryptorProvider;
import org.bouncycastle.openssl.PEMParser;
import org.bouncycastle.openssl.PEMEncryptedKeyPair;
import org.bouncycastle.openssl.PEMKeyPair;
import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
import org.bouncycastle.openssl.jcajce.JcePEMDecryptorProviderBuilder;
import org.springframework.core.io.ClassPathResource;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;