【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證書的生成和上傳。
【生成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
【第四步】檢查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位的加密,還是比較可靠的。
希望能夠得到你的一個免費贊哦~~
最好就關注我拉~哈哈
本文章原創,轉載請注明出處。