文档

传输加密

更新时间:

为了提高客户应用端和Hologres的传输链路安全性,您可以启用SSL(Secure Sockets Layer)传输加密。SSL通过使用数字证书和加密算法(如TLS)在Hologres实例和客户端之间建立加密连接,以保护数据传输过程中的机密性和完整性。

适用场景

SSL传输加密适用于以下场景:

  • 数据库远程访问:当客户端需要从远程位置访问数据库时,SSL传输加密可以提升数据传输过程中的安全性。

  • 符合安全合规要求:许多行业标准和法规要求在数据传输过程中使用加密技术,使用SSL传输加密可以帮助组织符合这些安全合规要求。

SSL传输在传输层对网络连接进行加密,能提升通信数据的安全性和完整性,但会同时增加网络连接响应时间。

前提条件

注意事项

  • Hologres V1.1及以上版本支持开启传输加密功能;V1.2及以上版本支持TLS;V2.1版本及以上版本,支持开启传输加密功能、支持使用CA证书的传输加密,并支持管理控制台自助开启。

    说明

    如果您的实例是V1.1以下版本,请您使用自助升级或加入Hologres钉钉交流群反馈,详情请参见如何获取更多的在线支持?

  • 开启或关闭SSL传输加密均需要重启实例,请谨慎操作。SSL传输加密默认情况为关闭状态。

    • Hologres开启SSL传输加密后,表示允许客户端通过SSL连接Hologres,在客户端连接Hologres时,可以选择加密或者不加密连接Hologres,但是需要显式指定。

    • Hologres关闭SSL传输加密后,仅支持通过非SSL方式连接。

  • Hologres对于SSL传输加密支持如下模式:

    SSL模式

    最低支持版本

    Require:只对数据链路加密。

    V1.1

    Verify-CA:加密数据链路,同时使用CA证书验证Hologres服务端的真实性。

    V2.1

    Verify-Full:加密数据链路,使用CA证书验证Hologres服务端的真实性,同时比对证书内的CN或DNS与连接时配置的Hologres连接地址是否一致。

    V2.1

  • SSL的证书有效期为1年,到期后需要手动更新证书有效期。否则到期后无法使用SSL传输加密连接实例。

  • 开启SSL传输加密后,会造成CPU使用率上升、读写时延增长。

  • 开启SSL传输加密后,已有连接需要断开重连,加密才会生效。

  • 开启、关闭SSL传输加密和更新SSL证书有效期,将会重启您的Hologres实例,用时约3分钟左右,请在业务低峰期操作。

步骤1:开启Hologres实例的传输加密

  1. 登录Hologres管理控制台,在左上方选择地域。

  2. 在左侧导航栏单击实例列表,然后单击目标实例ID。

  3. 在实例详情页面单击数据安全

  4. SSL页签,打开SSL 加密功能开关。

  5. 开通SSL链路加密对话框,单击开通SSL

步骤2:下载CA证书

Hologres提供实例CA证书供您下载,当您通过客户端远程连接Hologres实例时,使用实例CA证书可以对实例真伪进行校验。

  1. 登录Hologres管理控制台,在左上方选择地域。

  2. 在左侧导航栏单击实例列表,然后单击目标实例ID。

  3. 在实例详情页面单击数据安全

  4. SSL页签,单击下载证书

步骤3:连接Hologres

支持通过PSQL客户端和JDBC两种方式连接Hologres,在连接的过程中通过配置参数选择是否开启SSL连接传输加密。

使用PSQL命令行连接Hologres

  • 连接语句。

    PG_USER=<AccessKey ID> 
    PG_PASSWORD=<AccessKey Secret> 
    PG_SSLMODE=<SSL Mode> 
    PG_SSLROOTCERT=<certificate folder> 
    PGSSLMODE=$PG_SSLMODE PGSSLROOTCERT=$PG_SSLROOTCERT PGUSER=$PG_USER PGPASSWORD=$PG_PASSWORD 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:使用传输加密,只对数据链路加密。

    • verify-ca:加密数据链路,同时验证Hologres实例的真实性。

    • verify-full:加密数据链路,验证Hologres实例的真实性,同时比对证书内的CN或DNS与连接时配置的数据库连接地址是否一致。

    • disable:不使用传输加密。

    certificate folder

    CA证书的存储路径。

    如果SSL Mode参数配置的值为verify-caverify-full,需要配置此参数。

    Port

    Hologres实例的公共网络端口。

    示例取值80

    Endpoint

    Hologres实例的公共网络地址。

    示例取值xxx-cn-hangzhou.hologres.aliyuncs.com

    Database

    Hologres的数据库名称。

    开通Hologres实例后,系统自动创建postgres数据库。

    您可以使用postgres数据库链接Hologres,但是该数据库分配到的资源较少,开发实际业务建议您新建数据库。详情请参见创建数据库

    示例取值mydb

  • 连接验证。

    如果将PGSSLMODE设置为require,连接Hologres时出现如下提示,则表示已经使用SSL传输加密连接。传输加密

使用JDBC连接Hologres

您使用JDBC连接Hologres时,可以通过连接配置参数sslsslmode控制是否使用SSL传输加密。各参数的取值不同,在Hologres中的结果也不同,如下所示。

Hologres实例是否开启传输加密

ssl配置

sslmode配置

结果

true

  • require

  • verify-ca

  • verify-full

可以连接服务器,进行操作,数据传输过程中会使用传输加密。

false

  • require

  • verify-ca

  • verify-full

可以连接服务器,进行操作,数据传输过程中不会使用传输加密。

true

  • require

  • verify-ca

  • verify-full

报错,报错信息如下:

image.png

false

  • require

  • verify-ca

  • verify-full

可以连接服务器,进行操作,数据传输过程中不会使用传输加密。

代码样例如下。

 // 设置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访问
  properties.setProperty("ssl", "true");

  //设置证书授权机构的公钥名
  properties.setProperty("sslrootcert", path + "/" + "hologres_certificate.crt");

  // 配置ssl模式,可选值为require、verify-ca、verify-full
  properties.setProperty("sslmode", "verify-full");

  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();
  }