本文介绍配置了SSL链路加密后,如何通过pgAdmin、psql命令行终端以及JDBC连接数据库。
前提条件
操作步骤
pgAdmin客户端SSL连接
pgAdmin客户端是PostgreSQL官方推荐的数据库连接工具,在PostgreSQL官方网站下载并安装PostgreSQL时,将会自动安装pgAdmin 4客户端。下文以pgAdmin 4 V6.2.0
为例,介绍如何连接RDS PostgreSQL实例。
如果您不想安装PostgreSQL,也可以单独下载pgAdmin客户端,仅用于连接远程数据库。
-
启动pgAdmin 4客户端。
说明
高版本客户端首次登录需要设置Master Password用于保护保存的密码和其他凭据。
-
右键单击Servers,选择Register > Server…。
在General页签设置连接名称。
-
选择Connection标签页,输入要连接的实例信息。
参数
说明
Host name/address
RDS PostgreSQL实例的连接地址及对应的端口。
-
若通过内网连接,需输入RDS实例的内网地址和内网端口。
-
若使用外网连接,需输入RDS实例的外网地址和外网端口。
您可以在RDS PostgreSQL实例的数据库连接页面查看。
更多信息,请参见查看或修改连接地址和端口。
Port
Username
RDS PostgreSQL实例的账号和密码。
创建RDS实例的账号请参见创建账号和数据库。
Password
-
-
选择Parameters标签页,添加SSL认证方式相关参数并配置证书。
参数
说明
SSL mode
PostgreSQL数据库开启SSL链路加密后,表示允许客户端通过SSL连接数据库,在客户端连接数据库时,请根据以下场景选择SSL mode参数的取值。
-
数据库未配置客户端访问控制
-
通过SSL连接时,SSL mode选择Require、Verify-CA或Verify-Full。
-
不通过SSL连接时,SSL mode选择Disable。
-
-
数据库配置了客户端访问控制,客户端必须使用SSL连接,SSL mode选择Require、Verify-CA或Verify-Full。
Require、Verify-CA和Verify-Full含义如下:
-
Require:只对数据链路加密,并不验证数据库的真实性。
-
Verify-CA:加密数据链路,同时验证数据库的真实性。
-
Verify-Full:加密数据链路,验证数据库的真实性,同时比对证书内的CN或DNS与连接时配置的数据库连接地址是否一致。
Client certificate
如果完成了配置客户端CA证书,则需要配置此参数,表示客户端证书(client.crt)。
Client certificate key
如果完成了配置客户端CA证书,则需要配置此参数,表示客户端证书私钥(client.key)。
Root certificate
当SSL mode取值为Verify-CA或Verify-Full时,需要配置此参数,表示数据库CA证书路径。
说明
-
本示例中,客户端证书(client.crt)、客户端证书私钥(client.key)和数据库CA证书(ca1.crt)的文件路径请根据实际情况配置。
-
本示例以配置自定义证书为例,除自定义证书外,您也可以配置云端证书,例如将
ca1.crt
替换为ApsaraDB-CA-Chain.pem
。
-
-
单击Save。
若连接信息无误,会出现如下界面,则表示连接成功。
重要
postgres是RDS实例默认的系统数据库,请勿在该数据库中进行任何操作。
psql命令行终端SSL连接
说明
本步骤依赖本地PostgreSQL客户端自带的psql命令行工具,请确保您已安装PostgreSQL客户端,具体请参见PostgreSQL官方文档。
-
在/var/lib/pgsql目录下创建.postgresql文件夹。
mkdir /var/lib/pgsql/.postgresql
-
将如下文件拷贝到.postgresql文件夹中。
-
(可选)客户端证书(client.crt)、客户端证书私钥(client.key):如果在RDS控制台配置了客户端CA证书,则需要配置,获取方法请参见配置客户端CA证书。
-
数据库CA证书:获取方法请参见下载CA证书或生成自签名证书。
cp client.crt client.key ca1.crt /var/lib/pgsql/.postgresql/
说明
-
本示例中,客户端证书(client.crt)、客户端证书私钥(client.key)和数据库CA证书(ca1.crt)的文件路径请根据实际情况配置。
-
本示例以配置自定义证书为例,除自定义证书外,您也可以配置云端证书,例如将
ca1.crt
替换为ApsaraDB-CA-Chain.pem
。
-
-
修改.postgresql文件夹权限。
chown postgres:postgres /var/lib/pgsql/.postgresql/* chmod 600 /var/lib/pgsql/.postgresql/*
-
使用如下命令编辑postgres用户的环境变量。
vim /var/lib/pgsql/.bash_profile
-
输入
i
进入编辑模式,补充如下内容。export PGSSLCERT="/var/lib/pgsql/.postgresql/client.crt" export PGSSLKEY="/var/lib/pgsql/.postgresql/client.key" export PGSSLROOTCERT="/var/lib/pgsql/.postgresql/ca1.crt"
-
使用
Esc
退出编辑模式,然后输入:wq
保存并退出。 -
重新加载环境变量。
source .bash_profile
-
设置连接时客户端对数据库的认证方式。
export PGSSLMODE="verify-full"
PostgreSQL数据库开启SSL链路加密后,表示允许客户端通过SSL连接数据库,在客户端连接数据库时,请根据以下场景选择PGSSLMODE参数的取值。
数据库是否配置客户端访问控制
是否需要通过SSL连接
PGSSLMODE取值
否
是
require、verify-ca或verify-full
否
disable
是
必须使用SSL
require、verify-ca或verify-full
说明
require、verify-ca和verify-full含义如下:
-
require:只对数据链路加密,并不验证数据库的真实性。
-
verify-ca:加密数据链路,同时验证数据库的真实性。
-
verify-full:加密数据链路,验证数据库的真实性,同时比对证书内的CN或DNS与连接时配置的数据库连接地址是否一致。
-
-
连接数据库。
psql -h -U -p -d
各参数在RDS控制台的获取位置:
参数
获取方式
数据库连接地址
加密的连接地址,通过SSL页面中保护主机参数获取。
用户名
通过账号管理页面获取用户名。
端口号
默认5432,如果您修改过,通过数据库连接页面获取。
数据库名
postgres是RDS实例默认的系统数据库,请勿在该数据库中进行任何操作。如果您需要连接RDS实例下创建的其他数据库,可从数据库管理页面获取。
JDBC SSL连接
-
下载如下文件到本地。
-
(可选)客户端证书(client.crt)、客户端证书私钥(client.key):如果在RDS控制台配置了客户端CA证书,则需要获取,获取方法请参见配置客户端CA证书。
-
数据库CA证书:获取方法请参见下载CA证书或生成自签名证书。
-
-
将客户端私钥(client.key)转换为pk8格式。
openssl pkcs8 -topk8 -inform PEM -in client.key -outform der -out client.pk8 -v1 PBE-MD5-DES # 需要输入密码,连接时需要使用 Enter Encryption Password: Verifying - Enter Encryption Password:
警告
该命令必须在应用程序所在设备上执行,使用应用程序所在设备上的openssl命令将私钥转换为pk8格式,否则可能提示如下报错:
-
org.postgresql.util.PSQLException: Could not decrypt SSL key file C:/Users/XXX/XXX/client.pk8
-
org.postgresql.util.PSQLException: SSL error: Received fatal alert: unexpected_message
-
-
以Maven项目为例,在pom.xml中导入PostgreSQL的Maven依赖。
org.postgresql postgresql 42.2.10
-
在业务代码中编写JDBC SSL连接PostgreSQL。
说明
本示例以配置自定义证书为例,除自定义证书外,您也可以配置云端证书,例如将
ca1.crt
替换为ApsaraDB-CA-Chain.pem
。// 设置RDS PostgreSQL实例的连接地址 String hostname = "pgm-bpxxxxx.pg.rds.aliyuncs.com"; // 设置RDS PostgreSQL实例的连接端口 String port = "5432"; // 设置待连接的数据库名 String dbname = "postgres"; String jdbcUrl = "jdbc:postgresql://" + hostname + ":" + port + "/" + dbname+"?binaryTransfer=true"; Properties properties = new Properties(); // 设置连接数据库的用户名 properties.setProperty("user", "username"); //设置连接数据库的密码 properties.setProperty("password", "*****"); // 设置证书存放路径 String path= "D:\ssl\"; // 配置以SSL访问 properties.setProperty("ssl", "true"); //设置证书授权机构的公钥名 properties.setProperty("sslrootcert", path + "/" + "ca1.crt"); //设置客户端证书私钥名 properties.setProperty("sslkey", path + "/" + "client.pk8"); //设置客户端证书名 properties.setProperty("sslcert", path + "/" + "client.crt"); //填写将私钥key格式转换为pk8格式时设置的密码 properties.setProperty("sslpassword", "*****"); // 配置SSL模式,可选值为require、verify-ca、verify-full properties.setProperty("sslmode", "verify-ca"); 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(); }
内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家
阿里云企业补贴进行中: 马上申请
腾讯云限时活动1折起,即将结束: 马上收藏
同尘科技为腾讯云授权服务中心。
购买腾讯云产品享受折上折,更有现金返利:同意关联,立享优惠
转转请注明出处:https://www.yunxiaoer.com/155683.html