dot Redis 8 来了——而且是开源的

了解更多

启用与 Redis Enterprise 的安全连接

构建使用与服务器的安全连接的软件应该是每个开发人员都应掌握的技能。即使您选择不在特定的生产环境中启用 SSL,您也应该知道如何保护与您使用的每个服务器的连接。这篇文章是我们为 Java 爱好者承诺的后续文章,是在 Python 中启用与 Redis Enterprise Cloud 的安全连接

这篇文章介绍了开启、测试和配置 Redis Enterprise Cloud 和使用 SSL 的 Java 客户端程序之间的加密连接的简单过程。 为 Java 程序启用 SSL 令人困惑的部分之一是将证书和密钥转换为 Java 可以理解的格式。 这是我们必须在我们流程的测试和配置步骤之间偷偷进行的仅限 Java 的过程。

工具集

获取这些工具,以便您可以关闭在 Redis 上启用 SSL 的工单

您还需要安装 Bash shell,以便您可以运行我们提供的一个小脚本。 如果您的操作系统不包含 Bash 作为标准安装的一部分,您将需要安装它或将我们的脚本翻译成您喜欢的 shell。

要使用 SSL,您的 Redis Enterprise Cloud 订阅必须启用 SSL 功能。 如果您的帐户尚未启用 SSL,您将需要联系 Redis 支持团队以启用它。 您可以在您的帐户仪表板的主菜单中找到联系支持团队的链接。 设置 SSL 的文档可以在 Redis Enterprise Cloud 操作和管理指南中找到。

SSL 与 TLS

友情提示:正如我们在 Python 文章中提到的,我们将遵循非正式约定,使用首字母缩略词“SSL”来指代“SSL”或“TLS”安全连接。 即使 Redis Enterprise Cloud 目前(2018 年 6 月)使用 TLS 协议的 1.2 版本来保护连接,但 Redis Enterprise Cloud 和 Jedis 都使用“SSL”,因此我们将效仿。

步骤一和步骤二

前两个步骤与用于为 Python 客户端设置 SSL 的步骤相同。 我们不会在这里重复所有内容,而是将您链接回我们的 Python 文章。 该文章中有很多关于使用任何语言的 SSL 的有用信息。 我建议您在继续之前阅读第 3 步之前的所有内容。

Java 的过程在第 2 步之后开始有所不同,因此我们将在此处插入第 2.5 步,以将您从 Redis Enterprise Cloud 下载的凭证文件转换为与 JavaSE 配合良好的格式。

步骤 2.5:转换凭据

作为 JavaSE 的标准组成部分,Oracle 提供了各种安全服务,包括 Java 加密体系结构 (JCA)。 JCA 定义了一组 API,供 Java 应用程序调用由插件提供程序实现的安全服务。 应用程序可以自由使用任何可用的提供程序(他们通常提供超出标准 API 的额外服务),但大多数应用程序使用 JDK 附带的 默认提供程序

使用默认提供程序的挑战在于它们不支持 PEM 格式,PEM 格式通常与 Linux SSL 库一起使用来存储证书和密钥。 在 JCA 中,凭据材料存储在受密码保护的 密钥库 存储库中。 在 Java 应用程序中,通常使用两个存储库:一个在文档中称为密钥库,另一个称为信任库。 密钥库用于存储客户端软件的证书和私钥,而信任库用于存储来自证书颁发机构的可信证书。 Redis Enterprise Cloud 使用 PEM 格式,因此我们创建了一个使用 OpenSSL 和 Java Keytool 的脚本,以执行将您的 PEM 文件转换为可用于您的 Java 客户端程序的信任库和密钥库所需的所有命令。

以下脚本 transmogrify.sh 应从您解压缩 redis_credentials.zip 的目录运行。 该脚本使用 Redis 证书颁发机构证书 (redis_ca.pem) 创建信任库 (redis_truststore.p12),并使用客户端证书 (redis_user.crt) 和相应的私钥 (redis_user_private.key) 创建密钥库 (redisclient_keystore.p12)。 尽管客户端密钥库受到密码保护,您仍然应该采取措施来确保密钥库的安全性。 密钥库和信任库都需要分发给连接到特定 Redis 数据库实例的每个客户端,因此您将再次需要将这些文件集成到您的凭据管理系统中。

