在使用客户端程序连接数据库时,您可以启用SSL加密功能提高数据链路的安全性,保障数据的完整性。您可以根据自身应用特点选用任何兼容Redis协议的客户端程序。本文列举一些常见的客户端程序的代码示例,帮助您快速连接。

前提条件

实例已开启SSL加密,具体操作,请参见设置SSL加密

注意事项

  • 如果您的Redis实例为集群架构读写分离架构,实例默认会提供Proxy(代理)节点的连接地址,连接方式与连接标准架构的Redis实例相同。
    说明 集群架构的实例通过直连地址连接时,连接方式与连接开源Redis Cluster相同。
  • 如果实例开启了专有网络免密访问,同一专有网络下的客户端程序无需设置密码即可连接Redis实例。

准备工作

  1. 根据客户端程序的部署位置,完成下述操作:
    客户端程序部署位置 需完成的操作
    ECS实例(推荐)
    1. 确保ECS实例与Redis实例属于同一专有网络(即实例基本信息中的专有网络ID一致)。
      说明
    2. 获取ECS实例的内网IP地址。具体操作,请参见查询ECS实例的IP地址
    3. 将ECS实例的内网IP地址添加至Redis实例的白名单中。具体操作,请参见设置白名单
    本地
    1. Redis实例默认仅提供内网连接地址,通过公网连接时您需要手动申请公网连接地址。具体操作,请参见申请公网连接地址
    2. 在本地客户端所属的设备上执行curl ipinfo.io |grep ip获取其公网IP地址,返回示例如下:查看公网IP结果
      说明 如果本地客户端所属设备为Windows操作系统,您可以访问ipinfo获取公网地址。
    3. 将本地客户端的公网IP地址添加至Redis实例的白名单中。具体操作,请参见设置白名单
  2. 获取以下信息并设置在客户端程序的代码中:
    需获取的信息 获取方式
    实例的连接地址 Redis实例支持多种连接地址,推荐使用专有网络连接,可获得更高的安全性和更低的网络延迟。更多信息,请参见查看连接地址
    端口号 端口号默认为6379,您也可以自定义端口号。具体操作,请参见修改连接地址或端口
    实例的账号(部分客户端程序无需设置) Redis实例默认会创建一个以实例ID命名的账号(例如r-bp10noxlhcoim2****),您也可以创建一个新的账号并赋予权限。更多信息,请参见创建与管理账号
    账号的密码

    根据选取账号的不同,密码的填写格式有一定区别:

    • 默认账号(即以实例ID命名的账号):直接填写密码即可。
    • 新创建的账号:密码格式为<user>:<password>。例如自定义账号为testaccount,密码为Rp829dlwa,密码需填写为testaccount:Rp829dlwa
    说明 如果忘记密码,请参见修改或重置密码
  3. 下载CA证书,参见设置SSL加密

Java

下述示例代码以Jedis客户端的3.6.0版本为例,推荐使用最新版本。

说明 您需要根据注释提示修改代码。关于如何获取Redis实例的连接地址、端口号、密码,请参见准备工作中的步骤2
import java.io.FileInputStream;
import java.io.InputStream;
import java.security.KeyStore;
import java.security.SecureRandom;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

public class JedisSSLTest {
    private static SSLSocketFactory createTrustStoreSSLSocketFactory(String jksFile) throws Exception {
        KeyStore trustStore = KeyStore.getInstance("jks");
        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream(jksFile);
            trustStore.load(inputStream, null);
        } finally {
            inputStream.close();
        }

        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("PKIX");
        trustManagerFactory.init(trustStore);
        TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();

        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, trustManagers, new SecureRandom());
        return sslContext.getSocketFactory();
    }

    public static void main(String[] args) throws Exception {
        //ApsaraDB-CA-Chain.jks为证书文件名称
        final SSLSocketFactory sslSocketFactory = createTrustStoreSSLSocketFactory("ApsaraDB-CA-Chain.jks");
        //连接池的设置分别为实例的连接地址、端口号、超时设置、密码
        JedisPool pool = new JedisPool(new GenericObjectPoolConfig(), "r-bp1zxszhcgatnx****.redis.rds.aliyuncs.com",
            6379, 2000, "redistest:Test1234", 0, true, sslSocketFactory, null, null);

        try (Jedis jedis = pool.getResource()) {
            jedis.set("key", "value");
            System.out.println(jedis.get("key"));
        }
    }
}

Python

下述示例代码以redis-py客户端为例,推荐使用最新版本。

说明 您需要根据注释提示修改代码。关于如何获取Redis实例的连接地址、端口号、密码,请参见准备工作中的步骤2
#!/bin/python
import redis

#设置连接信息,分别将host、port、password的值分别替换为实例的连接地址、端口号、密码
#ApsaraDB-CA-Chain.pem为证书文件名称
client = redis.Redis(host="r-bp1zxszhcgatnx****.redis.rds.aliyuncs.com", port=6379,
                     password="redistest:Test1234", ssl=True,
                    ssl_cert_reqs="required", ssl_ca_certs="ApsaraDB-CA-Chain.pem")

client.set("hello", "world")
print client.get("hello")
#!/bin/python
import redis

#设置连接池,分别将host、port、password的值分别替换为实例的连接地址、端口号、密码
#ApsaraDB-CA-Chain.pem为证书文件名称
pool = redis.ConnectionPool(connection_class=redis.connection.SSLConnection, max_connections=100,
                            host="r-bp1zxszhcgatnx****.redis.rds.aliyuncs.com", port=6379, password="redistest:Test1234",
                            ssl_cert_reqs=True, ssl_ca_certs="ApsaraDB-CA-Chain.pem")
client = redis.Redis(connection_pool=pool)
client.set("hi", "redis")
print client.get("hi")

PHP

以下示例以predis客户端为例,推荐使用最新版本。如果您使用的是phpredis客户端,连接示例请参见此issue

说明 您需要根据注释提示修改代码。关于如何获取Redis实例的连接地址、端口号、密码,请参见准备工作中的步骤2
<?php

require __DIR__.'/predis/autoload.php';

/* 设置连接信息,分别将host、port、password的值分别替换为实例的连接地址、端口号、密码
ApsaraDB-CA-Chain.pem为证书文件名称*/
$client = new Predis\Client([
    'scheme' => 'tls',
    'host'   => 'r-bp1zxszhcgatnx****.redis.rds.aliyuncs.com',
    'port'   => 6379,
    'password' => 'redistest:Test1234',
    'ssl'    => ['cafile' => 'ApsaraDB-CA-Chain.pem', 'verify_peer' => true],
]);
/* 依次替换下述代码中的连接地址和端口 */
//$client = new Predis\Client('tls://r-bp1zxszhcgatnx****.redis.rds.aliyuncs.com:6379?ssl[cafile]=ApsaraDB-CA-Chain.pem&ssl[verify_peer]=1');

$client->set("hello", "world");
print $client->get("hello")."\n";

?>