本文介紹配置了SSL鏈路加密後,如何通過pgAdmin、psql命令列終端以及JDBC串連資料庫。
前提條件
已開啟SSL鏈路加密,如果未開啟,請參見使用雲端認證快速配置SSL加密或配置自訂認證。
已擷取如下檔案:
操作步驟
pgAdmin用戶端SSL串連
pgAdmin用戶端是PostgreSQL官方推薦的資料庫連接工具,在PostgreSQL官方網站下載並安裝PostgreSQL時,將會自動安裝pgAdmin 4用戶端。下文以pgAdmin 4 V6.2.0為例,介紹如何串連PolarDB PostgreSQL版叢集。
如果您不想安裝PostgreSQL,也可以單獨下載pgAdmin用戶端,僅用於串連遠端資料庫。
啟動pgAdmin 4用戶端。
說明高版本用戶端首次登入需要設定Master Password用於保護儲存的密碼和其他憑據。
按右鍵Servers,選擇Register> Server...。

在General頁簽設定串連名稱。

選擇Connection頁簽,輸入要串連的叢集資訊。

參數
說明
Host name/address
PolarDB PostgreSQL版叢集的串連地址及對應的連接埠。
若通過內網串連,需輸入集群的內網地址和內網連接埠。
若使用外網串連,需輸入集群的外網地址和外網連接埠。
Port
Username
PolarDB PostgreSQL版叢集的帳號和密碼。
Password
選擇Parameters頁簽,添加SSL認證方式相關參數並配置認證。
參數
說明
SSL mode
PolarDB 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。若串連資訊無誤,會出現如下介面,則表示串連成功。

psql命令列終端SSL串連
本步驟依賴本地PostgreSQL用戶端內建的psql命令列工具,請確保您已安裝PostgreSQL用戶端,具體請參見PostgreSQL官方文檔。
在 /var/lib/pgsql 目錄下建立 .postgresql 檔案夾。
mkdir /var/lib/pgsql/.postgresql將如下檔案拷貝到.postgresql 檔案夾中。
(可選)用戶端認證(client.crt)、用戶端認證私密金鑰(client.key)。
資料庫 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 <資料庫名>
JDBC SSL 串連
下載如下檔案到本地。
(可選)用戶端認證(client.crt)、用戶端認證私密金鑰(client.key)。
資料庫 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.pk8org.postgresql.util.PSQLException: SSL error: Received fatal alert: unexpected_message
以Maven專案為例,在pom.xml中匯入PostgreSQL的Maven依賴。
<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.2.10</version> </dependency>在業務代碼中編寫JDBC SSL串連PolarDB PostgreSQL版。
說明本樣本以配置自訂認證為例,除自訂認證外,您也可以配置雲端認證,例如將
ca1.crt替換為ApsaraDB-CA-Chain.pem。// 設定 PolarDB PostgreSQL叢集的串連地址 String hostname = "pe-bpxxxxx.pg.rds.aliyuncs.com"; // 設定 PolarDB 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(); }