为了提高客户应用端和Hologres的传输链路安全性,您可以启用SSL(Secure Sockets Layer)传输加密。SSL通过使用数字证书和加密算法(如TLS)在Hologres实例和客户端之间建立加密连接,以保护数据传输过程中的机密性和完整性。
适用场景
SSL传输加密适用于以下场景:
数据库远程访问:当客户端需要从远程位置访问数据库时,SSL传输加密可以提升数据传输过程中的安全性。
符合安全合规要求:许多行业标准和法规要求在数据传输过程中使用加密技术,使用SSL传输加密可以帮助组织符合这些安全合规要求。
SSL传输在传输层对网络连接进行加密,能提升通信数据的安全性和完整性,但会同时增加网络连接响应时间。
前提条件
已开通Hologres实例,开通方法请参见购买Hologres。
注意事项
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实例的传输加密
登录Hologres管理控制台,在左上方选择地域。
在左侧导航栏单击实例列表,然后单击目标实例ID。
在实例详情页面单击数据安全。
在SSL页签,打开SSL 加密功能开关。
在开通SSL链路加密对话框,单击开通SSL。
步骤2:下载CA证书
Hologres提供实例CA证书供您下载,当您通过客户端远程连接Hologres实例时,使用实例CA证书可以对实例真伪进行校验。
登录Hologres管理控制台,在左上方选择地域。
在左侧导航栏单击实例列表,然后单击目标实例ID。
在实例详情页面单击数据安全。
在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-ca或verify-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时,可以通过连接配置参数ssl和sslmode控制是否使用SSL传输加密。各参数的取值不同,在Hologres中的结果也不同,如下所示。
Hologres实例是否开启传输加密 | ssl配置 | sslmode配置 | 结果 |
是 | true |
| 可以连接服务器,进行操作,数据传输过程中会使用传输加密。 |
是 | false |
| 可以连接服务器,进行操作,数据传输过程中不会使用传输加密。 |
否 | true |
| 报错,报错信息如下: |
否 | false |
| 可以连接服务器,进行操作,数据传输过程中不会使用传输加密。 |
代码样例如下。
// 设置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();
}