為了提高客戶應用端和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();
}