为了提高实时数仓Hologres的链路安全性,您可以启用SSL传输加密,SSL在传输层对网络连接进行加密,能提升通信数据的安全性和完整性,但会同时增加网络连接响应时间。本文为您介绍在Hologres如何配置SSL传输加密。
前提条件
- 已开通Hologres实例,开通方法请参见购买Hologres。
- 已下载安装PSQL客户端或者JDBC,详情请参见PSQL客户端或者JDBC。
使用限制
- 仅Hologres V1.1及以上版本支持开启传输加密功能,如果您的实例是V1.1以下版本,请您通过搜索(钉钉群号:32314975)加入实时数仓Hologres交流群申请升级实例。
- 开启或关闭SSL传输加密均需要重启实例,请谨慎操作。SSL传输加密默认情况为关闭状态。
- Hologres开启SSL传输加密后,表示允许客户端通过SSL连接Hologres,在客户端连接Hologres时,可以选择加密或者不加密连接Hologres,但是需要显式指定。
- Hologres关闭SSL传输加密后,仅支持通过非SSL方式连接。
- Hologres对于SSL传输加密有如下三种选项,目前仅支持Require模式。
- Require:只对数据链路加密。
- Verify-CA:加密数据链路,同时使用CA证书验证Hologres服务端的真实性。
- Verify-Full:加密数据链路,验证Hologres的真实性,同时比对证书内的CN或DNS与连接时配置的Hologres连接地址是否一致。
步骤1:开启Hologres实例的传输加密
使用传输加密功能需要后台开启配置,请您在使用之前搜索(钉钉群号:32314975)加入实时数仓Hologres交流群申请添加后台配置,并声明:请开启SSL传输加密配置。
步骤2:连接Hologres
支持通过PSQL客户端和JDBC两种方式连接Hologres,在连接的过程中通过配置参数选择是否开启SSL连接传输加密。
- 使用PSQL命令行终端SSL连接Hologres。
- 连接语句。
PGUSER=<AccessKey ID> PGPASSWORD=<AccessKey Secret> PGSSLMODE=<SSL Mode> psql -p <Port> -h <Endpoint> -d <Database>
- 参数说明。
参数 描述 AccessKey ID 当前阿里云账号的AccessKey ID。 您可以单击AccessKey 管理,获取AccessKey ID。
AccessKey Secret 当前阿里云账号的AccessKey Secret。 您可以单击AccessKey 管理,获取AccessKey Secret。
SSL Mode PSQL连接Hologres时传输加密的模式配置,取值及其含义如下。 - require:使用传输加密,只对数据链路加密。
- disable:不使用传输加密。
Port Hologres实例的公共网络端口。 示例取值
80
。Endpoint Hologres实例的公共网络地址。 示例取值
xxx-cn-hangzhou.hologres.aliyuncs.com
。Database Hologres的数据库名称。 开通Hologres实例后,系统自动创建postgres数据库。
您可以使用postgres数据库链接Hologres,但是该数据库分配到的资源较少,开发实际业务建议您新建数据库。详情请参见创建数据库。
示例取值
mydb
。 - 连接验证。
如果将PGSSLMODE设置为
require
,连接Hologres时出现如下提示,则表示已经使用SSL传输加密连接。
- 连接语句。
- 使用JDBC SSL连接Hologres。
您使用JDBC连接Hologres时,可以通过连接配置参数ssl和sslmode控制是否使用SSL传输加密。各参数的取值不同,在Hologres中的结果也不同,如下所示。说明 目前Hologres只支持将sslmode设置为
require
。Hologres实例是否开启传输加密 ssl sslmode 结果 是 true require 可以连接服务器进行操作,数据传输过程中会使用传输加密。 是 false require 可以连接服务器进行操作,数据传输过程中不会使用传输加密。 否 true require 报错,报错信息如下。 否 false require 可以连接服务器进行操作,数据传输过程中不会使用传输加密。 // 设置Hologres实例的连接地址 String hostname = "hgxxxxxxx-cn-hangzhou-vpc.hologres.aliyuncs.com:80"; // 设置Hologres实例的连接端口 String port = "80"; // 设置待连接的数据库名 String dbname = "postgres"; String jdbcUrl = "jdbc:postgresql://" + hostname + ":" + port + "/" + dbname+"?binaryTransfer=true"; Properties properties = new Properties(); // 设置连接数据库的用户名 properties.setProperty("user", "accessid"); //设置连接数据库的密码 properties.setProperty("password", "accesskey"); // 配置以SSL访问,true表示使用SSL连接,false表示不使用SSL连接 properties.setProperty("ssl", "true"); // 配置SSL模式,现在仅支持require properties.setProperty("sslmode", "require"); try { Class.forName("org.postgresql.Driver"); Connection connection = DriverManager.getConnection(jdbcUrl, properties); //本示例中,假设在postgres数据库中存在表example,此处以查询表example数据为例。 PreparedStatement preparedStatement = connection.prepareStatement("select * from " + "example"); ResultSet resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { ResultSetMetaData rsmd = resultSet.getMetaData(); int columnCount = rsmd.getColumnCount(); Map map = new HashMap(); for (int i = 0; i < columnCount; i++) { map.put(rsmd.getColumnName(i + 1).toLowerCase(), resultSet.getObject(i + 1)); } System.out.println(map); } } catch (Exception exception) { exception.printStackTrace(); }