如何使用SSL/TLS与Redis企业万博体育彩

标题

在这篇文章中,你将看到如何使用SSL(安全套接字层)保护你的Redis数据库。在生产环境中,总是建议使用SSL来保护在不同计算机(客户端应用程序和Redis服务器)之间移动的数据。传输级别安全(TLS)保证只允许应用程序/计算机连接到数据库,而且数据不会被中间商进程查看或更改。

您可以使用以下内容确保客户端应用程序和redis群集之间的连接

  • 单向SSL:客户端(你的应用程序)从服务器(Redis集群)获得证书,验证它,然后所有通信都被加密
  • 双向SSL :( AKA相互SSL)在这里,客户端和服务器彼此身份验证并验证两端是否可信赖。

在本文中,我们将专注于双向SSL,并使用Redis Enterprise。万博体育彩

先决条件

  • re万博体育彩dis Enterprise 6.0.x数据库,(我的数据库受到密码的保护secretdb01,并监听端口12000.
  • redis-cli运行基本命令
  • Python节点, 和java.如果要测试各种语言,请安装。

简单的测试

让我们确保数据库可用:

Redis-CLI -P 12000 -A SecretDB01信息服务器

这将打印服务器信息。

步骤1。从Redis集群获取证书

假设你可以访问Redis企业集群,你需要访问节点来检索证书(这是一个自生成的默万博体育彩认证书)。

群集证书位于:/etc/opt/redislabs/proxy_cert.pem.

接下来,在每个客户端机器上复制集群证书;注意,一旦完成,您就可以使用此证书来使用“单向SSL”进行连接,但这不仅仅是本文的目的。

在本教程中,我们将使用Docker来复制证书。

码头工人cp redis-node1: / etc / opt / redislabs / proxy_cert。pem。/证书

步骤2。生成新的客户端证书

使用双向SSL,您需要为客户端使用redis数据库代理使用的客户端来信任客户端。在本教程中,我们将使用openssl使用自签名证书。我们将为命名的应用程序创建证书app_001.请注意,您可以创建任意数量的证书,或者将此证书重用于所有服务器/应用程序。

打开终端,执行如下命令:

openssl req.
- 数字
newkey rsa: 2048
-keyout client_key_app_001.PEM.
x509
36500
两级client_cert_app_001.pem

此命令生成一个新的客户端密钥(client_key_001.PEM.)及证书(client_cert_001.pem.),没有密码。

步骤3。配置Redis数据库

下一步是拍摄证书并将其添加到要保护的数据库中。

让我们复制证书并将其粘贴到Redis企业Web控制台。万博体育彩

将证书复制到剪贴板中:

麦克:

pbcopy < client_cert_app_001.pem.

Linux:

XClip -sel剪辑 < client_cert_app_001.pem.

窗口:

剪辑 < client_cert_app_001.pem.

转到Redis En万博体育彩terprise Admin Web控制台并在数据库上启用TLS:

  1. 编辑数据库配置
  2. 检查TL.
  3. 选择“对所有通信要求TLS”
  4. 检查“强制客户端身份验证”
  5. 将证书粘贴到文本区域
  6. 单击Save按钮保存证书
  7. 单击Update按钮保存配置。

安全配置

数据库现在受到保护,并且必须使用SSL证书连接到它。

Redis-CLI -P 12000 -A SecretDB01信息服务器
(错误)ERR未加密连接被禁止

步骤4.使用证书连接到数据库

在所有这些示例中,您将使用“自签名”证书,因此不需要检查主机名的有效性。您应该根据证书配置调整连接/TLS信息。

步骤4.1使用Redis-CLI

使用。连接到受SSL保护的数据库redis-cli你必须使用st

创建一个stunnel.conf文件包含以下内容:

cert = /path_to/certificates/client_cert_app_001.pem.
关键= / path_to /证书/ client_key_app_001.pem
cafile = / path_to /证书/ proxy_cert.pem
客户= yes
(redislabs)
接受= 127.0.0.1:6380
连接= 127.0.0.1:12000

使用该命令启动stunnel

stunnel。/ stunnel.conf

这将启动一个监听端口的进程6380.并用作端口上的Redis Enterprise数据库的万博体育彩代理12000.

Redis-CLI -P 6380 -A SecretDB01信息服务器

步骤4.2使用python

使用Python,您必须设置SSL连接参数:

#!/usr/local/bin/python3
进口 redis.
进口 pprint
尝试
r redis. StrictRedis
密码 'secretdb01'
decode_responses 真正的
主持人 “localhost”
港口 12000.
SSL. 真正的
ssl_keyfile. './client_key_app_001.pem'
ssl_certfile. ”。/ client_cert_app_001.pem '
ssl_cert_reqs “要求”
ssl_ca_certs. ”。/ proxy_cert.pem '
信息 r 信息
pprint pprint 信息
除了 异常 作为 犯错
打印 "连接到Redis错误:{}" 格式 犯错

更多信息见文档"在Python中使用Redis".

步骤4.3使用node.js

节点复述,,可以使用TLS库来配置客户端连接:

var. redis. 需要 “redis”
var. tls 需要 tls的
var. fs 需要 “fs”
var. SSL.
钥匙 fs readFileSync '../certificates/client_key_app_001.pem' 编码 'ascii'
证明 fs readFileSync '../certificates/client_cert_app_001.pem' 编码 'ascii'
ca fs readFileSync “. . /证书/ proxy_cert.pem” 编码 'ascii'
checkServerIdentity => 返回 空值
var. 客户端 redis. createClient 12000. “127.0.0.1”
密码 'secretdb01'
tls SSL.
客户端 信息 “服务器” 功能 犯错 回复
安慰 日志 回复

更多信息见文档"通过Node.js使用Redis".

步骤4.4使用Java

在Java中,能够使用SSL连接,您必须使用Java环境中的所有证书使用keytool.实用程序。

创建一个keystore.存储您先前创建的密钥和证书的文件:

openssl pkcs12 -export \
——。/ client_cert_app_001。pem \
-inkey ./client_key_app_001.pem \
两级客户机密钥库。p12 \
- 名称“app_01_p12”

您可以看到密钥库用于存储与您联系的凭据;它将在以后使用-javax.net.ssl.keystore.Java应用程序中的系统属性。

除了密钥删除之外,您还必须创建一个信任存储,用于存储其他凭证,例如在我们的示例中,redis集群证书。

创建一个信托商店文件并将Redis Cluster证书添加到其中

keytool -genkey \
-dname \“cn = CLIENT_APP_01”
别名truststorekey \
-keyalg rsa \
keystore。/ client-truststore。p12 \
keypass秘密
对于storepass秘密
-storetype pkcs12.
keytool进口\
keystore。/ client-truststore。p12 \
-file ./proxy_cert.pem \
别名redis-cluster-crt

+稍后将使用该值-javax.net.ssl.trustStoreJava应用程序中的系统属性。

现在,您可以使用以下环境变量运行Java应用程序:

java -djavax.net.sl.keystore = / path_to /证书/ java / client-keystore.p12 \
-Djavax.net.ssl.keyStorePassword =秘密\
-Djavax.net.ssl.trustStore = / path_to /证书/ java / client-truststore.p12 \
-Djavax.net.ssl.trustStorePassword =秘密\
jar MyApp.jar

对于此示例和简单性,我将在Java代码本身中硬代码这些属性:

进口 redis. 客户
进口 java. URI
公共 SSLTest
公共 静态 空白 主要 字符串 arg游戏
系统 setProperty. “javax.net.ssl.keyStore” “/path_to/certificates/client-keystore.p12”
系统 setProperty. “javax.net.ssl.keystorepassword” “秘密”
系统 setProperty. “javax.net.ssl.trustStore” “/path_to/certificates/client-truststore.p12”
系统 setProperty. “javax.net.ssl.trustStorePassword” “秘密”
URI uri URI 创建 “rediss://127.0.0.1:12000”
新的 uri
身份验证 “secretdb01”
系统 println. 信息 “服务器”
关闭
  • 第8-12行,系统环境变量被设置为指向密钥存储库和信任存储库(应该外部化)
  • 第14行,Redis URL以rediss有2秒表示连接应该加密
  • 第17行,设置数据库密码

更多信息见文档"使用redis与java".

结论

在本文中,您将学习如何:

  • 检索redis服务器证书
  • 生成客户证书
  • 通过两种方式的身份验证来保护您的数据库,以加强传输级别安全性(TLS)
  • 从连接到数据库redis-cli,python,node和java

参考文献

Baidu