【Redis数据库开启SSL加密】【填坑指南】附带服务器配置和python连接测试代码

本教程转为小白提供设置Redis安全访问,自签名证书进行安全访问你的Redis数据库,轻松实现安全访问和保护数据库不被非法入侵。
本文原创,转载请注明出处,谢谢~~

【宝塔配置Redis的容器——Docker】

用宝塔的话用应用商店直接安装:
在这里插入图片描述
傻瓜式下一步获得密码访问图一张:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

修改redis.conf文件,它来配置服务器的参数:
首先将前面几个基础的配置找到:

bind 0.0.0.0
protected-mode no
port 0
tls-port 6379

其它不用改,然后到文件最后添加:

# 以下为新增的TLS加密配置
# 服务器证书文件路径(替换为实际路径,若与redis.conf同目录可直接写文件名)
tls-cert-file /etc/redis/certs/redis.crt
# 服务器私钥文件路径
tls-key-file /etc/redis/certs/redis.key
# 信任的CA证书(自签名证书使用自身证书)
tls-ca-cert-file /etc/redis/certs/redis.crt# 允许的TLS协议版本(仅保留高安全性版本)
tls-protocols "TLSv1.2 TLSv1.3"
# 加密套件(选择高强度算法)
tls-ciphersuites "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256"
# 可选:强制客户端验证(根据需求开启)
#tls-auth-clients no

如果你懒得找,你可以复制我的,肯定没错:

bind 0.0.0.0
protected-mode no
port 0
tls-port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 16
always-show-logo no
set-proc-title yes
proc-title-template "{title} {listen-addr} {server-mode}"
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
rdb-del-sync-files no
dir ./
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync yes
repl-diskless-sync-delay 5
repl-diskless-load disabled
repl-disable-tcp-nodelay no
replica-priority 100
acllog-max-len 128
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
lazyfree-lazy-user-del no
lazyfree-lazy-user-flush no
oom-score-adj no
oom-score-adj-values 0 200 800
disable-thp yes
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
list-compress-depth 0
set-max-intset-entries 512
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
jemalloc-bg-thread yes
# 以下为新增的TLS加密配置
# 服务器证书文件路径(替换为实际路径,若与redis.conf同目录可直接写文件名)
tls-cert-file /etc/redis/certs/redis.crt
# 服务器私钥文件路径
tls-key-file /etc/redis/certs/redis.key
# 信任的CA证书(自签名证书使用自身证书)
tls-ca-cert-file /etc/redis/certs/redis.crt# 允许的TLS协议版本(仅保留高安全性版本)
tls-protocols "TLSv1.2 TLSv1.3"
# 加密套件(选择高强度算法)
tls-ciphersuites "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256"
# 可选:强制客户端验证(根据需求开启)
#tls-auth-clients no

保存后就可以尝试重启docker了。不过你别忘了,你还没有把证书文件放入,所以还要进行SSL证书的生成和上传。
重启redis的容器

【生成SSL 自签名证书】工具很多,Python代码也可以生成。

如果不适用python代码生成,那么可能需要下载‘openssl’或者‘cryptography’的安装包。我懒得找和下载,我已经有python环境了,所以就直接用python来自己生成。

第一步:建立项目文件夹

去D盘或者空路径建立文件夹,举个栗子哈:D:\TempFile\tls_cert_file, 在D盘TempFile目录下面建立tls_cert_file文件夹。

第二步:创建python的虚拟环境

在这里插入图片描述通过看图,可以光速完成环境和组件的下载和搭建。可能我配置了国内的镜像会快一点,你如果没有配置,可能需要配置一下pip的镜像。
如果你又不知道怎么找,那么我也为你准备了小白套餐:直接复制命令使用:(windows下,因为用linux的肯定不是小白了。)

python.exe -m venv venv
.\venv\Scripts\Activate.ps1
pip install pyopenssl -i https://mirrors.cloud.tencent.com/pypi/simple
pip install cryptography -i https://mirrors.cloud.tencent.com/pypi/simple

然后新建一个py代码文件:generate_ssl.py (代码内的信息根据自己的情况修改)

