【Redis數據庫開啟SSL加密】【小白指南】【生產環境可用】附帶Docker服務器配置和python連接Redis數據庫代碼(加密通訊版)

【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…