视频

了解详情
构建使用安全连接到服务器的软件应该是每个开发人员都应该掌握的一项技能。即使您选择不在特定生产环境中启用 SSL,您也应该知道如何保护与您使用的每个服务器的连接。这篇文章是对 在 Python 中启用与 Redis Enterprise Cloud 的安全连接 的承诺后续,针对我们的 Java 粉丝。
这篇文章将介绍一个简单的方法,使用 SSL 在 Redis Enterprise Cloud 和 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。
在步骤 2 之后,Java 的流程开始有所不同,因此我们将在此处插入步骤 2.5,将您从 Redis Enterprise Cloud 下载的凭据文件转换为适合 JavaSE 的格式。
步骤 2.5:转换凭据
作为 JavaSE 的标准部分,Oracle 提供了各种安全服务,包括 Java 密码体系结构 (JCA)。JCA 定义了一组 API,用于 Java 应用程序调用由插件提供商实现的安全服务。应用程序可以自由使用任何可用的提供商(他们通常提供超出标准 API 的其他服务),但大多数应用程序使用与 JDK 一起提供的 默认提供商。
使用默认提供商的挑战在于,它们不支持 Linux SSL 库通常用来存储证书和密钥的 PEM 格式。在 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 密钥库 (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
修改它们以使用系统中的适当位置和密码。
密钥库属性
指定由 transmogrify 脚本创建的密钥库的类型(即格式)、位置和密码。类似地,trustStore 属性
指定信任库的类型、位置和密码。最后一个属性 javax.net.debug=ssl:handshake 是一个可选属性,用于启用调试信息。
配置 Jedis 以使用 SSL 并不特别困难,但如果您不熟悉将 PEM 凭据转换为 Java 密钥和信任库的必要步骤,可能会让人感到困惑。
希望这篇文章能像我们为 Python 开发人员提供的入门指南一样,为我们的 Java 粉丝提供关于设置与 Redis Enterprise Cloud 的安全连接的简单介绍。最后我想提醒您关于安全性的一件事:大多数组织都有关于管理密码和私钥的具体策略和程序。请务必与您的运维和安全团队联系,以确保您遵循他们的指南。