#!/bin/bash

echo -n "store password: "
read -s storepass
echo ""

## Create Truststore from PEM file
keytool -import -noprompt -trustcacerts -alias redislabs-ca -file redislabs_ca.pem -keystore redislabs_truststore.p12 -storepass $storepass -storetype PKCS12
keytool -list -keystore redislabs_truststore.p12 -storepass $storepass

## Create Keystore from certificate and private key
openssl pkcs12 -export -in redislabs_user.crt -inkey redislabs_user_private.key -out redisclient.p12 -passout pass:$storepass
keytool -importkeystore -noprompt -srckeystore redisclient.p12 -srcstoretype PKCS12 -srcstorepass $storepass -destkeystore redisclient_keystore.p12 -deststoretype PKCS12 -storepass $storepass
rm redisclient.p12
keytool -list -keystore redislabs_truststore.p12 -storepass $storepass

JDK9 之前的 Java 版本更喜欢专有的 Java KeyStore (JKS) 格式,但从 JDK9 开始,Java 默认使用行业标准 PKCS12 格式。 此脚本创建 PKCS12 格式的存储,但如果您可以修改脚本,请通过更改存储类型选项和文件扩展名来使用 JKS 格式。

步骤 3:在您的客户端代码中配置 SSL

在您的 Java 客户端中启用 SSL 的最后一步是修改客户端代码以建立 SSL 连接。 我们的示例代码将建立与我们的 Redis Enterprise Cloud 实例的安全连接,然后发送 Redis PING 命令。 我们修改后的代码如下所示

import redis.clients.jedis.Jedis;

public class SSLTest
{
    private static final String HOSTNAME = "your Redis Enterprise endpoint";
    private static final int PORT = 6379;

    public static void main (String[] args) {

        try {
           Jedis jedis = new Jedis(HOSTNAME, PORT, true);
           jedis.connect();
           jedis.auth("secret");

           System.out.println(jedis.ping());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

您会注意到,在代码中我们没有引用我们在第 2.5 步中为我们的 Java 程序创建的密钥库或信任库。 JCA 提供程序的默认行为会对服务器进行身份验证; 我们只需要提供我们的密钥和证书信息。 这可以使用 JCA 提供程序读取的系统属性来完成。 将以下参数添加到您的 IDE 应用程序配置或 java 命令行

-Djavax.net.debug=ssl:handshake
-Djavax.net.ssl.keyStoreType=PKCS12
-Djavax.net.ssl.keyStore=/Users/tague/dev/ssl-testj/redisclient_keystore.p12
-Djavax.net.ssl.keyStorePassword=redislabs
-Djavax.net.ssl.trustStoreType=PKCS12
-Djavax.net.ssl.trustStore=/Users/tague/dev/ssl-testj/redislabs_truststore.p12
-Djavax.net.ssl.trustStorePassword=redislabs

修改它们以使用您系统中的相应位置和密码。

密钥库属性

  • javax.net.ssl.keyStoreType=PKCS12
  • javax.net.ssl.keyStore=/Users/tague/dev/ssl-testj/redisclient_keyStore.p12
  • javax.net.ssl.keyStorePassword=redis

指定 transmogrify 脚本创建的密钥库的类型(又名格式)、位置和密码。 类似地,trustStore 属性

  • javax.net.ssl.trustStoreType=PKCS12
  • javax.net.ssl.trustStore=/Users/tague/dev/ssl-testj/redis_truststore.p12
  • javax.net.ssl.trustStorePassword=redis

指定 trustStore 的类型、位置和密码。 最后一个属性 javax.net.debug=ssl:handshake 是一个可选属性,用于启用调试信息。

配置 Jedis 以使用 SSL 并非特别困难,但如果您不熟悉将 PEM 凭证转换为 Java 密钥库和信任库所需的步骤,则一开始可能会令人反感。

希望这篇文章为我们的 Java 爱好者提供了与我们为 Python 开发人员提供的相同的关于设置与 Redis Enterprise Cloud 的安全连接的温和介绍。 我确实想给您留下关于安全性的最后提醒:大多数组织都有管理密码和私钥的特定策略和程序。 请务必与您的运营和安全团队联系,以确保您遵循他们的指南。