为了提高实时数仓Hologres的链路安全性,您可以启用SSL传输加密,SSL在传输层对网络连接进行加密,能提升通信数据的安全性和完整性,但会同时增加网络连接响应时间。本文为您介绍在Hologres如何配置SSL传输加密。

前提条件

使用限制

  • 仅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时,可以通过连接配置参数sslsslmode控制是否使用SSL传输加密。各参数的取值不同,在Hologres中的结果也不同,如下所示。
    说明 目前Hologres只支持将sslmode设置为require
    Hologres实例是否开启传输加密 ssl sslmode 结果
    true require 可以连接服务器进行操作,数据传输过程中会使用传输加密。
    false require 可以连接服务器进行操作,数据传输过程中不会使用传输加密。
    true require 报错,报错信息如下。ssl报错信息
    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();
      }