from cryptography.hazmat.primitives import serialization, hashes
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography import x509
from cryptography.x509.oid import NameOID
import datetime
import osdef generate_ssl_files():# 生成4096位RSA私钥private_key = rsa.generate_private_key(public_exponent=65537,key_size=4096,)# 保存私钥到文件(PEM格式)with open("redis.key", "wb") as f:f.write(private_key.private_bytes(encoding=serialization.Encoding.PEM,format=serialization.PrivateFormat.PKCS8,encryption_algorithm=serialization.NoEncryption()  # 不加密私钥# 如果需要加密私钥,替换为以下行(需设置密码):# encryption_algorithm=serialization.BestAvailableEncryption(b"your_password")))os.chmod("redis.key", 0o600)  # 限制访问权限# 生成证书签名请求(CSR)csr_builder = x509.CertificateSigningRequestBuilder().subject_name(x509.Name([x509.NameAttribute(NameOID.COUNTRY_NAME, "CN"),x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, "Beijing"),x509.NameAttribute(NameOID.LOCALITY_NAME, "Beijing"),x509.NameAttribute(NameOID.ORGANIZATION_NAME, "Example Company"),x509.NameAttribute(NameOID.ORGANIZATIONAL_UNIT_NAME, "IT Department"),x509.NameAttribute(NameOID.COMMON_NAME, "localhost"),]))# 添加扩展信息csr_builder = csr_builder.add_extension(x509.SubjectAlternativeName([x509.DNSName("localhost"),x509.DNSName("127.0.0.1"),]),critical=False,)# 签名CSRcsr = csr_builder.sign(private_key, hashes.SHA512())# 保存CSR到文件with open("redis.csr", "wb") as f:f.write(csr.public_bytes(serialization.Encoding.PEM))# 生成自签名证书cert_builder = x509.CertificateBuilder().subject_name(x509.Name([x509.NameAttribute(NameOID.COUNTRY_NAME, "CN"),x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, "Beijing"),x509.NameAttribute(NameOID.LOCALITY_NAME, "Beijing"),x509.NameAttribute(NameOID.ORGANIZATION_NAME, "Example Company"),x509.NameAttribute(NameOID.COMMON_NAME, "localhost"),])).issuer_name(x509.Name([  # 自签名,颁发者与主体相同x509.NameAttribute(NameOID.COMMON_NAME, "localhost"),])).public_key(private_key.public_key()).serial_number(x509.random_serial_number()  # 随机序列号).not_valid_before(datetime.datetime.now(datetime.timezone.utc)  # 生效时间(UTC)).not_valid_after(datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(days=365)  # 有效期1年)# 添加证书扩展cert_builder = cert_builder.add_extension(x509.BasicConstraints(ca=False, path_length=None), critical=True,).add_extension(x509.KeyUsage(digital_signature=True,key_encipherment=True,content_commitment=False,data_encipherment=False,key_agreement=False,key_cert_sign=False,crl_sign=False,encipher_only=False,decipher_only=False), critical=True,).add_extension(x509.ExtendedKeyUsage([x509.OID_SERVER_AUTH,  # 服务器认证x509.OID_CLIENT_AUTH   # 客户端认证]), critical=True,).add_extension(x509.SubjectAlternativeName([x509.DNSName("localhost"),x509.DNSName("127.0.0.1"),]), critical=False,)# 自签名证书certificate = cert_builder.sign(private_key, hashes.SHA512())# 保存证书到文件with open("redis.crt", "wb") as f:f.write(certificate.public_bytes(serialization.Encoding.PEM))print("成功生成4096位RSA密钥及证书(使用cryptography库):")print("私钥:redis.key")print("证书签名请求:redis.csr")print("自签名证书:redis.crt")if __name__ == "__main__":generate_ssl_files()

在虚拟环境中运行(请注意修改代码中的域名信息):

py generate_ssl.py成功生成4096位RSA密钥及证书:
私钥:redis.key
证书签名请求:redis.csr
自签名证书:redis.crt

在这里插入图片描述
将它们丢到服务器中手动创建的文件夹 certs中,并且修改一下权限。所有人可以访问但是不能修改。或者根据自己的需求调整权限。但是读取权限必须保证docker能够读取到。

【第三步】将证书和密钥上传到服务器,然后重启docker

重启redis的容器

【第四步】检查docker日志,

在这里插入图片描述

完成配置。

【测试是否可以正确访问,以及用代码如何访问Redis数据库服务器】

【在虚拟环境中,配置运行组件:redis】

用命令:pip install --upgrade redis 安装或者用 pip install --upgrade redis -i https://mirrors.cloud.tencent.com/pypi/simple
在这里插入图片描述

