為了提高客戶應用端和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以下版本,請您使用自助升級或加入HologresDingTalk交流群反饋,詳情請參見如何擷取更多的線上支援?。
開啟或關閉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();
}