[编写python访问代码】

我测试了很多次,因为自己重头开始配置,中间遇到了很多神仙坑,花了几个小时爆肝才搞通,当然,【豆包】小姐功不可没。只是她的一点遗漏让我辛苦了很久。哎,说多了都是泪,作为我的读者,我就帮你们省下一点时间,让你更好地进行吧。
创建代码文件: test_redis_ssl_with_auth.py

import redis
import osdef test_redis_ssl_connection(host='你的ip或者域名', #自行修改port=26739, #自行修改cert_path='redis.crt', #这个证书文件的真实地址,我这里测试就放在同一目录下了。key_path='redis.key', #这个证书文件的真实地址,我这里测试就放在同一目录下了。server_password=None  # 服务器密码
):"""测试通过SSL连接Redis服务器(简化版,不涉及私钥密码)"""try:# 检查证书和密钥文件if not os.path.exists(cert_path):raise FileNotFoundError(f"证书文件不存在: {cert_path}")if not os.path.exists(key_path):raise FileNotFoundError(f"私钥文件不存在: {key_path}")# 配置连接参数(移除ssl_keyfile_password)print("尝试连接Redis服务器(SSL + 密码认证)")r = redis.Redis(host=host,port=port,password=server_password,  # 服务器密码ssl=True,ssl_certfile=cert_path,ssl_keyfile=key_path,ssl_cert_reqs='none', decode_responses=True)# 测试连接if r.ping():print("SSL连接成功!Redis服务器响应正常(已通过密码认证)")# 执行测试操作test_key = "ssl_test_key"test_value = "ssl_test_value"r.set(test_key, test_value)print(f"已设置键值: {test_key} = {test_value}")retrieved_value = r.get(test_key)print(f"获取到键值: {test_key} = {retrieved_value}")r.delete(test_key)print(f"已删除测试键: {test_key}")else:print("连接失败,服务器无响应")except redis.ConnectionError as e:print(f" {str(e)}")except redis.AuthenticationError as e:print(f"认证错误: 密码错误或未提供密码 - {str(e)}")except Exception as e:print(f"发生错误: {str(e)}")if __name__ == "__main__":test_redis_ssl_connection(host="你的ip或者域名", #记得修改port=26739,#记得修改server_password="czCikrrafkstXLsc"  # Redis服务器密码)

保存好代码,然后运行:

(venv) PS D:\TempFile\tls_cert_file> py ./test_redis_ssl_with_auth.py
尝试连接Redis服务器(SSL + 密码认证)
SSL连接成功!Redis服务器响应正常(已通过密码认证)
已设置键值: ssl_test_key = ssl_test_value
获取到键值: ssl_test_key = ssl_test_value
已删除测试键: ssl_test_key

【结束语】

完成了这一步,基本上Redis就可以开放使用了。因为设置了访问密码,别人想访问也不容易。因为用了加密SSL,所以想通过中间拦截攻击也不容易获取你的密码了。这样比较安全了。但是由于是自签名证书,相对来说比较没有安全保障,哈哈,但是它免费啊~~
为了保证安全性,我的代码特地使用了4096位的加密,还是比较可靠的。

希望能够得到你的一个免费赞哦~~
最好就关注我拉~哈哈
本文章原创,转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/93693.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/93693.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/93693.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

笔记本电脑键盘失灵【已解决】

配置环境硬件详情笔记本电脑联想拯救者y7000 2019 PG0(已更新为win11)外接键盘colorful ckb-p100问题今天笔记本开机后,进入登录页面输入密码,突然发现笔记本自带键盘(我通常不用外接键盘)的键失灵了&#…

postgresql运维问题解决:PG集群备节点状态异常告警处理

小亦平台会持续给大家科普一些运维过程中常见的问题解决案例,运维朋友们可以在常见问题及解决方案专栏查看更多案例 问题概述: 故障: pg数据库备节点状态异常现象: 一般为集群间心跳超时导致,现象为集群有fail-count失败数告警&…

Maven 开发实践

文章目录1. 搭建私服(windows)2.上传依赖3.多个远程仓库配置4.其它1. 搭建私服(windows) 软件下载 https://help.sonatype.com/en/download.html修改端口 etc/nexus-default.properties启动程序 管理员身份进入进入bin目录下执行.\nexus.exe /run创建Ma…

设计心得——如何架构选型

一、架构的作用 可能对于很多的公司,其实架构本身的重要性并不大。大家一定明白这回事,架构在实际的开发,在大多数的场景下其实用处并没有书籍和资料中讲的那样重要,甚至是可有可无。这样讲是不有些可笑?是不是觉得挺意…

vba学习系列(12)--反射率通过率计算复杂度优化25/8/17

系列文章目录 文章目录系列文章目录前言一、反射率通过率1.整体通过率2.整体通过率3.客户工艺匹配4.机台通过率分析5.镜片通过率罩次分析分析1.1分析1.26.镜片通过率圈数分析分析1.1分析1.28.镜筒通过率圈数分析分析1.1分析1.29.镜筒通过率罩次分析分析1.2总结前言 一、反射率通…

Microsoft WebView2

运行效果 代码如下 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Form…

GitCode 疑难问题诊疗:全方位指南

一、问题诊断与解决框架1.1 通用问题排查流程在面对 GitCode 问题时,遵循一套科学的排查流程至关重要。首先,详细记录问题出现时的具体操作步骤与相关报错信息,这有助于精准定位问题根源。例如,若在执行git push命令时出现错误&am…

AMD Ryzen AI Max+ 395四机并联:大语言模型集群推理深度测试

本文介绍使用四块Framework主板构建AI推理集群的完整过程,并对其在大语言模型推理任务中的性能表现进行了系统性评估。该集群基于AMD Ryzen AI Max 395处理器,采用mini ITX规格设计,可部署在10英寸标准机架中。 Jeff Geerling大佬还开发了名…

深度学习·GFSS

GFSS General Few-Shot Segmentation 任务实现方式与zero-shot有所不同本篇论文只涉及同一个模态(图像),训练过程中,novel class有几个图像提供,提供k个就称之为k-shot。先从图像中提取class prototype,然后这个原型向量作为查询&…

Transformer架构的数学本质:从注意力机制到大模型时代的技术内核

系列专栏推荐:零基础学Python:Python从0到100最新最全教程 深入浅出讲解神经网络原理与实现,从基础的多层感知机到前沿的Transformer架构。包含完整的数学推导、代码实现和工程优化技巧。 写在前面:为什么理解Transformer如此重要…

最新微信小程序一键获取真实微信头像和昵称方法

使用公开免费插件,快速实现获取用户头像和昵称,已附uniapp、微信开发工具开发详细教程。前言为了保护用户隐私,wx.getUserInfo、wx.getUserProfile都没法获取到用户头像和昵称了,只能通过设计用户主动选择/输入形式,操…

路由器配置之模式

文章目录配置路由器时,有一个模式选择最佳实践各个选项的区别11b only11g only11n only11bg mixed11bgn mixed配置路由器时,有一个模式选择 最佳实践 • 追求速度:选 11n only(需所有设备支持)。 • 兼容性优先&…

评测系统构建

合成数据更“科研驱动”,强调 controllability 和 generalization evaluation: 之前往往直接采用经典数据集如OGB和OGB-large提供的经典数据集和数据划分思路 该思想从现有真实数据中学习参数,再构造类似但分布略异的数据集,验证模…

【计算机网络面试】TCP/IP网络模型有哪几层

参考: 2.1 TCP/IP 网络模型有哪几层? | 小林coding | Java面试学习 以下为自己做的笔记 应用层 专注于为用户提供应用功能,如HTTP、FTP、Telnet、DNS、SMTP等。应用层不关心用户是怎么传输的,当两个设备间的应用需要通信时&…

3 种方式玩转网络继电器!W55MH32 实现网页 + 阿里云 + 本地控制互通

目录 1 前言 2 项目环境 2.1 硬件准备 2.2 软件准备 2.3 方案图示 3 例程修改 4 功能验证 5. 总结 1 前言 HTTP(超文本传输协议,HyperText Transfer Protocol)是一种用于分布式、协作式、超媒体信息系统的应用层协议, 基于 TCP/IP…

第四篇:科技封锁与文化渗透篇——T-501 与 M-208 双引擎布局(节奏增强版)

科技封锁与文化渗透篇——T-501 与 M-208 双引擎布局(节奏增强版) 引子 在全球竞争中,光有资本和市场远远不够。 • 科技封锁(T-501):通过技术标准、专利网络、供应链控制,让对手进入成本极高的…

python实现梅尔频率倒谱系数(MFCC) 除了傅里叶变换和离散余弦变换

语音识别第4讲:语音特征参数MFCC https://zhuanlan.zhihu.com/p/88625876/ Speech Processing for Machine Learning: Filter banks, Mel-Frequency Cepstral Coefficients (MFCCs) and What’s In-Between https://haythamfayek.com/2016/04/21/speech-processing-…

springBoot+knife4j+openapi3依赖问题参考

pom文件附带版本<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.12</version></parent><dependencies><!-- SpringDoc starter --><d…

XML DOM 高级

XML DOM 高级 引言 XML DOM(Document Object Model)是用于解析和操作XML文档的一种标准,它允许开发者通过编程方式访问和修改XML文档的内容。本文将深入探讨XML DOM的高级特性,包括XML解析、节点操作、事件处理以及性能优化等,帮助读者全面理解并掌握XML DOM的高级应用。…

「第18讲 内容生成应用场景与多语言支持」AI Agent开发与应用:基于大模型的智能体构建

第18讲核心内容概述内容生成应用场景营销文案生成&#xff1a;基于产品特征自动生成广告语、社交媒体文案&#xff0c;支持个性化推荐和A/B测试优化。新闻报道辅助&#xff1a;快速生成财经、体育等领域的结构化新闻摘要&#xff0c;结合实时数据更新内容。教育内容定制&#x…